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

如何处理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 等等 从,和,我相信前两个缓冲区仅仅是传播的“编码器延迟”,可能只是被抛出。然而,我列出的第三个缓冲区将我抛出一个循环

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

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

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

  • 大小0,时间0
  • 尺寸0,时间24000
  • 尺寸4312,时间48000
  • 尺寸4608,时间72000
  • 尺寸4608,时间96000
  • 等等
  • 从,和,我相信前两个缓冲区仅仅是传播的“编码器延迟”,可能只是被抛出。然而,我列出的第三个缓冲区将我抛出一个循环

    对于缓冲区#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,但我的代码中的任何变量似乎都没有表示这个偏移量。有人能帮我解释一下吗?

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

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

    因此,在这个问题的示例中,audio MediaCodec Stuff*将完全忽略所有时间戳值。MediaCodec假定缓冲区#3字节#1为时间0,缓冲区#4字节#1的时间将根据迄今为止处理的字节数推断出来,取24000或48000

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


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

    您是否能够使用MediaCodec API编写音频采样器?