题
我正在尝试在Android Opensles中围绕以下问题工作。
opensles规范说明:
我们到达Android后,唉:http://www.khronos.org/registry/sles/规格/ opensl_es_specification_1.0.1.pdf - 8.12
当播放器处于sl_playstate_playing状态时,这是 由SLPLAYITF接口控制[参见第8.32节],添加 缓冲区将隐式开始播放。在饥饿到期的情况下 队列中的缓冲区不足,音频数据的播放停止。 播放器仍然存在于SL_PLAYSTATE_PLAYING状态。在排队时 附加缓冲区,播放音频数据恢复。注意 排队缓冲区的饥饿导致音频数据中的可听间隙 溪流。在玩家不在播放状态的情况下, 添加缓冲区不会启动音频播放。
http://mobilepearls.com/labs/ native-android-api / ndk / docs / opensles / index.html - 解码到PCM的音频
取决于平台实现,解码可能需要 无法闲置的资源。因此,不建议 通过未能提供足够数量的空的解码器来饿死解码器 PCM缓冲器,例如通过从Android简单缓冲区队列返回 回调而不延长另一个空缓冲区。的结果 解码器饥饿是未指明的;实施可能会选择 丢弃解码的PCM数据,暂停解码过程,或暂停 严重病例终止解码器。
这种非规格行为在我的项目中完全停止了进展,我丢失了如何最好地解决它。将整个文件解码到存储器中的PCM或磁盘上不是一个选项,我真的需要它是一个流的解决方案。对此的任何帮助都将是大量赞赏的
解决方案
似乎没有解决这个问题。其他项目似乎使用较低级别的API(例如LibStageFright)来进行解码。该方法确实让您获得数据
[编辑] 饥饿问题没有办法。Android不遵守规范。基本上你需要缓冲到内存中,并确保在需要控制数据流时使用暂停和恢复来解码。