打包AAC碼流到FLV檔案

2021-07-09 13:35:11 字數 3526 閱讀 2483

aac編碼後資料打包到flv很簡單。

1. flv音訊tag格式

位元組位置    意義

0x08,                        // 0,       tagtype

0xzz, 0xzz, 0xzz,            // 1-3,     datasize,    

0xzz, 0xzz, 0xzz, 0xzz,      // 4-6, 7   timestamp | timestampextend    

0x00, 0x00, 0x00,            // 8-10,    streamid

0xzz,                        // 11,      audiotag header  

0x0b,                        // 12,      aacpackettype    (如果不是aac編碼 沒有這個位元組)       

0xzz ... 0xzz                // 音訊資料

2. audiotagheader

音訊tag頭一般由乙個位元組定義(aac用兩個位元組),第乙個位元組的定義如下:

音訊格式 4bits | 取樣率 2bits | 取樣精度 1bits | 聲道數 1bits|

音訊格式 4bits

0x00 = linear pcm, platform endian

0x01 = adpcm

0x02 = ***

0x03 = linear pcm, little endian

0x04 = nellymoser 16-khz mono

0x05 = nellymoser 8-khz mono

0x06 = nellymoser

0x07 = g.711 a-law logarithmic pcm

0x08 = g.711 mu-law logarithmic pcm

0x09 = reserved

0x0a = aac

0x0b = speex

0x0e = *** 8-khz

0x0f = device-specific sound

取樣率 2bits

0 = 5.5-khz

1 = 11-khz

2 = 22-khz

3 = 44-khz

對於aac總是3,這裡看起來flv不支援48k aac,其實不是的,後面還是可以定義為48k。

取樣精度 1bits

0 = snd8bit

1 = snd16bit

壓縮過的音訊都是16bit

聲道數 1bits

0 = sndmono

1 = sndstereo

對於aac總是1

綜上,如果是aac 48k 16位元精度 雙聲道編碼,該位元組為 0b1010 1111 = 0xaf。

看第2個位元組,如果音訊格式aac(0x0a),audiotagheader中會多出1個位元組的資料aacpackettype,這個欄位來表示aacaudiodata的型別:

0x00 = aac sequence header,類似h.264的sps,pps,在flv的檔案頭部出現一次。

0x01 = aac raw,aac資料

3. aac sequence header

aac sequence header定義audiospecificconfig,audiospecificconfig包含著一些更加詳細的音訊資訊,它的定義在iso14496-3中1.6.2.1。

簡化的audiospecificconfig 2位元組定義如下:

aac profile 5bits | 取樣率 4bits | 聲道數 4bits | 其他 3bits |

aac profile 5bits,參考iso-14496-3 object profiles table

aac main 0x01

aac lc    0x02

aac ssr  0x03

...(為什麼有些文件看到profile定義為4bits,實際驗證是5bits)

取樣率 4bits

value samplingfrequencyindex

0x00   96000

0x01   88200

0x02   64000

0x03   48000

0x04   44100

0x05   32000

0x06   24000

0x07   22050

0x08   16000

0x09   12000

0x0a   11025

0x0b     8000

0x0c   reserved

0x0d   reserved

0x0e   reserved

0x0f   escape value

聲道數 4bits

0x00 - defined in audiodecderspecificconfig

0x01 單聲道(center front speaker)

0x02 雙聲道(left, right front speakers)

0x03 三聲道(center, left, right front speakers)

0x04 四聲道(center, left, right front speakers, rear surround speakers)

0x05 五聲道(center, left, right front speakers, left surround, right surround rear speakers)

0x06 5.1聲道(center, left, right front speakers, left surround, right surround rear speakers, front low frequency effects speaker)

0x07 7.1聲道(center, left, right center front speakers, left, right outside front speakers, left surround, right surround rear speakers, front low frequency effects speaker)

0x08-0x0f - reserved

其他3bits設定為0即可。

aac-lc, 48000,雙聲道 這樣的設定 sequence header 為 0b 00010 0011 0010 000 = 0x11 0x90。

因此 aac sequence header的整個音訊tag包為 0x08, 00 00 04, 00 00 00 00, 00 00 00, af 00 11 90 | 00 00 00 0f

4. aac音訊包

結構為:0x08, 3位元組包長度,4位元組時間戳,00 00 00,af 01 n位元組aac資料 | 前包長度

其中編碼後aac純資料長度為n,3位元組包長度 = n + 2

前包長度 = 11 + 3位元組包長度 = 11 + n + 2 = 13 + n。

AAC打包ADTS格式

adts全稱是 audio data transport stream 是aac的一種十分常見的傳輸格式。adts aac adts header aac es adts header aac es adts header aac es adts 頭中相對有用的資訊取樣率 聲道數 幀長度。想想也是,...

AAC音訊格式(把AAC打包成ADTS)

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

AAC打包時間計算以及估算平均幀大小

先簡單記錄下最近對aac音訊學習的打包時間計算以及估算平均幀大小。打包時間,其實是可以音訊處理上通用的 而估算平均幀大小,是由於aac單個幀的大小並非是固定的,因此估算的是乙個平均幀大小。做音訊,肯定要對samples有所了解,其中aac有以下幾種samples profile samples he...