這兩天做一個 H.265 編碼測試的功能,編碼器需要手動輸入 raw yuv frame 的 stride (也可以稱作 pitch)數組大小,這個倒是讓我一愣,做了這麼久的音視頻編解碼的工作,長時間使用 ffmpeg,或者 x264 的上層接口去封裝一個視頻幀,竟然對這個該如何賦值給搞不清楚了,這個如果配置不對的話,那麼編碼出來的視頻幀將是花屏的,所以在此還是鞏固一下基礎知識吧。
stride 可以稱之爲“跨距”,可以理解爲每個 (Y、U、V)每個分量在每一行所佔的字節數,這裏我們拿 I420 做爲例子,我們知道 I420 的數據存儲方式爲平面存儲,即Y、U、V 分開存儲,如下圖示:
p_w_picpath.png
這樣我們可以直觀的看出,Y 分量每一行的字節數爲圖像的寬度 img_width,而由於 U 分量和 V 分量爲每兩行 Y 像素共享一行 U 和 V 像素,所以 U 和 V 分量在每一行所佔的字節數爲 圖像寬度的一半,即 img_widht / 2,即:
int y_stride = img_width; int u_stride = img_width / 2; int v_stride = img_width / 2;
以上計算方式僅適用於 I420 / YUV420P 色彩空間格式的視頻幀數據,其它格式請參照 stride 的定義應該就可以很快的確定各個分量的大小了。