錄制方案
- Andriod系統(tǒng)API
- MediaRecoder 壓縮率低囱挑,錄制高分辨率的視頻體積過(guò)大
- MediaCodec 采用硬編碼,編碼速度快
- ffmpeg+x264 軟編碼編譯每一幀視頻數(shù)據(jù)較慢
采用MediaCodec錄制視頻流程
- 音視頻元數(shù)據(jù)采集
- 視頻數(shù)據(jù)旋轉(zhuǎn)、格式轉(zhuǎn)換處理
- 音視頻數(shù)據(jù)編碼
- 音視頻合成mp4
PCM:
PCM未經(jīng)過(guò)任何編碼和壓縮處理的數(shù)字信號(hào)谒获。
YUV:
YUV是一種顏色編碼方法众弓,Y:表示明亮度(Luminance或Luma),也就是灰度值乓序;而 U 和 V :表示的則是色度(Chrominance或Chroma)寺酪,作用是描述影像色彩及飽和度坎背,用于指定像素的顏色。
基于三個(gè)分量在內(nèi)存中的排列方式寄雀,YUV又分為多種不同的格式得滤。Android視頻錄制時(shí)涉及如下四種格式:
名稱 | 排列方式 | 說(shuō)明 |
---|---|---|
NV21 | YYY…VUVU…. | Y分量在前,VU分量交替排在后面 |
YUV420SP | YYY…UVUV…. | Y分量在前盒犹,UV分量交替排在后面 |
YV12 | YYY…VV..UU.. | Y分量在前懂更,其次是V分量,其次是U分量 |
YUV420P | YYY…UU..VV.. | Y分量在前急膀,其次是U分量沮协,其次是V分量 |
遇到問(wèn)題:Camera采集的YUV數(shù)據(jù),跟編碼器要求的YUV數(shù)據(jù)格式不一致
如何解決:
查詢手機(jī)上的MediaCodec實(shí)現(xiàn)具體支持哪些YUV格式作為輸入格式卓嫂,在4.4+的系統(tǒng)上慷暂,這兩種格式在大部分機(jī)器都有支持:
MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar
MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar
兩種格式分別是YUV420P和NV21,如果機(jī)器上只支持YUV420P格式的情況下晨雳,則需要先將攝像頭輸出的NV21格式先轉(zhuǎn)換成YUV420P呜呐,才能送入編碼器進(jìn)行編碼,否則最終出來(lái)的視頻就會(huì)花屏悍募,或者顏色出現(xiàn)錯(cuò)亂蘑辑。
- NV21->YUV420sp
- UV數(shù)據(jù)對(duì)調(diào)
- YUV數(shù)據(jù)旋轉(zhuǎn)
- YUV數(shù)據(jù)縮放
- YV12->YUV420p
注:
1、MediaCodec是Android4.1新增API坠宴,MediaMuxer是Android4.3新增API
參考資料:
微信Android視頻編碼爬過(guò)的那些坑:
https://github.com/WeMobileDev/article/blob/master/%E5%BE%AE%E4%BF%A1Android%E8%A7%86%E9%A2%91%E7%BC%96%E7%A0%81%E7%88%AC%E8%BF%87%E7%9A%84%E9%82%A3%E4%BA%9B%E5%9D%91.md
YUV格式轉(zhuǎn)換洋魂、旋轉(zhuǎn):
https://blog.csdn.net/jyt0551/article/details/53843464