Android AudioTrack getPlaybackHeadPosition始终返回0

时间:2019-02-21 03:32:29

标签: java android audio audiotrack

我正在编写一些旨在获取Wave文件的代码,并以模式流将其写到AudioTrack中。这是使AudioTrack流模式正常工作的最低可行测试。

但是一旦我将一些音频缓冲区写入AudioTrack,然后调用play(),方法getPlaybackHeadPosition()就会连续返回0。

编辑:如果我忽略可用的帧检查,而只是不断地将缓冲区写入AudioTrack,则write方法将返回0(在第一次缓冲区写入之后),表明它根本不再写入任何音频。因此,看来AudioTrack只是不想开始播放。

我的代码正确启动了音轨。 play方法不会引发任何异常,因此我不确定出了什么问题。

单步执行代码时,我所做的一切完全符合我的预期,因此我在考虑某种方式将AudioTrack配置错误。

我正在模拟器上运行,但是我认为这不是问题。

我正在使用的WavFile类是经过审查的类,已经在许多Java项目中可靠地运行,并且经过测试可以正常工作。

观察以下日志写入,这是较大代码段的摘录。此日志写入从未成功...

* def products = [{"ProductCode":"a","UnitPrice":100.0},{ {"ProductCode":"b","UnitPrice":200.0}]

* def inventory = [{"ProductCode":"b","UnitPrice":200.0},{ {"ProductCode":"a","UnitPrice":100.0}]

* match products == inventory

..

                if (headPosition > 0)
                    Log.e("headPosition is greater than zero!!");

1 个答案:

答案 0 :(得分:1)

根据documentation

  

出于可移植性,应用程序应将数据路径预备到写入数据所允许的最大值,直到write()方法返回较短的传输计数为止。这样可以使play()立即启动,并减少发生欠载的可能性。

经过严格的阅读,这可能被认为与先前的说法相矛盾:

  

...您可以选择在调用play()之前准备数据路径,方法是将 up写入 bufferSizeInBytes ...

(强调我的意思),但意图很明确:您应该先简短地写信。

这只是开始玩。一旦发生,您实际上可以使用 getPlaybackHeadPosition()确定何时有更多可用空间。我已经在许多不同的设备/ API级别的我自己的代码中成功使用了该技术。

顺便说一句:您应该准备getPlaybackHeadPosition()仅大幅度地更改(如果我没记错的话,它就是getMinBufferSize()/2)。这是系统可提供的最大分辨率。 onMarkerReached()不能做得更好。