【问题标题】:How to set up Streaming audio with MediaExtractor and MediaCodec?如何使用 MediaExtractor 和 MediaCodec 设置流式音频?
【发布时间】:2013-01-26 00:37:11
【问题描述】:

我正在尝试流式传输传入的 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。

【问题讨论】:

  • 有些东西必须识别 NAL (stackoverflow.com/a/24890903/294248) 单位。如果您从 .mp4 开始,这意味着拆分基本流,然后将视频流解析为数据包。通常 MediaExtractor 会这样做。 MediaExtractor 和 MediaCodec 不相互通信;您的代码将 ME 的输出传递给 MC(参见例如 bigflake.com/mediacodec 上的所有示例)。如果您想用您自己的查找 NAL 单位和 PTS 值的代码替换 ME,您可以。 MediaExtractor 的源代码是 AOSP 的一部分,因此您可以克隆它并根据需要进行修改。

标签: android media-player android-mediaplayer


【解决方案1】:

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

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

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

我建议您先尝试 MediaPlayer。否则,如果您有足够的热情尝试使用 MediaExtractor,我们可以分享我们对它会消化和不会消化什么的发现。不要把任何事情视为理所当然。例如,它似乎会播放我的 MP3 文件,但无法发现它们的持续时间,或寻找它们!

【讨论】:

  • 我确实在我的流上尝试过:结果是“搜索”失败时“设置数据源”失败。我给它提供了从套接字获取的文件描述符。你试过这个吗?我遇到的许多其他堆栈溢出讨论似乎都表明它通常是正确的。
  • 我也遇到过这种情况,我希望 MediaExtractor 可以将字节数组/缓冲区作为数据源。
猜你喜欢
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 2013-12-26
  • 2019-10-19
  • 1970-01-01
  • 2016-04-25
相关资源
最近更新 更多