我正在编写一些旨在获取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!!");
答案 0 :(得分:1)
出于可移植性,应用程序应将数据路径预备到写入数据所允许的最大值,直到write()方法返回较短的传输计数为止。这样可以使play()立即启动,并减少发生欠载的可能性。
经过严格的阅读,这可能被认为与先前的说法相矛盾:
...您可以选择在调用play()之前准备数据路径,方法是将 up写入
bufferSizeInBytes
...
(强调我的意思),但意图很明确:您应该先简短地写信。
这只是开始玩。一旦发生,您实际上可以使用
getPlaybackHeadPosition()
确定何时有更多可用空间。我已经在许多不同的设备/ API级别的我自己的代码中成功使用了该技术。
顺便说一句:您应该准备getPlaybackHeadPosition()
仅大幅度地更改(如果我没记错的话,它就是getMinBufferSize()/2
)。这是系统可提供的最大分辨率。 onMarkerReached()
不能做得更好。