我正在研发以音频播放为中心的Android应用,并且我遇到了一些我怀疑可能是某些设备,操作系统版本或本机缓冲区固有的不稳定行为(音频卡顿和打嗝)设备的大小。
关于我的实现 - 我需要低延迟,因此我在OpenSL ES回调中处理我的音频,并使用128个样本的相当小的缓冲区大小来排队缓冲区。我在回调期间进行mp3解码,但是在我的环形缓冲区大小的情况下,我不需要在每个回调周期内进行解码。
我使用远程测试服务来衡量各种设备和操作系统版本的音频播放质量,以及我发现的一些不一致的例子。
就个人而言,我有一个带有4.1.2的Galaxy S3和带有4.4的Nexus 5,并且没有遇到过这些问题。我也有一些较旧的2.3.7设备,这些问题没有发生(2010 Droid Incredible,LG Optimus Elite)。
我相信我不会过度使用处理器,因为我可以在较旧的Gingerbread设备上运行它。
我的问题:
感谢。
答案 0 :(得分:0)
增加缓冲区大小可解决有关失真和噪声的一些问题。是的,当SDK高于4.2时,您可以从硬件中检测本机缓冲区大小:
String size = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
但另一种获取Audio Record最小缓冲区大小的方法是:
int minForAudioRecord = AudioRecord.getMinBufferSize(8000,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);
对于音频播放:
int minForAudioTrack = AudioTrack.getMinBufferSize(8000,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);
如果您的SDK版本大于或等于4.2,那么您可以获得音频的首选采样率。
String rate = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
我发现三星设备在处理这些事情时是最糟糕的,因为每个设备都有不同的处理音频驱动程序的方法。