我正在尝试解决Android OpenSLES中的以下问题。
OpenSLES规范说明如下:
http://www.khronos.org/registry/sles/specs/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不是一种选择,我真的需要将其作为流媒体解决方案。任何有关这方面的帮助都将受到大力赞赏
答案 0 :(得分:0)
似乎没有解决这个问题的方法。其他项目似乎使用较低级别的apis(例如libstagefright)进行解码。该方法可以让您获得数据
[编辑] 围绕饥饿问题没有办法解决。 Android只是不遵守规范。基本上你需要缓冲到内存中,并确保在需要控制数据流时使用暂停和恢复解码。