我正在尝试使用 Android 的 MediaCodec 套件编写音频重采样器。
我目前正在将 MP3 立体声音频文件输入 MediaExtractor,然后由 MediaCodec 进行解码。源音频的采样率为48000。
我不明白的是我从解码器收到的前四个输出缓冲区:
- 大小 0,时间 0
- 尺寸 0,时间 24000
- 尺寸4312,时间48000
- 尺寸4608,时间72000
- 尺寸4608,时间96000
- etc.
From 这个答案 https://stackoverflow.com/a/37882247/4639640, 这个答案 https://stackoverflow.com/a/22771864/4639640, and 本文 https://developer.apple.com/library/content/documentation/QuickTime/QTFF/QTFFAppenG/QTFFAppenG.html,我相信前两个缓冲区只是传播“编码器延迟”,可能会被丢弃。然而,我列出的第三个缓冲区让我陷入了困境。
对于缓冲区#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 stuff* 并不真正关心与每个缓冲区关联的时间戳。相反,它只是假设字节流中没有漏洞,使用指定的比特率神奇地重新计算每条数据的时间戳。
作为这一假设的支持证据,解决方案之一这个答案 https://stackoverflow.com/a/27854883/4639640只是建议增加时间戳值,而不是实际计算正确的时间戳。
因此,在这个问题的示例中,音频 MediaCodec stuff* 将完全忽略所有时间戳值。 MediaCodec 将假定缓冲区 #3 字节 #1 为时间 0,并且缓冲区 #4 字节 #1 的时间将从迄今为止处理的字节数推断出来,not取为 24000 或 48000。
*即 MediaCodec 对象或一些相关的自定义组件
注意:MediaCodec 视频编码器似乎确实关心时间戳。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)