準(zhǔn)備
- ffmpeg下載:(選擇紅色區(qū)域的)
http://www.ffmpeg.org/download.html
image.png
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 | 2013 | 研發(fā)中 | |
VP8 | 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視頻編解碼原理
經(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í)際是左邊的信息和頂部的信息
劃分子塊
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
模式 | 描 述 |
---|---|
模式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編碼分層
- 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。
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單元柿扣。
6.NAL的解碼單元的流程如下
H.264碼流結(jié)構(gòu)圖
- 起始碼:
- 如果NALU對(duì)應(yīng)的Slice為一幀的開(kāi)始,則用4字節(jié)表示闺魏,即0x00000001未状;否則用3字節(jié)表示,0x000001析桥。