项目需要实时采集音频数据并同步播放,其中一个线程获取定时采集的数据包,数据包大小为128~256的字节,另一线程负责播放,我用如下方式处理:
线程一:
public static DataInputStream mDis;
byte[] b;//b为采集的字节数组,前面代码已经获取
mDis = new DataInputStream( new ByteArrayInputStream(b));
线程二:
共享 mDis;
private static AudioTrack mAudioTrack;
byte[] tempBuffer;
mMinBufferSize = AudioTrack.getMinBufferSize(sampleRateInHz,channelConfig, audioFormat);//计算最小缓冲区
if (Build.VERSION.SDK_INT >= 23) {
mAudioTrack = new AudioTrack.Builder()
.setAudioFormat(new AudioFormat.Builder()
.setEncoding(audioFormat)
.setSampleRate(f)
.setChannelMask(channelConfig)
.build())
.setBufferSizeInBytes(mMinBufferSize +1024)
.build();
} else {
mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, f, channelConfig, audioFormat,mMinBufferSize +1024, MODE_STREAM);
}
while (1) { //
readCount = mDis.read(tempBuffer);
if (readCount == -1 || readCount == AudioTrack.ERROR_INVALID_OPERATION || readCount == AudioTrack.ERROR_BAD_VALUE) {
continue;
}
if (readCount > 0 )
{
if (mAudioTrack.getState() == mAudioTrack.STATE_UNINITIALIZED) {
initData();
}
mAudioTrack.play();
mAudioTrack.write(tempBuffer, 0, readCount);
}
}
运行起来发现声音总是断续的,如果将mDis保存进文件,再执行这段代码,则不会有此问题,特请大侠指导一下,问题出在哪?(尝试先缓存100ms~1s数据再播放,但问题依然)
拜谢!
尝试过调整Buffer大小,问题依旧,并且如果将mDis改为从File里读取,则不会出现断续问题
调整下buffer
https://blog.csdn.net/samyou090/article/details/84049551
你这个问题解决了吗?我这边也遇到这个问题了,和你描述的很相似