gpt4 book ai didi

android - 如何处理 Android MediaCodec 解码器的第一个输出字节缓冲区?

转载 作者:行者123 更新时间:2023-11-29 01:15:05 25 4
gpt4 key购买 nike

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

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

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

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

来自 this answer , this answer , 和 this 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,但我的代码中似乎没有任何变量指示此偏移量。任何人都可以为我阐明这一点吗?

最佳答案

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

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

所以在这个问题的例子中,音频 MediaCodec stuffs* 将完全忽略所有时间戳值。缓冲区 #3 字节 #1 将被 MediaCodec 假定为时间 0,而缓冲区 #4 字节 #1 的时间将从迄今为止处理的字节数推断,被视为 24000 或48000。

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

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

关于android - 如何处理 Android MediaCodec 解码器的第一个输出字节缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40325586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com