3

我正在尝试解决 Android OpenSLES 中的以下问题。

OpenSLES 规范说明如下:

http://www.khronos.org/registry/sles/specs/OpenSL_ES_Specification_1.0.1.pdf - 8.12

当播放器处于由 SLPlayItf 接口控制的 SL_PLAYSTATE_PLAYING 状态时[参见第 8.32 节],添加缓冲区将隐式开始播放。在由于队列中的缓冲区不足而导致饥饿的情况下,音频数据的播放将停止。播放器保持在 SL_PLAYSTATE_PLAYING 状态。附加缓冲区排队后,音频数据的播放将恢复。请注意,排队缓冲区的不足会导致音频数据流中出现可听间隙。在播放器不处于播放状态的情况下,添加缓冲区不会开始音频播放。

唉,一旦我们进入 android:

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

根据平台实现,解码可能需要不能闲置的资源。因此,不建议因未能提供足够数量的空 PCM 缓冲区而使解码器饿死,例如通过从 Android 简单缓冲区队列回调返回而不将另一个空缓冲区入队。解码器饥饿的结果未指定;实现可以选择丢弃解码的 PCM 数据、暂停解码过程,或者在严重的情况下终止解码器。

这种非规范行为完全停止了我的项目进展,我不知道如何最好地解决它。将整个文件解码为内存或磁盘中的 pcm 不是一种选择,我真的需要这是一个流式解决方案。对此的任何帮助将不胜感激

4

1 回答 1

0

似乎没有办法解决这个问题。其他项目似乎使用较低级别的 api(例如 libstagefright)进行解码。该方法确实可以让您获取数据

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

这是 ndk google 群里关于这个主题的讨论

于 2014-09-17T07:17:14.037 回答