YUV 是一種在視頻處理和壓縮中常用的顏色空間。
它將圖像的亮度 (Y) 與色度 (U 和 V) 成分分開。
這種分離對視頻壓縮和廣播非常有益,
因為人眼對亮度變化比對顏色變化更敏感。
YUV 組件簡介
- Y (亮度):表示圖像的亮度或灰度信息。
- U (色度):表示顏色差異的藍色投影。
- V (色度):表示顏色差異的紅色投影。
RGB 轉換為 YUV
RGB 轉換為 YUV 的公式如下:
[ Y = 0.299R + 0.587G + 0.114B ]
[ U = 0.492 (B - Y) ]
[ V = 0.877 (R - Y) ]
使用 FFmpeg 進行 YUV 轉換
FFmpeg 可以將視頻文件從一種格式轉換為另一種格式,包括轉換為 YUV 格式或從 YUV 格式轉換。以下是將 RGB 視頻轉換為 YUV 的示例命令:
ffmpeg -i input.mp4 -pix_fmt yuv420p output.yuv
此命令將 input.mp4
轉換為使用 yuv420p
像素格式的 YUV 格式,并保存為 output.yuv
。
IPB 是視頻編碼中的幀類型,通常用于描述視頻壓縮算法中的幀結構。以下是 IPB 幀的具體介紹:
I 幀(關鍵幀或獨立幀)
- I 幀 是獨立幀,包含完整的圖像數據,可以不依賴其他幀進行解碼。
- 它們在視頻流中通常用作參照點,方便隨機訪問。
- 編碼和解碼 I 幀所需的比特率較高,但提供較高的質量。
P 幀(預測幀)
- P 幀 依賴于前面的 I 幀或 P 幀,通過預測和差異編碼來減少數據量。
- 它只存儲相對于前一幀的變化部分,因此比 I 幀需要更少的比特率。
- 解碼 P 幀時需要參考前面的 I 幀或 P 幀。
B 幀(雙向預測幀)
- B 幀 依賴于前后的 I 幀和 P 幀,通過雙向預測進行編碼。
- B 幀能有效地壓縮視頻,因為它可以從兩側幀的信息中進行插值。
- B 幀的解碼依賴于前后的 I 幀或 P 幀。
使用 FFmpeg 處理 IPB 幀
ffmpeg -i input.mp4 -vf showinfo -f null -
此命令將 input.mp4
的幀信息顯示在控制臺上,其中包括每一幀的類型(I、P 或 B)。
PTS(Presentation Time Stamp,顯示時間戳)
和 DTS(Decoding Time Stamp,解碼時間戳)
是音視頻編碼中的兩個重要概念,用于同步和播放音視頻流。
PTS(顯示時間戳)
- PTS 指示一個視頻幀或音頻樣本應該在何時顯示或播放。
- 它用于確保音視頻流在正確的時間點同步播放。
- 通常,在視頻解碼和播放過程中,PTS 會告訴播放器何時顯示當前幀。
DTS(解碼時間戳)
- DTS 指示一個視頻幀或音頻樣本應該在何時解碼。
- 在某些情況下,特別是涉及到 B 幀時,幀的解碼順序可能與顯示順序不同。
- DTS 確保幀按照正確的順序解碼,以便隨后按 PTS 順序顯示。
使用 FFmpeg 查看 PTS 和 DTS
你可以使用 FFmpeg 查看視頻文件中幀的 PTS 和 DTS 信息。以下是一個示例命令,顯示如何查看視頻文件的時間戳信息:
ffmpeg -i input.mp4 -vf showinfo -f null -
這個命令會在控制臺中顯示 input.mp4
的幀信息,包括 PTS 和 DTS 時間戳。
調整 PTS 和 DTS
在某些情況下,可能需要調整 PTS 和 DTS,
例如修正音視頻不同步的問題。以下是一個示例,展示如何使用 FFmpeg 調整 PTS:
ffmpeg -i input.mp4 -vf "setpts=PTS+2/TB" output.mp4
這個命令將 input.mp4
的 PTS 調整為原來的 PTS 加上 2 秒,并保存為 output.mp4
。
視頻的編碼和解碼過程是將視頻數據壓縮和解壓縮的技術,用于減少視頻文件的大小,同時盡可能保持視頻質量。這個過程主要包括以下幾個步驟:
視頻編碼過程
-
采集和預處理:
- 從攝像設備獲取原始視頻數據(通常是 RGB 格式)。
- 進行預處理,如色彩空間轉換(將 RGB 轉換為 YUV)和幀間去噪。
-
幀類型劃分:
- 將視頻分割成 I 幀(關鍵幀)、P 幀(預測幀)和 B 幀(雙向預測幀)。
-
幀內壓縮(Intra-frame Compression):
- 對每一幀進行壓縮,通常使用離散余弦變換(DCT)來減少空間冗余。
-
幀間壓縮(Inter-frame Compression):
- 利用幀之間的相似性,通過運動估計和補償來減少時間冗余。
-
量化:
- 將變換后的系數進行量化,進一步減少數據量。量化級別越高,壓縮比越大,但質量可能會降低。
-
熵編碼:
- 使用熵編碼(如霍夫曼編碼或算術編碼)對量化后的數據進行進一步壓縮。
-
封裝:
- 將壓縮后的視頻流與音頻流、多媒體數據流等一起封裝成一個多媒體容器格式(如 MP4、MKV 等)。
視頻解碼過程
-
解析封裝格式:
- 從多媒體容器中提取壓縮的視頻流。
-
熵解碼:
- 對壓縮數據進行熵解碼,還原量化后的變換系數。
-
反量化:
- 對量化后的系數進行反量化,還原接近原始的變換系數。
-
幀間解壓縮(Inter-frame Decompression):
- 使用運動補償還原幀間壓縮的數據,重建 P 幀和 B 幀。
-
幀內解壓縮(Intra-frame Decompression):
- 對每一幀進行反DCT變換,重建幀內壓縮的數據。
-
重建視頻幀:
- 將 YUV 數據轉換回 RGB 格式,重建出完整的視頻幀。
-
顯示和同步:
- 使用 PTS 來同步音視頻流,在正確的時間點顯示每一幀。
使用 FFmpeg 進行視頻編碼和解碼
以下是使用 FFmpeg 進行視頻編碼和解碼的示例命令:
編碼
將原始視頻編碼為壓縮格式,例如 H.264 編碼的 MP4 文件:
ffmpeg -i input.raw -c:v libx264 output.mp4
解碼
將壓縮格式的視頻解碼為原始視頻幀:
ffmpeg -i input.mp4 -f rawvideo output.raw
音頻概念
- 比特率:表示經過編碼(壓縮)后的音頻數據每秒鐘需要用多少個比特來表示單位常為kbps。
- 響度和強度:聲音的主觀屬性響度表示的是一個聲音聽來有多響的程度響度主要隨聲音的強度而變化,但也受頻率的影響。總的說,中頻純音聽來比低頻和高頻純音響一些
- 采樣和采樣率:采樣是把連續的時間信號,變成離散的數字信號。采樣率是指每秒鐘采集多少個樣本
容器-整合音視頻:
- 單個這樣的文件包含所有的流(主要是音頻和視頻),并提供同步和通用元數據,比如標題、分辨率等等。
- 一般我們可以通過文件的后綴來判斷文件格式:比如video.webm通常是一個使用webm容器格式的視頻。一個video.mp4是MP4容器格式。
注意同步
FFmpeg常用API簡介
FFmpeg&&Android