在Android上做媒體開發,避免不了對視頻數據進行編解碼。

軟件編解碼有FFmpeg。雖然FFmpeg軟件編解碼兼容性和適應性很好。但是在大部分主流的機器上,解碼720p視頻已經很勉強了,更不用提更高的分辨率。編碼的話要求更高。

所以在移動平台上做視頻編解碼應當優先使用機器自帶的硬件編解碼來實現。

Android系統底層的硬件編解碼框架是OpenMaxIL。使用這個可以跨的版本最多。從Android2.3以后支持。不過使用難度大。這里不討論了。

Android從4.1以后提供了MediaCodec這個框架做視頻編解碼,但是5.0系統以前只提供了java版,5.0以后才能在jni native code使用。

很多情況下視頻處理的數據都是放在native code那邊處理的,編解碼部分也希望在native code里面一起實現。

雖然可以用java 的MediaCodec稍微封裝下,然后在jni 里面用c/c++代碼里面用jni的交互接口(FindClass、Call...Method 等配合調用)。但是這種方法不僅代碼封裝性不好,還得頻繁的進程native code與jvm的交互,效率不高。而且破壞代碼可讀和封裝。

所以這里提供個4.1以后的系統都能在native code像5.0那樣使用MediaCodec的方法,方便c++開發者使用MediaCodec:

這是編譯好的so庫以及使用代碼和說明:MediaCodec c++

這是從Android5.0的源碼里面抽取了MediaCodec so實現的代碼,分別在Android4.1 ~ 4.4 源碼上編譯的so庫。所以接口使用和5.0的MediaCodec其實是一樣的。

ps:關於那些庫的編譯步驟,編譯時要跟隨不同系統版本的源碼分別編譯一個,因為編譯時依賴了系統里面的東西,為了不重新編譯整個系統源碼,可以從Android模擬器里面把依賴到的so庫pull出來,源碼只提供頭文件,編譯時鏈接pull出來的so庫即可。

編譯好的庫我已經提供出來了,直接下載使用即可。