2016-10-30 70 views
2

我正在尝试使用Android的MediaCodec套件编写音频重采样器。如何处理Android MediaCodec解码器的第一个输出ByteBuffers?

我目前正在将一个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,然后在72000us标记之前暂时停顿,此时它开始连续播放,没有中断。

似乎更有可能在缓冲区#3的数据之前有296个隐藏的0,但是这个偏移量似乎没有被我的代码中的任何变量指示。任何人都可以为我阐明这一点吗?

回答

1

据我所知,音频MediaCodec的东西*并不真正在意什么时间戳与每个缓冲区相关联。相反,它只是通过假定在字节流中没有漏洞,使用指定的比特率重新计算每个数据块的时间戳应该是什么。作为这一假设的证据的支持部分,this answer中解决方案的其中一个部分只是建议递增时间戳值,而不是实际计算正确的时间戳。

所以在这个问题的例子中,音频MediaCodec stuffs *会完全忽略所有的时间戳值。缓冲器#3字节#1将由MediaCodec被假定为时间为0,以及用于缓冲器#4字节#1中的时间将从迄今处理的字节数来推断和不采取如24000或48000

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

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

相关问题