我正在创建具有以下定义的AudioTrack。
clear all
当audioTrack完成时,会调用以下内容来停止音频并重置头部位置。
audioTrack = new AudioTrack(
AudioManager.STREAM_MUSIC,
44100,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffer.length * 2,
AudioTrack.MODE_STATIC);
audioTrack.write(buffer, 0, buffer.length);
audioTrack.setPositionNotificationPeriod(500);
audioTrack.setNotificationMarkerPosition(buffer.length);
progressListener = new PlaybackProgress(buffer.length);
audioTrack.setPlaybackPositionUpdateListener(progressListener);
以上代码适用于Android 5.1。但是我遇到了4.4.4的问题。调用audioTrack.stop()但音频未停止,因为reloadStaticData将音频重新回到起始位置,它会重放音频。但是使用5.1时,它会正确停止并将缓冲区重置回播放开始,按下播放按钮时,从头开始播放。
有人可以帮我解决Android 4.4.4的这个问题吗?
答案 0 :(得分:0)
我不确定这是否可以解决您的问题,但请考虑使用pause()而不是stop()。通过文档,MODE_STREAM的stop()实际上将继续播放写入的最后一个缓冲区的剩余部分。您正在使用MODE_STATIC,但可能值得尝试。
另外(可能不相关),考虑write()返回写入的字节数,因此您不应该依赖于每次填充AudioTrack的整个缓冲区的单个写入。 write()应该被视为一个OutputStream写入,因为它可能不会写入给定的缓冲区的全部内容,因此编写一个循环并检查每次写入调用写入了多少(更好) ),然后继续从缓冲区数组中的新索引写入,直到所有写入的总和等于缓冲区的长度。