Android音視頻開(kāi)發(fā)——H264的基本概念

準(zhǔn)備

ffmpeg常用命令

  • 播放視頻
ffmpeg -i h265.mkv -vcodec hevc output.h265
  • 用ffmpeg命令將mp4視頻提取h264
ffmpeg -i input.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
  • 播放H264視頻
ffplay -stats -f h264 out.h264
  • 提取音頻
ffmpeg -i input.mp4 -acodec copy -vn  output.aac
ffmpeg -i input.mp4 -f mp3 -vn apple.mp3
ffplay -ar 48000 -channels 2 -f f32le -i output.pcm
  • 視頻倒放,無(wú)音頻
ffmpeg.exe -i input.mp4 -filter_complex [0:v]reverse[v] -map [v] -preset superfast reversed.mp4
  • 視頻倒放题诵,音頻不變
ffmpeg.exe -i input.mp4 -vf reverse reversed.mp4
  • 音頻倒放摊鸡,視頻不變
ffmpeg.exe -i input.mp4 -map 0 -c:v copy -af "areverse" reversed_audio.mp4
  • 音視頻同時(shí)倒放
ffmpeg.exe -i input.mp4 -vf reverse -af areverse -preset superfast reversed.mp4
  • 視頻裁剪
ffmpeg  -i ./input.mp4 -vcodec copy -acodec copy -ss 00:00:00 -to 00:05:00 ./cutout1.mp4 -y
ffmpeg  -i ./input.mp4 -vcodec copy -acodec copy -ss 00:05:00 -to 00:10:00 ./cutout2.mp4 -y
ffmpeg  -i ./input.mp4 -vcodec copy -acodec copy -ss 00:10:00 -to 00:14:50./cutout3.mp4 -y

視頻文件封裝格式

  • 封裝格式也叫做容器
  • 將已經(jīng)編碼壓縮好的視頻軌和音頻軌按照一定的格式放入到一個(gè)文件中逻族,
  • 視頻軌相當(dāng)于飯曙求,而音頻軌相當(dāng)于菜与帆,封裝格式就是一個(gè)碗


    image.png

封裝格式卖词。

視頻文件格式 視頻封裝格式
.avi AVI(Audio Video Interleaved)
.wmv巩那、.asf WMV(Windows Media Video)
.mpg、.mpeg此蜈、.vob即横、.dat、.3gp裆赵、.mp4 MPEG(Moving Picture Experts Group)
.mkv Matroska
.rm东囚、.rmvb Real Video
.mov QuickTime File Format
.flv Flash Video
  • 其實(shí)不管rmvb、avi战授、mp4還是 flv 大都由h264進(jìn)行編碼页藻。
  • 當(dāng)然也會(huì)有不同的 如 mpeg4 、vp9植兰,這樣比較冷門的編碼份帐。
  • 無(wú)論是h264 mpeg4 vp9 都是基于宏塊的方式進(jìn)行編碼,原理是一樣的楣导,只不過(guò)實(shí)現(xiàn)的算法不一致罷了

音視頻編碼方式

編碼的本質(zhì)就是壓縮數(shù)據(jù)

1废境、視頻編碼方式
  • 視頻編碼的作用: 將視頻像素?cái)?shù)據(jù)(RGB,YUV 等)壓縮成視頻碼流爷辙,從而降低視頻的數(shù)據(jù)量彬坏。
HEVC(H.265) MPEG/ITU-T 2013 研發(fā)中
名稱 推出機(jī)構(gòu) 推出時(shí)間 目前使用領(lǐng)域
H.264 MPEG/ITU-T 2003 各個(gè)領(lǐng)域
MPEG4 MPEG 2001 不溫不火
MPEG2 MPEG 1994 數(shù)字電視
VP9 Google 2013 研發(fā)中
VP8 Google 2008 不普及
VC-1 Microsoft Inc. 2006 微軟平臺(tái)
2朦促、 音頻編碼方式

音頻編碼的作用: 將音頻采樣數(shù)據(jù)(PCM 等)壓縮成音頻碼流膝晾,從而降低音頻的數(shù)據(jù)量。 常用的音頻編碼方式有以下幾種:

名稱 推出機(jī)構(gòu) 推出時(shí)間 目前使用領(lǐng)域
AAC MPEG 1997 各個(gè)領(lǐng)域(新)
MP3 MPEG 1993 各個(gè)領(lǐng)域(舊)
WMV Microsoft Inc. 1999 微軟平臺(tái)
AC-3 Dolby Inc. 1992 電影

H264概述

壓縮技術(shù)

H264壓縮技術(shù)主要采用了以下幾種方法對(duì)視頻數(shù)據(jù)進(jìn)行壓縮务冕。包括:

  • 幀內(nèi)預(yù)測(cè)壓縮血当,解決的是空域數(shù)據(jù)冗余問(wèn)題。
  • 幀間預(yù)測(cè)壓縮(運(yùn)動(dòng)估計(jì)與補(bǔ)償)禀忆,解決的是時(shí)域數(shù)據(jù)冗徐問(wèn)題臊旭。
  • 整數(shù)離散余弦變換(DCT),將空間上的相關(guān)性變?yōu)轭l域上無(wú)關(guān)的數(shù)據(jù)然后進(jìn)行量化箩退。
  • CABAC壓縮:無(wú)損壓縮技術(shù)离熏。

如果一個(gè)場(chǎng)景,有一個(gè)亭子戴涝,那么上一秒和下一秒這個(gè)亭子都不會(huì)動(dòng)滋戳,那就是用幀內(nèi)壓縮钻蔑,如果下一秒亭子倒了,那么就是幀間壓縮

h264視頻編解碼原理
編碼.png

解碼.png

經(jīng)過(guò)壓縮后的幀分為:I幀奸鸯,P幀和B幀:

  • I幀:關(guān)鍵幀咪笑,采用幀內(nèi)壓縮技術(shù)(最大)。
  • P幀:向前參考幀娄涩,在壓縮時(shí)窗怒,只參考前面已經(jīng)處理的幀。采用幀音壓縮技術(shù)蓄拣。
  • B幀:雙向參考幀扬虚,在壓縮時(shí),它即參考前而的幀球恤,又參考它后面的幀(P幀)孔轴。采用幀間壓縮技術(shù)(最小)。

除了I/P/B幀外碎捺,還有圖像序列GOP路鹰。

  • GOP:兩個(gè)I幀之間是一個(gè)圖像序列,在一個(gè)圖像序列中只有一個(gè)I幀
  • GOP說(shuō)白了就是兩個(gè)I幀之間的間隔


    GOP.png

1.正常播放的視頻的第一幀永遠(yuǎn)是I幀
2.與I幀相似程度達(dá)到95%以上收厨,編碼成B幀
3.相似程度達(dá)到70%編碼成P幀
4.碼流順序:I幀之后一定是P(I->P->B)晋柱,并且一定不可能出現(xiàn)把后面B幀跑到前面P幀。原因是B幀放到了緩沖區(qū)
5.場(chǎng)景變化則會(huì)新編成一個(gè)I幀诵叁,I幀頻率越高雁竞,視頻文件越大

  • pts:播放順序是按照pts進(jìn)行播放,每個(gè)視頻播放都不是從0開(kāi)始拧额,一般都有個(gè)默認(rèn)的大小

h264塊

  • 視頻播放的本質(zhì)實(shí)際是宏塊的移動(dòng)
  • 宏塊包括宏塊類型碑诉,宏塊預(yù)測(cè)數(shù)據(jù),殘差數(shù)據(jù)
  • 劃分宏塊
    • 把一張圖片劃分成若干個(gè)小的區(qū)域侥锦,這些小的區(qū)域稱之為宏塊
    • H264默認(rèn)是使用 16X16 大小的區(qū)域作為一個(gè)宏塊进栽,也可以劃分成 8X8 大小


      宏塊.png

如上圖的宏塊是88,默認(rèn)情況存儲(chǔ)的是88的信息恭垦,而h264編碼存儲(chǔ)的實(shí)際是左邊的信息和頂部的信息

image.png
  • 劃分子塊
    H264對(duì)比較平坦的圖像使用 16X16 大小的宏塊快毛。但為了更高的壓縮率,還可以在 16X16 的宏塊上更劃分出更小的子塊番挺。子塊的大小可以是 8X16? 16X8? 8X8? 4X8? 8X4? 4X4非常的靈活唠帝。

  • 亮度塊預(yù)測(cè)


    4x4亮度塊預(yù)測(cè).png
模式 描 述
模式0(垂直) 由A、B玄柏、C襟衰、D 垂直推出相應(yīng)像素值
模式1(水平) 由I、J粪摘、K瀑晒、L 水平推出相應(yīng)像素值
模式2(DC) 由A~D 及I~L 平均值推出所有像素值
模式3(下左對(duì)角線) 由45°方向像素內(nèi)插得出相應(yīng)像素值
模式4(下右對(duì)角線) 由45°方向像素內(nèi)插得出相應(yīng)像素值
模式5(右垂直) 由26.6°方向像素值內(nèi)插得出相應(yīng)像素值
模式6(下水平) 由26.6°方向像素值內(nèi)插得出相應(yīng)像素值
模式7(左垂直) 由26.6° 方向像素值內(nèi)插得出相應(yīng)像素值
模式8(上水平) 由26.6° 方向像素值內(nèi)插得出相應(yīng)像素值
  • 16x16亮度預(yù)測(cè)模式


    17.png
18.png
模式 描 述
模式0(垂直) 由上邊像素推出相應(yīng)像素值
模式1(水平) 由左邊像素推出相應(yīng)像素值
模式2(DC) 由上邊和左邊像素平均值推出相應(yīng)像素值
模式3(平面) 利用線形“plane”函數(shù)及左阀湿、上像素推出相應(yīng)像素值,適用于亮度變化平緩區(qū)域
  • 8×8色度塊預(yù)測(cè)模式
    • 每個(gè)幀內(nèi)編碼宏塊的8×8色度成分由已編碼左上方色度像素預(yù)測(cè)而得瑰妄,兩種色度成分常用同一種預(yù)測(cè)模式陷嘴。
    • 4種預(yù)測(cè)模式類似于幀內(nèi)16×16預(yù)測(cè)的4種預(yù)測(cè)模式,只是模式編號(hào)不同间坐。其中DC(模式0)灾挨、水平(模式1)、垂直(模式2)竹宋、平面(模式3)

1劳澄、4×4亮度子塊有9種可選預(yù)測(cè)模式
2、16×16亮度塊有4種預(yù)測(cè)模式
3蜈七、色度塊也有4種預(yù)測(cè)模式

H264碼流組成

組成碼流的結(jié)構(gòu)中秒拔,包含了以下幾個(gè)部分,從大到小依次是:
H264視頻序列飒硅,圖像砂缩,片組,片三娩,NALU庵芭,宏塊,像素

H264碼流組成.png

image.png

  • H264編碼分層

    • NAL層(Network Abstraction Layer,視頻數(shù)據(jù)網(wǎng)絡(luò)抽象層):在網(wǎng)絡(luò)上傳輸?shù)倪^(guò)程中會(huì)傳包雀监,而每個(gè)包以太網(wǎng)是1500字節(jié)双吆,但是H264的幀往往會(huì)大于1500個(gè)字節(jié),所以要進(jìn)行拆包会前,將一個(gè)幀拆成多個(gè)包進(jìn)行傳輸好乐,所有的拆包后者組包都是通過(guò)NAL層去處理
    • VCL層(Video Coding Layer,視頻數(shù)據(jù)編碼層):對(duì)視頻原數(shù)據(jù)進(jìn)行壓縮
  • H264碼流相當(dāng)于一條河流。它的起始碼是0x 00 00 00 01 或者 0x 00 00 01作為分隔符瓦宜。

  • 兩個(gè) 0x 00 00 00 01之間的字節(jié)數(shù)據(jù) 是表示一個(gè)NAL Unit

h264編碼格式

H264功能分為兩層:

  • 視頻編碼層
  • 網(wǎng)絡(luò)提取層

1.H264視頻序列包括一系列的NAL單元蔚万,每個(gè)NAL單元包含一個(gè)RBSP。


NAL單元格式.png

2.一個(gè)原始的H.264由N個(gè)NALU單元組成
3.NALU單元由[StartCode][NALU Header][NALU Payload]三部分組成

Start Code 用于標(biāo)示這是一個(gè)NALU 單元的開(kāi)始歉提,必須是"00 00 00 01" 或"00 00 01"笛坦。
4.RBSP類型 : 包括序列參數(shù)集 SPS 和 圖像參數(shù)集 PPS


image.png

5.NAL Header
由三部分組成forbidden_bit(1bit)(禁止位)区转,nal_reference_bit(2bits)(優(yōu)先級(jí),苔巨,值越大,該NAL越重要)废离,nal_unit_type(5bits)(類型)

nal_unit_type

  • 標(biāo)識(shí)NAL單元中的RBSP數(shù)據(jù)類型
  • nal_unit_type為1侄泽, 2, 3蜻韭, 4悼尾, 5及12的NAL單元稱為VCL的NAL單元
  • 其他類型的NAL單元為非VCL的NAL單元柿扣。
NALU類型 .png

6.NAL的解碼單元的流程如下


NAL的解碼單元.png
H.264碼流結(jié)構(gòu)圖
H.264碼流結(jié)構(gòu)圖.png
  • 起始碼:
    • 如果NALU對(duì)應(yīng)的Slice為一幀的開(kāi)始,則用4字節(jié)表示闺魏,即0x00000001未状;否則用3字節(jié)表示,0x000001析桥。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末司草,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子泡仗,更是在濱河造成了極大的恐慌埋虹,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娩怎,死亡現(xiàn)場(chǎng)離奇詭異搔课,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)截亦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門爬泥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人崩瓤,你說(shuō)我怎么就攤上這事急灭。” “怎么了谷遂?”我有些...
    開(kāi)封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵葬馋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我肾扰,道長(zhǎng)畴嘶,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任集晚,我火速辦了婚禮窗悯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘偷拔。我一直安慰自己蒋院,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布莲绰。 她就那樣靜靜地躺著欺旧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛤签。 梳的紋絲不亂的頭發(fā)上辞友,一...
    開(kāi)封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼称龙。 笑死留拾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鲫尊。 我是一名探鬼主播痴柔,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼疫向!你這毒婦竟也來(lái)了竞帽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸿捧,失蹤者是張志新(化名)和其女友劉穎屹篓,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匙奴,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堆巧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泼菌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谍肤。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哗伯,靈堂內(nèi)的尸體忽然破棺而出荒揣,到底是詐尸還是另有隱情,我是刑警寧澤焊刹,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布系任,位于F島的核電站,受9級(jí)特大地震影響虐块,放射性物質(zhì)發(fā)生泄漏俩滥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一贺奠、第九天 我趴在偏房一處隱蔽的房頂上張望霜旧。 院中可真熱鬧,春花似錦儡率、人聲如沸挂据。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)崎逃。三九已至,卻和暖如春箕肃,著一層夾襖步出監(jiān)牢的瞬間婚脱,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工勺像, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留障贸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓吟宦,卻偏偏與公主長(zhǎng)得像篮洁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子殃姓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容