本系列筆記為博主學習李超老師課程的課堂筆記,僅供參閱
往期課程筆記傳送門:
- 音視頻小白系統入門筆記-0
- 音視頻小白系統入門筆記-1
- 音視頻小白系統入門筆記-2
- 音視頻小白系統入門筆記-3
將mp4文件轉換為yuv文件
ffmpeg -i demo.mp4 # 輸入文件-an # 禁用音頻流(audio no)-c:v rawvideo # 視頻流用rawvideo處理(非編碼)-pix_fmt yuv420p # 指定輸出像素格式為YUV420平面demo.yuv # 輸出原始YUV數據文件
rawvideo
是一個偽編碼器,僅僅進行數據格式轉換,不進行有損編碼
yuv數據僅僅存儲視頻,不存儲音頻
ffplay -f rawvideo -video_size 640x360 # 分辨率需要根據視頻內容手動指定-pixel_format yuv420p -framerate 24 # -vf extractplanes=y # 簡單濾波demo.yuv #播放yuv數據
yuv沒有元信息,需要手動指定分辨率等信息
ffmpeg
支持filter_complex
復雜濾波
ffmpeg -i demo.mp4 -c:v rawvideo # 輸出yuv格式時默認rawvideo-filter_complex "extractplanes=y+u+v[y][u][v]" -map '[y]' y.yuv -map '[u]' u.yuv -map '[v]' v.yuv# 播放
ffplay -f rawvideo -video_size 640x360 -pixel_format gray -framerate 24 y.yuv
ffplay -f rawvideo -video_size 320x180 -pixel_format gray -framerate 24 u.yuv
yuv格式:https://fourcc.org/yuv.php
H264視頻編碼
yuv420 640x480 15 → 52Mbps
H264建議碼流:500kbps,壓縮比1/100
碼流推薦表:https://blog.csdn.net/huapeng_guo/article/details/132625661
交互通訊碼流較低,需要時延較低;直播通訊碼流較高,因為用戶不和主播直接交換
GOP
Group of Picture 一組幀
GOP中幀的差距較小
- 低碼率環境:減少I幀頻率(延長GOP)以節省帶寬,但可能降低隨機訪問能力。
- 高動態內容:頻繁插入I幀(如GOP=15)以應對快速運動,但會增加文件體積。
I/P/B幀
I幀(Interframe frame):關鍵幀,采用幀內壓縮技術,不依賴其他幀。
- 例如IDR幀(Instantaneous Decoding Refresh Frame)瞬時解碼刷新幀,清空IDR幀之前的所有數據,后面的數據不會依賴IDR幀之前的數據。每當遇到IDR幀,解碼器會清空解碼器參考buffer中的內容
- 每個GOP中的第一幀是IDR幀
- 可以防止錯誤傳播
P幀(forward Predicted frame):向前參考幀。壓縮時只參考前面已經處理的幀,采用幀間壓縮技術。約占I幀的 1/2 大小
B幀(Bidirectionally predicted frame):雙向參考幀。壓縮時,既參考前面已經處理的幀,也參考后面的幀,幀間壓縮技術。它約占I幀 1/4 大小。提高B幀的數量可以提高壓縮比,但是會提高編解碼的耗時。實時通訊中B幀不能太多,云服務中可以很多。
解碼順序:I幀是幀內壓縮,不參考其他幀 → P幀依賴前面緊鄰的I幀 → B幀依賴前面和后面的I/P幀
播放順序:I → B → P → B → …
SPS (Sequence Parameter Set)序列參數集:位于GOP的頭部(IDR幀之前),表征GOP中每一幀的序列特性
seq_parameter_set_id
- 幀數
- POC(picture order count)的約束
- 參考幀數目
- 解碼圖像尺寸
- 幀長編碼模式選擇標識等
PPS(Picture Parameter Set)圖像參數集:位于GOP的頭部(IDR幀之前),表征GOP中每一幀的圖片特性
pic_parameter_set_id
- 熵編碼模式選擇標識(無損壓縮)
- 片組數目
- 初始量化參數
- 去方塊濾波洗漱調整標識等
H264壓縮技術
幀內壓縮:解決空(間)域數據冗余問題
幀間壓縮:解決時(間)域數據冗余問題
整數離散余弦變換(DCT),將空間上的相關性變為頻域上無關的數據然后進行量化
CABAC壓縮(老)
有損壓縮
- 幀內:DCT/整數DCT + 量化 + 熵編碼(解決空間冗余)。
- 幀間:運動估計 + 殘差變換/量化(解決時間冗余)。
無損壓縮
- 預測編碼:如DPCM、線性預測(FLAC)。
- 熵編碼:如霍夫曼、算術編碼(CABAC壓縮)、LZ77(ZIP/PNG)、VLC壓縮
宏塊
宏塊是視頻壓縮操作的基本單元
H.265/HEVC:用編碼樹單元(CTU)替代宏塊,支持更大塊(如64×64)和更靈活的劃分
16x16 8x16 16x8 8x8
宏塊大 → 運動預測和數據頭開銷減少 → 壓縮比提升,但細節丟失風險增加
宏塊小 → 運動預測更精確且殘差數據更少 → 細節保留更好,但壓縮比可能降低(因運動向量增多)
幀內壓縮
針對I幀
理論基礎:
- 相鄰像素差別不大,所以可以進行宏塊預測
- 人眼對亮度的敏感度超過色度
- YUV很容易將亮度和色度分開
幀內預測:H264 9種模式,將亮度塊和色度塊分開預測
預測模式信息+殘差值壓縮
幀間壓縮
運動估計:宏塊匹配 → 運動矢量
運動補償:殘差值 Residual
宏塊匹配算法:
- 三步搜索、四步搜索
- 二維對數搜索
- 鉆石搜索
花屏:部分幀丟失
卡頓:當有幀丟失時,丟失GOP內所有幀,顯示前一個I幀,直到下一個IDR幀
H264標準支持:https://en.wikipedia.org/wiki/Advanced_Video_Coding
H264碼流
碼流分層
-
NAL層:Netword Abstraction Layer,視頻數據網絡抽象層。
NAL層是視頻編碼與網絡傳輸之間的適配層,即使底層用TCP,仍需NAL解決視頻特有的問題(如幀劃分、參數集管理)。而在UDP場景下,NAL層的設計更是不可或缺。
VLC層:Video Coding Layer,視頻數據編碼層
一般情況下:一個slice對應一個圖像
SODB(String of Data Bits):原始數據比特流,二進制數據,不一定是8的倍數,由VCL層產生的,需要補齊。
RBSP(Raw Byte Sequence Payload)
補齊為8的倍數,補1和多個0
NALU
NAL Header(1 Byte) + RBSP
/
Annexb格式:用于本地文件存儲
RTP格式:用于直播推流