【问题标题】:Android AudioTrack write blocks for the whole period of playbackAndroid AudioTrack 为整个播放周期写入块
【发布时间】:2016-07-10 11:41:11
【问题描述】:

我正在使用AudioTrack 类播放原始声音数据流:

AudioTrack audioTrack;
int sampleRate = 11025;
int channelConfigIn = AudioFormat.CHANNEL_IN_MONO;
int channelConfigOut = AudioFormat.CHANNEL_OUT_STEREO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
.....
int bufferSize = AudioTrack.getMinBufferSize(sampleRate,channelConfigOut,audioFormat);
audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,sampleRate,channelConfigOut,audioFormat,bufferSize,AudioTrack.MODE_STREAM);
    audioTrack.play();

然后在一个单独的线程上:

while(true)
{
    short [] buffer = new short[14500];
    //fill buffer with sound data
    long time = System.currentTimeMillis();
    audioTrack.write(buffer,0,14500);
    Log.i("time",(System.currentTimeMillis() - time) + "");
}

我的问题是日志总是显示write方法阻塞大约0.6秒,与播放的声音长度(14500个样本)相同,而且手机在播放过程中没有响应,主线程几乎不能做任何任何人都可以帮助的事情......

【问题讨论】:

标签: android audio audiotrack


【解决方案1】:

您正在使用write() 方法的阻塞版本。您可以改用write(float[],int,int,int),将 WRITE_NON_BLOCKING 作为第 4 个参数传递,但这只会写入播放缓冲区中可以容纳的尽可能多的数据。我通常更喜欢你已经拥有的方法(专门写一个线程)。您应该期望每次调用都会阻塞;毕竟,播放缓冲区只能容纳这么多数据,为了腾出更多空间,必须播放声音(这需要时间)。在您选择的采样率下,14500 个样本大约是 1.3 秒的声音,所以我猜您每次填充 buffer 大约需要 0.7 秒。

根据提供的代码,我无法判断您的 UI 线程为什么没有响应。

【讨论】:

  • 谢谢您的回复,首先您建议的方法需要apk 23,所以我知道它存在但我没有使用它,第二我确实使用HandlerThread解决它,似乎优先级线程是它的原因。无论如何,似乎存在累积的延迟,导致播放随着时间的推移而延迟
猜你喜欢
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多