如何处理Android MediaCodec解码器的第一个输出字节缓冲区?
我正在尝试使用Android的MediaCodec套件编写一个音频重采样器 我目前正在将MP3立体声音频文件输入MediaExtractor,然后由MediaCodec解码。源音频的采样率为48000 我不明白的是我从解码器接收到的前四个输出缓冲区:如何处理Android MediaCodec解码器的第一个输出字节缓冲区?,android,audio,android-mediacodec,mediaextractor,Android,Audio,Android Mediacodec,Mediaextractor,我正在尝试使用Android的MediaCodec套件编写一个音频重采样器 我目前正在将MP3立体声音频文件输入MediaExtractor,然后由MediaCodec解码。源音频的采样率为48000 我不明白的是我从解码器接收到的前四个输出缓冲区: 大小0,时间0 尺寸0,时间24000 尺寸4312,时间48000 尺寸4608,时间72000 尺寸4608,时间96000 等等 从,和,我相信前两个缓冲区仅仅是传播的“编码器延迟”,可能只是被抛出。然而,我列出的第三个缓冲区将我抛出一个循环
((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,但我的代码中的任何变量似乎都没有表示这个偏移量。有人能帮我解释一下吗?据我所知,音频媒体编解码器*并不真正关心每个缓冲区的时间戳。相反,它只是通过假设字节流中没有漏洞,使用指定的比特率神奇地重新计算每段数据的时间戳 作为这一假设的一个支持证据,中的一个解决方案只是建议增加时间戳值,而不是实际计算正确的时间戳 因此,在这个问题的示例中,audio MediaCodec Stuff*将完全忽略所有时间戳值。MediaCodec假定缓冲区#3字节#1为时间0,缓冲区#4字节#1的时间将根据迄今为止处理的字节数推断出来,不取24000或48000 *即MediaCodec对象或某些相关的自定义组件
注意:MediaCodec视频编码器似乎确实关心时间戳。您是否能够使用MediaCodec API编写音频采样器?