android - 如何使用 MediaExtractor 和 MediaCodec 设置流式音频?

标签 android media-player android-mediaplayer

我正在尝试流式传输传入的 AMR_NB。我不能直接使用 MediaPlayer,因为它需要一个可搜索的文件。我想使用 MediaCodec,但要使用 MediaCodec,我需要(我想……请纠正我!)MediaExtractor 来给我 presentationTime 之类的东西。真的吗?我可以在没有 MediaExtractor 的情况下使用 MediaCodec 吗?

MediaExtractor 似乎需要可搜索的文件。该文档仅针对其中一个 setDataSource 操作明确说明,但当我尝试使用任何其他操作时,由于查找尝试失败而失败。

那么,我该怎么做才能播放传入的 AMR 流?我知道一个方案,您可以将传入的数据保存到一个文件中,并定期制作该文件的副本以提供给 MediaPlayer,但我真的更愿意找到一个真正诚实的流媒体解决方案。

是否可以在不使用 MediaExtractor 的情况下使用 MediaCodec?如果是这样,我如何找到演示时间和传递给 MediaCodec.createDecoderByType 的字符串?文档说“audio/3gpp”是我想要的,但是当我尝试使用它时,出现以下错误:

codec = MediaCodec.createDecoderByType("audio/3gpp");

01-02 03:59:36.980: E/OMXMaster(21605): A component of name 'OMX.qcom.audio.decoder.aac' already exists, ignoring this one.

所以我也不确定如何访问 MediaCodec。

最佳答案

“我不能直接使用 MediaPlayer,因为它需要一个可搜索的文件”这通常不是真的。我希望你在你的流中尝试它并准确报告发生的情况。

“我可以在没有 MediaExtractor 的情况下使用 MediaCodec 吗?”我对此表示怀疑:我相信它们是为一起使用而设计的。

我已经使用这些组件来播放流。但是,MediaExtractor 具有未记录的限制(据我所知)。所以使用一个小代理服务器来提供它可以消化的东西。我有 1 个线程运行 MediaExtractor,另一个线程从 MediaCodec 获取输出。然后我必须避免死锁并应对同步化。但如果你只想打前锋,那就没那么糟糕了。那么你只剩下如何停止的问题了!

我建议您先尝试 MediaPlayer。否则,如果您足够热衷于尝试 MediaExtractor,我们可以分享我们对它会消化和不会消化的内容的发现。不要认为任何事情都是理所当然的。例如,它似乎可以播放我的 MP3 文件,但无法发现它们的持续时间,也无法搜索它们!

关于android - 如何使用 MediaExtractor 和 MediaCodec 设置流式音频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14532511/

相关文章:

java - 为整个应用设置静音/取消静音复选框

java - 将 ksoap2 响应解析为 int 数组

Android MediaPlayer 错误 (1,-1)?

iphone - 从另一个应用程序控制 iPod?

Android 媒体播放器错误 (-38, 0) "stop called in state 0"

java - 屏幕关闭时继续播放音乐

android - Web View SQLiteException : database is locked

android - 我如何找出当前分配给android :text property of a button view?的字符串资源

android - 如何创建具有 ViewPager 功能的水平 ScrollView ?

android - 无法将 MediaController 添加到 VLC Android SDK