2016-03-26 236 views
0

我使用以下定义创建AudioTrack。audioTrack.stop不会停止播放音频

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); 

当audioTrack结束时,会调用以下内容来停止音频并重置头部位置。

private void resetAudioPlayback() { 
     ViewGroup.LayoutParams params = playbackView.getLayoutParams(); 
     params.width = 0; 
     playbackView.setLayoutParams(params); 
     audioTrack.stop(); 
     audioTrack.reloadStaticData(); 
     playImage.animate().alpha(100).setDuration(500).start(); 
    } 

上面的代码在Android 5.1中工作得很好。但是我遇到了4.4.4的问题。 audioTrack.stop()被调用,但音频不会停止,因为reloadStaticData将音频倒回到起始位置,它将重放音频。但使用5.1时,它会正确停止,并将缓冲区重置回播放开始,并且按下播放按钮时,从开始播放。

有人可以帮我我怎么可以这个问题与Android 4.4.4?

回答

0

我不完全确定这是否能解决您的问题,但请考虑使用pause()而不是stop()。通过文档,MODE_STREAM的stop()实际上将继续播放写入的最后一个缓冲区的其余部分。您正在使用MODE_STATIC,但它可能值得尝试。另外(可能不相关),考虑write()返回的是写入的字节数,所以你不应该依赖每次填充整个AudioTrack缓冲区的单个写操作。 write()应该像OutputStream写入一样对待,因为它可能不会写入它给出的缓冲区的全部内容,所以最好编写一个循环并检查每次调用write()时已写入了多少内容,然后继续从缓冲区阵列中的新索引写入,直到所有写入的总和等于缓冲区的长度。

+0

实际上,我已经尝试过了,audioTrack.pause和flush,事情是我们调用reloadStaticData来回放曲目并为下一次播放做好准备。在这里,如果我调用暂停和刷新,reloadStaticData不倒带音频。 – User