Android视频录制之NV21和NV12
從Camera.PreviewCallback接口回調方法onPreviewFrame(byte[] data, Camera camera)回調的data數據,為NV21圖像數據,而Android手機識別的是NV12圖像數據,所以需要將NV21轉化為NV12圖像數據。NV21圖像數據包括三塊區域數據,分別為Y、V、U三塊,一個XY像素的圖片,他的NV21數據大小為 **byte[XY3/2]**,其中byte[XY]為Y區域,剩下的1/2U和V區域各占1/4;“Y”表示明亮度,“U”和“V”則是色度、濃度。
可以發現NV21和NV12數據唯一的區別就是V、U區域的不同,而Y區域數據是相同的。其實data數據只是一個一維數組,但是為了更好理解所以排列成這樣。所以NV21->NV12的數據變化其實就是矩陣數據的變化。以下各圖分別表示NV12數據的旋轉(僅提供90度和270度變化)和鏡像變化。
經過NV12的鏡像變化可以為上圖所示的數據展示,NV12的鏡像變化是分區域的,不是矩陣完全鏡像變化,是按照Y,VU區域兩個區域分別變化的,而VU是作為一個整體。其實如果你仔細點你會發現NV12的鏡像矩陣是NV21的完全鏡像矩陣,所以如果你真的要自己完成矩陣的這兩步變化,可以直接將NV21進行完全矩陣變化,兩步合成一步,可以節省一部分的時間。
其實矩陣的變化,我自己已經完成了,但是最終的視頻有一定的問題,就是視頻中有的幀會出現縱向的分割線,所以自己的方法擱置了,采用了libyuv框架完成的。libyuv才用的是將NV21變成I420,然后通過對I420進行變化,然后將I420變成NV12數據。所以你是打算自己寫NV21的數據變化嗎?希望這些可以幫助到你。
總結
以上是生活随笔為你收集整理的Android视频录制之NV21和NV12的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习】线性回归实战案例三:股票数据
- 下一篇: 群晖windows文件服务器,小白玩群晖