我正在尝试在Android Opensles中围绕以下问题工作。

opensles规范说明:

http://www.khronos.org/registry/sles/规格/ opensl_es_specification_1.0.1.pdf - 8.12

当播放器处于sl_playstate_playing状态时,这是 由SLPLAYITF接口控制[参见第8.32节],添加 缓冲区将隐式开始播放。在饥饿到期的情况下 队列中的缓冲区不足,音频数据的播放停止。 播放器仍然存在于SL_PLAYSTATE_PLAYING状态。在排队时 附加缓冲区,播放音频数据恢复。注意 排队缓冲区的饥饿导致音频数据中的可听间隙 溪流。在玩家不在播放状态的情况下, 添加缓冲区不会启动音频播放。

我们到达Android后,唉:

http://mobilepearls.com/labs/ native-android-api / ndk / docs / opensles / index.html - 解码到PCM的音频

取决于平台实现,解码可能需要 无法闲置的资源。因此,不建议 通过未能提供足够数量的空的解码器来饿死解码器 PCM缓冲器,例如通过从Android简单缓冲区队列返回 回调而不延长另一个空缓冲区。的结果 解码器饥饿是未指明的;实施可能会选择 丢弃解码的PCM数据,暂停解码过程,或暂停 严重病例终止解码器。

这种非规格行为在我的项目中完全停止了进展,我丢失了如何最好地解决它。将整个文件解码到存储器中的PCM或磁盘上不是一个选项,我真的需要它是一个流的解决方案。对此的任何帮助都将是大量赞赏的

有帮助吗?

解决方案

似乎没有解决这个问题。其他项目似乎使用较低级别的API(例如LibStageFright)来进行解码。该方法确实让您获得数据

[编辑] 饥饿问题没有办法。Android不遵守规范。基本上你需要缓冲到内存中,并确保在需要控制数据流时使用暂停和恢复来解码。

这是关于NDK Google集团的主题的讨论

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top