Android Camera對象通過setPreviewCallback 函數(shù)泵喘,在onPreviewFrame(byte[] data,Camera camera)中回調(diào)采集的數(shù)據(jù)就是NV21格式歧蒋。而x264編碼的輸入數(shù)據(jù)卻為I420格式。
因此鸠删,當我們采集到攝像頭數(shù)據(jù)之后需要將NV21轉(zhuǎn)為I420庆杜。
NV21和I420都是屬于YUV420格式箱蝠。而NV21是一種two-plane模式,即Y和UV分為兩個Plane(平面)眷蜈,但是UV(CbCr)交錯存儲,2個平面怜珍,而不是分為三個端蛆。這種排列方式被稱之為YUV420SP,而I420則稱之為YUV420P酥泛。(Y:明亮度今豆、灰度,UV:色度柔袁、飽和度)
下圖是大小為4x4的NV21數(shù)據(jù):Y1呆躲、Y2、Y5捶索、Y6共用V1與U1,......
而I420則是
可以看出無論是哪種排列方式插掂,YUV420的數(shù)據(jù)量都為: wh+w/2h/2+w/2h/2 即為wh*3/2
將NV21轉(zhuǎn)位I420則為:
Y數(shù)據(jù)按順序完整復制,U數(shù)據(jù)則是從整個Y數(shù)據(jù)之后加一個字節(jié)再每隔一個字節(jié)取一次。
手機攝像頭的圖像數(shù)據(jù)來源于攝像頭硬件的圖像傳感器腥例,這個圖像傳感器被固定到手機上后會有一個默認的取景方向辅甥,這個取景方向坐標原點于手機橫放時的左上角。當應(yīng)用是橫屏時候:圖像傳感器方向與屏幕自然方向原點一致燎竖。而當手機為豎屏時:
傳感器與屏幕自然方向不一致璃弄,將圖像傳感器的坐標系逆時針旋轉(zhuǎn)90度,才能顯示到屏幕的坐標系上构回。所以看到的畫面是逆時針旋轉(zhuǎn)了90度的夏块,因此我們需要將圖像順時針旋轉(zhuǎn)90度才能看到正常的畫面疏咐。而Camera對象提供一個setDisplayOrientation
接口能夠設(shè)置預覽顯示的角度:
根據(jù)文檔,配置完Camera之后預覽確實正常了脐供,但是在onPreviewFrame中回調(diào)獲得的數(shù)據(jù)依然是逆時針旋轉(zhuǎn)了90度的浑塞。所以如果需要使用預覽回調(diào)的數(shù)據(jù),還需要對onPreviewFrame回調(diào)的byte[] 進行旋轉(zhuǎn)政己。
旋轉(zhuǎn)前:
后置攝像頭需要順時針旋轉(zhuǎn)90度酌壕,旋轉(zhuǎn)后:
前置攝像頭需要逆時針旋轉(zhuǎn)90度,旋轉(zhuǎn)后:
前置攝像頭可能還需要進一步鏡像處理匹颤,鏡像后: