解決AAC音訊編碼時間戳計算問題

2021-09-24 14:39:49 字數 2605 閱讀 5036

西北望鄉何處是,東南見月幾回圓。

昨風一吹無人會,今夜清光似往年。

本文所涉及到的計算方法和api,為在android環境下。使用audiorecord音訊錄製,mediacodec編碼aac格式音訊,同時使用mediamuxer封裝aac格式音訊檔案。

aac編碼有兩種計算時間戳的方式。第一種:使用pcm的資料量來計算;第二種:計算出aac編碼相應引數配置下,一幀的持續時間,再配合幀數來計算。

aac編碼、mediamuxer生成檔案偽**

mediacodec的aac編碼流程不再贅述,這裡用偽**來代替。主要是為了體現在**何處設定時間戳:

// mediacodec獲得可用輸入佇列

index = codec.dequeueinputbuffer(......)

// 當獲取到可用輸出佇列時,我們將獲取的pcm資料填入

inputbuffer = codec.getinputbuffer(index)

// 將pcm資料(bytearray)填充到inputbuffer

inputbuffer.put(byteaarray——pcm資料)

codec.queueinputbuffer(index, 0, bytearray的size

, presentationtimeus, 0)

在以上的偽**中,presentationtimeus就是需要我們設定時間戳的地方

填充pcm資料後,在得到mediacodec輸出後,使用medamuxer寫入資料,生成aac檔案。

path = 輸出路徑。字尾aac、或者mp4

mediamuxer= mediamuxer(path, mediamuxer.outputformat.muxer_output_mpeg_4)

mediamuxer.addtrack(音訊軌)

mediamuxer.start()

// codec拿到可用的輸出資料。這些資料就是aac格式的音訊資料

id = codec.dequeueoutputbuffer(bufferinfo, 10000)

if(id >= 0)

需要注意的是:使用mediamuxer生成aac音訊檔案時,不需要新增aac頭資訊,直接寫入即可。

mediamuxer寫入檔案時,bufferinfo這個引數就包含了這一幀資料的偏移、以及時間戳等資訊。

audioencoder

使用pcm的資料量來計算

pcm是沒有經過壓縮的純音訊資料,我之前寫過一篇音訊入門的文章初識音訊,記錄了一些pcm相關的常識問題,感興趣的可以去看看。

pcm作為最原始的音訊資料,可以根據大小來計算出時間,先給出公式:

presentationtimeus = 1000000l * (totalbytes / 2) / samplerate
這是配置為取樣率sampletrate、取樣位數為16bit、單聲道的pcm檔案時間戳計算方式

接下來我們來分析以上公式的計算由來:

假設有一段pcm檔案,取樣率為s,取樣位數為n–(一般 取樣位數的選擇有4bit、8bit、16bit、32bit),聲道為單聲道。那麼在1s內,這段pcm的大小為:

size = s * n * 1,單位為bit
眾所周知,1 byte = 8bit,1 short = 16bit。那麼單位時間內,pcm的大小為:

以byte為單位 = s * n * 1 / 8

以short為單位 = s * n * 1 / 16

那麼根據以上就可得到,配置引數為取樣率samplerate、16bit、聲道為1的pcm檔案,當傳入編碼器的總大小達到totalbyte時,時間戳的計算方式:

currents (微妙) = totalbyte / (samplerate * 16 * 1 / 8)

= totalbyte / 2 / samplerate * 1000000l

當然如果選擇以shortarray來承載pcm資料的話,那麼公式則變為:

currents (微妙) = totalshort / (samplerate * 16 * 1 / 16)

= totalshort / sampletrate * 1000000l

使用aac幀時間計算

當編碼器每輸出一次資料,即可視作輸出一幀aac資料。一幀aac原始資料報括1024個sample,那麼aac音訊檔案1s內的幀數為:samplerate / 1024 幀。從而得到一幀aac的持續時間為:

perframetime (微妙) = 1000000l / samplerate / 1024

已知每一幀的持續時間的話,那麼只需要根據當前幀數,即可計算出當前的時間戳。

aac (高階音訊編碼)

aac advanced audio coding 中文名 高階 音訊編碼 出現於1997年,基於 mpeg 2 的音訊編碼技術。由fraunhofer iis 杜比實驗室 at t sony 等公司共同開發,目的是取代 格式。2000年,mpeg 4 標準出現後,aac重新整合了其特性,加入了sb...

十二 AAC音訊編碼介紹

aac advanced audio coding 中文名 高階音訊編碼,出現於1997年,基於mpeg 2的音訊編碼技術。由fraunhofer iis 杜比實驗室 at t sony等公司共同開發,目的是取代 格式。2000年,mpeg 4標準出現後,aac重新整合了其特性,加入了sbr技術和p...

AAC音訊裸碼流時間戳與時間長度的關係

取樣頻率是指將模擬聲音波形進行數位化時,每秒鐘抽取聲波幅度樣本的次數。正常人聽覺的頻率範圍大約在20hz 20khz之間,根據奈奎斯特取樣理論,為了保證聲音不失真,取樣頻率應該在40khz左右。常用的音訊取樣頻率有8khz 11.025khz 22.05khz 16khz 37.8khz 44.1k...