2016-10-30 43 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視頻編碼器似乎並不關心時間戳。

相關問題