視頻流媒體播放器EasyPlayer-RTSP硬解碼後如何設置YUV渲染格式?

YUV主要用於優化彩色視頻信號的傳輸。與RGB視頻信號傳輸相比,它最大的優點在於只需佔用極少的頻寬(RGB要求三個獨立的視頻信號同時傳輸)。因此我們在編譯視頻流媒體播放器EasyPlayer-RTSP時,使用的大多是YUV渲染方式。

前文我們說過EasyPlayer-RTSP是怎樣渲染畫面的,本文講一下在流媒體播放器EasyPlayer-RTSP硬解碼後獲得的YUV格式應該如何設置。

EasyPlayer EasyPusher.png

不同的Android設備,MediaCodec解碼得到的YUV格式不相同,且由於各種格式繁雜,很難寫出高效的格式轉換方法。統計發現市面上Android設備MediaCodec解碼得到的不同YUV格式所佔的比例,表格中顯示出格式之繁多,且以
COLOR_QCOM_FormatYUV420SemiPlanar32m,
OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka和
COLOR_FormatYUV420SemiPlanar佔據絕大多數。

通用方法:

MediaCodec不僅在編碼,而且在解碼是也能夠指定幀格式。能夠指定的原因是,解碼得到的幀的格式,並不是由如H.264編碼的視頻文件提前確定的,而是由解碼器確定的,解碼器支持哪些幀格式,就可以解碼出哪些格式的幀。

716.jpg

得益於API 21加入的COLOR_FormatYUV420Flexible格式,MediaCodec的所有硬件解碼都支持這種格式。但這樣解碼後得到的YUV420的具體格式又會因設備而異,如YUV420Planar,YUV420SemiPlanar,YUV420PackedSemiPlanar等。

簡述COLOR_FormatYUV420Flexible

YUV420Flexible並不是一種確定的YUV420格式,而是包含COLOR_FormatYUV411Planar, COLOR_FormatYUV411PackedPlanar,
COLOR_FormatYUV420Planar, COLOR_FormatYUV420PackedPlanar,
COLOR_FormatYUV420SemiPlanar和COLOR_FormatYUV420PackedSemiPlanar。在API 21引入YUV420Flexible的同時,它所包含的這些格式都deprecated掉了。

只要解碼器支持YUV420Flexible中的任意一種格式,就會被認爲支持YUV420Flexible格式。也就是說,幾乎所有的解碼器都支持YUV420Flexible代表的格式中的一種或幾種。

最終方案

硬解碼時指定解碼後的幀格式:
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, COLOR_FormatYUV420Flexible)。

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