aac音頻:ide
打包aac音頻必須加上一個adts(Audio Data Transport Stream)頭,共7Byte,adts包括fixed_header和variable_header兩部分,各28bit。ui
fixed_header編碼
syncword | 12b | 固定爲0xfff |
id | 1b | 0表示MPEG-4,1表示MPEG-2 |
layer | 2b | 固定爲00 |
protection_absent | 1b | 固定爲1 |
profile | 2b | 取值0~3,1表示aac |
sampling_frequency_index | 4b | 表示採樣率,0: 96000 Hz,1: 88200 Hz,2: 64000 Hz,3:48000 Hz,4: 44100 Hz,5: 32000 Hz,6: 24000 Hz,7: 22050 Hz,8: 16000 Hz,9: 12000 Hz,10: 11025 Hz,11: 8000 Hz,12: 7350 Hz |
private_bit | 1b | 固定爲0 |
channel_configuration | 3b | 取值0~7,1: 1 channel: front-center,2: 2 channels: front-left, front-right,3: 3 channels: front-center, front-left, front-right,4: 4 channels: front-center, front-left, front-right, back-center |
original_copy | 1b | 固定爲0 |
home | 1b | 固定爲0 |
variable_headerspa
copyright_identification_bit | 1b | 固定爲0 |
copyright_identification_start | 1b | 固定爲0 |
aac_frame_length | 13b | 包括adts頭在內的音頻數據總長度 |
adts_buffer_fullness | 11b | 固定爲0x7ff |
number_of_raw_data_blocks_in_frame | 2b | 固定爲00 |
mp3音頻:code
mp3音頻不須要加adts頭。視頻
6.h264幀類型判斷ci
當nalu type=5或1時,表示後面跟着的數據是視頻數據,下面咱們只列出前2項。it
first_mb_in_slice | Golomb編碼 | 通常爲0,一個slice爲一幀圖像 |
slice_type | Golomb編碼 | 幀類型,二、四、七、9表示I幀,0、三、五、8表示P幀 ,一、6表示B幀。 |
7.mp4轉tsio
咱們假設mp4格式中的視頻編碼爲h.264,音頻編碼爲aac。咱們從mp4中獲取的視頻信息包括:sps、pps、dts、pts、幀率、幀數據、ticks(每秒滴答數)。音頻信息包括:pts、採樣頻率、聲道數、幀數據。mp4文件的dts和ts文件的dts是須要進行換算的,都是初始值 + 增量,可是增量計算是不一樣的。table
視頻信息獲取:
sps | stsd.avc1.avcC |
pps | stsd.avc1.avcC |
dts | stts |
pts | stts + ctts |
幀率 | 幀個數 / 總時長 |
timescale | trak.mdia.mdhd |
幀數據 | stsc + stco + stsz |
音頻信息獲取:
pts | stts |
採樣頻率 | trak.mdia.mdhd |
聲道數 | stsd.mp4a |
幀數據 | stsc + stco + stsz |
8.mp4中關於h264和aac的說明
mp4的stsd原子中包含不少關鍵的音視頻編解碼元信息。對於視頻數據,不一樣的編解碼格式stsd中包含的子原子類型是不一樣的。MP4的視頻H.264封裝有2種格式:h264和avc1,只要看到這兩個FOURCC(四字節編碼)。就能夠確定是h.264編碼,區別在於slice是否有起始碼。對於音頻數據,stsd中包含的子原子只會是mp4a,mp4a又包含了一個子原子esds,判斷音頻編碼格式的是esds中的第十一個字節,若是是0x40則說明是aac編碼,若是是0x69則說明是mp3。
AVC1 描述:H.264 bitstream without start codes.通常經過ffmpeg轉碼生成的視頻,是不帶起始碼0×00000001的,可是帶有4字節的長度。
H264 描述:H.264 bitstream with start codes.通常對於一下HDVD等電影的壓制格式,是帶有起始碼0×00000001的。
除了avc1和h264還多是下面的FOURCC,只是名字不一樣而已。
MEDIASUBTYPE_AVC1 'AVC1' H.264 bitstream without start codes.
MEDIASUBTYPE_H264 'H264' H.264 bitstream with start codes.
MEDIASUBTYPE_h264 'h264' Equivalent to MEDIASUBTYPE_H264, with a different FOURCC.
MEDIASUBTYPE_X264 'X264' Equivalent to MEDIASUBTYPE_H264, with a different FOURCC.
MEDIASUBTYPE_x264 'x264' Equivalent to MEDIASUBTYPE_H264, with a different FOURCC.