當(dāng)我們在 Android 中處理 Image 時,常因為 Java 性能和效率問題導(dǎo)致達(dá)不到我們期望的效果,例如進(jìn)行Camera 采集視頻流的原始幀時我們需要每秒能夠獲取足夠的幀率才能流暢的顯示出來,這也是為什么美顏 SDK 和圖像識別等這類 SDK 都是基于 C / C++ 的原因之一。語言的特性也是關(guān)鍵因素點,所以常常會在 Java 中調(diào)用 C / C++ 的 API 來進(jìn)行相關(guān)操作。

因最近工作需求是替代 Camera 的原始打視頻流,數(shù)據(jù)源是 Bitmap 格式的,如果使用 Java 的方法來進(jìn)行Bitmap 的旋轉(zhuǎn),轉(zhuǎn)換為 YUV 類型的 NV21 、YV12 數(shù)據(jù)的話,那么少說也要 15FPS 的視頻就尷尬的變成了5FPS的PPT幻燈片了。關(guān)于YUV的各種格式區(qū)別請見我的博客:直播必備之YUV使用總結(jié) —— Android常用的幾種格式:NV21/NV12/YV12/YUV420P的區(qū)別,而Google提供了一套Image處理的開源庫libyuv(科學(xué)上網(wǎng)),可高效的對各類Image進(jìn)行Rotate(旋轉(zhuǎn))、Scale(拉伸)和Convert(格式轉(zhuǎn)換)等操作。

libyuv官方說明

libyuv is an open source project that includes YUV scaling and conversion functionality.

  • Scale YUV to prepare content for compression, with point, bilinear or box filter.

  • Convert to YUV from webcam formats.

  • Convert from YUV to formats for rendering/effects.

  • Rotate by 90/180/270 degrees to adjust for mobile devices in portrait mode.

  • Optimized for SSE2/SSSE3/AVX2 on x86/x64.

  • Optimized for Neon on Arm.

  • Optimized for DSP R2 on Mips.

  • 網(wǎng)友評論