【问题标题】:How do I handle first output ByteBuffers of Android MediaCodec decoder?如何处理 Android MediaCodec 解码器的第一个输出 ByteBuffers?
【发布时间】:2017-01-23 06:18:08
【问题描述】:

我正在尝试使用 Android 的 MediaCodec 套件编写音频重采样器。

我目前正在将 MP3 立体声音频文件输入 MediaExtractor,然后由 MediaCodec 解码。源音频的采样率为48000。

我不明白的是我从解码器收到的前四个输出缓冲区:

  1. 尺寸0,时间0
  2. 大小0,时间24000
  3. 尺寸4312,时间48000
  4. 尺寸4608,时间72000
  5. 尺寸4608,时间96000

this answerthis answerthis article,我相信前两个缓冲区只是传播“编码器延迟”,可能会被丢弃。但是,我列出的第三个缓冲区让我陷入了循环。

对于缓冲区 #4(及以后),计算结果如下:

((4608 bytes) / (2 bytes/sample) / (2 channels)) 
    / ((48,000 samples/sec) / (1,000,000 us/sec))
= 24,000 us (i.e. the change in time between buffers)

但是缓冲区 #3 发生了什么?对数据的直截了当表明,音频在 48000 us 时间开始播放,然后在 72000 us 标记之前暂停,此时它开始连续播放,没有中断。

似乎更有可能在缓冲区#3 的数据之前有 296 个隐藏的 0,但我的代码中的任何变量似乎都没有表明这个偏移量。谁能帮我解释一下?

【问题讨论】:

  • 您是否能够使用媒体编解码器 API 编写音频采样器?

标签: android audio android-mediacodec mediaextractor


【解决方案1】:

据我所知,音频 MediaCodec 的东西* 并不真正关心与每个缓冲区相关联的时间戳。相反,它只是通过假设字节流中没有漏洞,使用指定的比特率神奇地重新计算每条数据的时间戳。

作为支持这一假设的证据,this answer 中的解决方案之一只是建议增加时间戳值,而不是实际计算正确的时间戳。

因此,在此问题的示例中,音频 MediaCodec stuffs* 将完全忽略所有时间戳值。缓冲区#3 字节#1 将被 MediaCodec 假定为时间 0,缓冲区#4 字节#1 的时间将从目前处理的字节数推断,取为 24000 或48000。

*即一个 MediaCodec 对象或一些相关的自定义组件

注意:MediaCodec 视频编码器似乎确实关心时间戳。

【讨论】:

    猜你喜欢
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    相关资源
    最近更新 更多