问题标签 [audiotrack]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - SoundPool 对象保留了多少本机音轨?
如果我创建一个具有 20 个并发流的 SoundPool 对象
此 SoundPool 对象将保留多少本机 AudioTrack 对象?
SoundPool 的本机实现是开源的吗?我在哪里可以查看它?
java - 您如何确定 Android 上的音频延迟 (AudioTrack)?
我有一个应用程序,我在其中使用AudioTrack
流模式播放动态生成的音频。该应用程序不必立即响应输入,因此延迟问题不会为程序的那一侧困扰我。
问题是我有一个动画需要尽可能精确地与音频“同步”,而且似乎不同的设备在AudioTrack
停止阻塞write()
呼叫并要求更多数据之间的时间不同,而当该音频是从扬声器播放的。
AudioTrack
我目前的解决方案让我大部分时间都在那里 - 我计算了到目前为止我传入的帧数,并将其与getPlaybackHeadPosition()
. 它看起来基本上像:
但是,仍有一些延迟getPlaybackHeadPosition()
似乎无法解释因设备而异。
有没有办法轮询系统的 AudioTrack 的延迟?
android - 在 Android 上分析 AudioTrack(Visualizer 的替代品)
我想分析我的 Android 应用程序录制的麦克风声音。
不幸的是,Visualizer只能在当前正在播放的AudioTrack上工作。目前我正在使用 AudioRecord 进行录制,并将数据复制到可视化工具正在监听的 AudioTrack 中。但是这种架构会导致可怕的播放记录循环。
一种解决方法是在录制时将 AudioTrack 的音量调到最低,但这听起来根本不是一个好的解决方案。
是否有任何替代Visualizer类的方法可以从记录的轨道中捕获 FFT 数据?
android - Android GC和AudioTrack,GC线程卡在dlmalloc_inspect_all和AudioTrack卡住..tryLock
快速背景:该应用程序是一个音频播放器,ffmpeg 编译为原生共享对象并用于解码,单独的原生库编译为共享对象并用于音频处理,AudioTrack 用于输出处理后的音频。所有音频功能都封装在一个类中,该类使用静态类变量来确保只有一个实例。在这个类中:一个java线程用于从ffmpeg获取数据,通过原生处理库完成音频处理。本机处理调用需要 2 到 3.5 毫秒,具体取决于配置。处理后的音频位于由读取和写入计数信号量管理的 ByteBuffer 数组中。一个单独的 java 线程 ByteBuffer.get 一个音频块,减少 sem 计数并将 byte[] 数据发送到 AudioTrack。AudioTrack 配置为流模式,缓冲区大小为 getMinBufferSize 返回的大小的 2 倍。音频数据以每通道 512 个样本块的形式通过系统,对于立体声,2048 字节。
问题:一切都很好,随机的时间,然后一切都停止了,没有崩溃,没有 SIGSEG,应用程序只是消耗了大部分 CPU 并且什么都不做。GUI 没有响应,ADT 中的调试器失去了与应用程序的连接。使用 shell 和 top -m 10 -t,我可以看到应用程序 GC 线程正在消耗 49%,我假设是单核。有时,AudioTrack 会以低利用率弹出。与应用程序相关的其他线程从未出现在前 10 名中。这在 4.2.2 上发生得非常快,在 4.0.1 和 4.1.1 上不太确定。
为了解决:我使用 libc.debug.malloc 10 来验证本机内存使用情况。发现并修复了一些泄漏,但根据 libc,没有任何内容超出缓冲区的末端。安装 ByteBuffers 作为解决方法的尝试,之前使用了 byte[] 并表现出相同的问题。我删除了 AudioTrack 并替换为基于 OpenSL ES 的本机代码,结果相同。毫不奇怪,因为 OpenSL ES 使用了 AudioTrack。Log.i 样式的调试消息显示写入 AudioTrack 线程停止消耗数据,ffmpeg 读取和处理线程继续,直到 ByteBuffer 数组填满。我已将 System.gc() 调用放在战略位置,有时需要更长时间,但仍会出现挂起。我在 THREAD_PRIORITY_URGENT_AUDIO 设置了“已处理的音频数据到 AudioTrack”线程的优先级,没有观察到任何变化。
我已经广泛搜索了类似问题的实例,但发现的信息很少。我为 Eclipse/ADT 安装了 ARM 的 DS-5 调试功能。该工具能够保持与旋转应用程序的连接。暂停表明 GC 线程处于 dlmalloc_inspect_all 内部的无限循环中,可能试图回收或合并本机堆。AudioTrack 线程在暂停时处于 nanosleep,从 usleep 调用,AudioTrack.cpp 中只有两个 this 实例,一个在 processAudiobuffer 中,另一个在 tryLock 中。tryLock 从 stepServer 和 framesReady 调用。我无法从挂起的应用程序中获取堆栈转储,kill -3 在挂起 #1 threadid=2 (pcf=0) 时产生自旋,该应用程序从未被声明为 ANR,因此没有 /data/ANR/traces.txt。
我的概要 - GC 正在做它的事情并检查本机堆。根据文档,GC 不会在 JNI 调用中间暂停。但是它必须暂停 AudioTrack 线程,并且当本机堆检查与 AudioTrack 的 processAudioBuffer 的执行同时发生时,就会发生死锁。
问题: 1) 我肯定会受益于原生组件的堆栈跟踪,缺少开发平台和 JTAG 调试器,还有其他方法可以尝试吗?2) 有没有人看到 GC 和 AudioTrack 进入死锁路线的任何问题?3) GC dlmalloc_inspect_all 调用是否有可能被抑制或以其他方式同步以避免此问题?4)对解决这个问题有什么建议吗?
如果有帮助,我很乐意发布一些代码
android - 安卓声音合成
我正在尝试使用 AudioTrack 类播放合成声音(基本上是 2 个正弦波和一些噪音)。它似乎与 javax.sound.sampled 中的 SourceDataLine 没有什么不同,但合成真的很慢。即使对于 ARM 标准,认为 32768 个样本(16 位,立体声,总共 65536 个)需要超过 1 秒才能在 Nexus 4 上呈现(使用 System.nanotime() 测量,写入 AudioTrack 除外)是不现实的。合成部分几乎与此http://audioprograming.wordpress.com/2012/10/18/a-simple-synth-in-android-step-by-step-guide-using-the-java-sdk/相同,唯一的区别是我播放立体声(我不能将其降低为单声道,因为它是双耳音调)。
有任何想法吗?我能做些什么?
提前致谢
android - 如何在 Android 中获取 AudioTrack 的音量?
我可以使用设置 audioTrack 的音量track.setStereoVolume(a,b);
但我找不到获得音量的方法,无论是喜欢getStereoVolume()
还是setOnVolumeChangedHandler(...)
如何跟踪音量?
android - 如何在 Android 上增加音量
我正在使用 AudioTrack 流式传输音频:
在某些奇迹方式中,用户界面无需执行任何操作即可工作,当我按下音量按钮时,用户界面的音量会上下波动,但即使音量为 100%,它也非常低。请指教。10xs,那鸿
编辑:这与以前的帖子不同,因为设备显示音量为 100%,但事实并非如此!
android - 播放通过 UDP 套接字接收的流时出现口吃播放
我想将音频流从 PC(C++ 应用程序,使用 FMOD-API 解码音频数据并通过 UDP 套接字发送)发送到 android 设备。通信已经开始,我可以在 android 上听到“声音”(100 毫秒的声音,然后是 900 毫秒的静音,交替)。
我不知道为什么声音会断断续续 - 在 PC 上,相同的音频流可以很好地播放。我认为问题出在android..
这是代码:
我确定正确设置了“AudioTrack”对象,设置与我在 c++ 应用程序中的设置进行比较。
另一个步骤是在临时“byte[]”变量中预缓冲接收到的套接字数据,并在达到缓冲区“iAudioBufSize”的大小时将其写入 AudioTrack 对象。这没有帮助。
有什么想法吗?谢谢
[编辑] C++ 应用程序代码,使用 FMOD API 示例的示例“手动解码”:
android - Android:如何获取当前活动的音频会话 ID
我需要获取当前的活动音频会话 ID 以在其上附加一些音频效果。这个会话不一定是由我的进程创建的。
是否有audioTrack或其他东西提供的接口来实现这个功能?
android - 只是在音轨播放时听到咔哒声
我正在尝试从麦克风录制声音然后播放,但我这里只有咔哒声。AudioTrack 和 AudioRecord 的设置相同,并且初始化正确。这是我的代码:
}
有人知道为什么吗?
这是完整的源代码: https ://www.dropbox.com/s/h38cs9vjkztyyro/AudioTesting.java