視頻編解碼基本知識

視頻編解碼流程

視頻編解碼流程
具體見>http://blog.csdn.net/leixiaohua1020/article/details/18893769

這裏結合項目實例來展開。
項目簡單介紹:uvc攝像頭採集mjpeg格式視頻,經ffmpeg轉碼爲h264保存到本地。

視頻採集

常用的uvc攝像頭採集格式有:yuv422、mjpeg等,分辨率越高,圖片越清晰,幀率越高,視頻越流暢(幀率25或30就夠了,由於人眼會保留圖像1/24s,所以更高的分辨率,效果並不會提高),但是代價是文件變大,或碼流變大。

視頻傳輸或保存(編碼)

主要考慮的是文件或碼流大小。由於人眼的極限,相鄰幀信息冗餘,採用某種算法來降低碼流成爲可能,主要編碼格式有mjpeg、h264、h265。這裏使用的是h264。
h264有專用的軟件和硬件編解碼器。這裏沒有硬件編碼器。而常用的軟件編碼器是x264,使用開源軟件是ffmpeg(1. ffmepg是一個開源、功能強大的工具,可以作爲內核視頻播放器,視頻轉碼工具. 2. ffmpeg是一個編解碼庫,功能豐富,其自帶H.264解碼功能,但是要實現H.264編碼需要集成X264將其作爲編碼器。)
下面是軟件h264編解碼效率對比
解碼速度:ffmpeg > IPP simple player > x264 decoder > t264 decoder > jm86 decoder
以ffmpeg的編碼速度爲基準,假設爲100fps,則:
IPP simple player:90fps
x264 decoder:50fps
t264 decoder:30fps
jm86 decoder:3fps
具體見http://blog.csdn.net/lqhed/article/details/51812301
h264編解碼會佔用大量的內存和cpu資源,因此硬件編碼器,cpu處理器,內存資源變得很重要。

播放(解碼、數據轉換)

圖像處理基本都是基於rgb數據。以h264爲例,解碼數據爲yuv420p,需要進行yuv420p–>rgb轉換,而rgb數據有真彩:rgb24,rgb32,非真彩:rgb16等(根據lcd驅動決定轉換格式,linux系統fbset查看底層rgb模式)
yuv和rgb互轉:

Y = 0.299 R + 0.587 G + 0.114 B
U = - 0.1687 R - 0.3313 G + 0.5 B + 128
V = 0.5 R - 0.4187 G - 0.0813 B + 128
反過來,RGB 也可以直接從YUV (256級別) 計算:cr(u),cb(v)。
R = Y + 1.402 (Cr-128)
G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
B = Y + 1.772 (Cb-128)

而浮點數運算效率很低,也常採用查表法,以空間換時間,使用neon也能提高轉換效率,因爲neon是simd,一個時鐘週期可以從內存讀取全部操作數。
當然第三方軟件經過算法優化,效率會很大提高,下面是第三方軟件效率對比:

轉換效率分析
測試序列:1920*1080
測試環境:OpenCV2.4.8, FFmpeg2.0, YUV2RGB v0.03

Method Time(ms)
YV12ToBGR24_Native 83.7263
YV12ToBGR24_Table 54.2376
YV12ToBGR24_OpenCV 26.0529
YV12ToBGR24_FFmpeg 3.41499
YV12ToBGR24_Pinknoise 14.1215

由上述表格可以看出,基於FFmpeg的格式轉換效率最高,而這裏使用ffmepg轉換。
具體見:http://blog.csdn.net/lg1259156776/article/details/53071961

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章