詳述網(wǎng)站建設(shè)的過程怎樣建網(wǎng)站平臺
ijkplayer是B站開源的一款基于ffmpeg的移動端播放器。但為了減少播放器的體積,很多音視頻的格式播放默認都是不支持的,需要自己下載ijkplayer源碼進行編譯。這里以mac環(huán)境下android為例,簡述ijkplayer的編譯過程,以及為了支持更多音視頻編碼格式所要做的工作。mac環(huán)境下編譯要稍微簡便點,不需要安裝虛擬機和linux操作系統(tǒng)。
一 編譯ijkplayer源碼
1 下載ijkplayer源碼
https://github.com/Bilibili/ijkplayer
2 確保android studio開發(fā)環(huán)境環(huán)境
export ANDROID_NDK=/Users/xxx/Documents/Programs/android-ndk-r10e
export ANDROID_SDK=/Users/xxx/Library/Android/sdk
主要是android sdk和ndk路徑要在環(huán)境變量中配置,配置的ndk版本最好要低點。
3 執(zhí)行shell腳本,下載ffmpeg源碼
在ijkplayer源碼根目錄下找到init-android.sh。 終端定位到ijkplayer到源碼根目錄,執(zhí)行
./init-android.sh
可以用文本編輯器打開這個shell腳本。
里面到主要內(nèi)容就是下載ffmpeg源碼。執(zhí)行完成后在ijkplayer源碼根目錄下extra目錄下會多一個ffmpeg目錄,
同時在android/contrib會多出如下5個文件夾。
?
jk實際編譯libijkffmpeg.so時就是使用到對應架構(gòu)目錄下的ffmpeg源文件。
4 編譯配置
在config目錄下,共有3個默認的配置編譯文件。
module-default.sh:支持的音視頻解碼器較多(編譯出的so文件也比較大)。
module-lite-hevc.sh:支持hevc
module-lite.sh:支持較少的音視頻解碼器(默認情況下)
一般為了減少so體積,通常選擇module-lite.sh。
執(zhí)行
rm module.sh
ln -s module-lite.sh module.sh
類似于創(chuàng)建了一個快捷鍵。
5 編譯ffmpeg,生成libijkffmpeg.so
進入 android/contrib 目錄
5-1 清除ffmpeg的編譯文件
執(zhí)行
./compile-ffmpeg.sh clean
執(zhí)行此操作后android/contrib/build/ffmpeg-armv7a/output目錄下文件以及android/contrib/ffmpeg-armv7a目錄中的一些編譯中間成果物如.o文件也會刪除(此處以armv7a架構(gòu)為例說明)。
5-2 編譯生成libijkffmpeg.so
執(zhí)行
./compile-ffmpeg.sh armv7a
這里只編譯armv7a架構(gòu),如果要編譯所有架構(gòu),那么就把armv7a改為all。
如果出錯,看控制臺錯誤分析。
編譯成功后會在android/contrib/build/ffmpeg-armv7a/output目錄下生成libijkffmpeg.so。
6 編譯ijkplayer生成libijkplayer.so libijksdl.so
進入android目錄,執(zhí)行
./compile-ijk.sh
生成libijkplayer.so和libijksdl.so庫,至此編譯過程全部完成,過程中總共生成3個so庫libijkffmpeg.so libijkplayer.so以及l(fā)ibijksdl.so。
二 編譯支持更多的音視頻格式播放
ijkplayer默認支持的音視頻編碼格式可能并不一定能滿足項目的需求,這時就需要自己去編譯ijkplayer來支持更多音視頻編碼格式的解碼播放。一般只需4步即可:
1 修改編譯配置文件
進入config目錄
以module-lite.sh為例,使用文本編輯器打開。
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=pcm_alaw"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=pcm_mulaw"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mpeg4"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mp2*"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=ac3"
?
根據(jù)自己需要增加支持的音頻格式,在文件中增加相應配置,例如需要增加MPEG4視頻格式和G711音頻編碼格式的解碼播放,則相應地enable-decoder mpeg4和pcm_alaw。
而如何知道需要增加何種的音視頻格式支持,可以用ffmpeg的ffplay,直接播放一下視頻,播放時會有音視頻編碼格式等相關(guān)信息。也可以用其它播放器在電腦上播放時查看媒體信息獲知。
2 執(zhí)行編譯配置
還是在config目錄中,執(zhí)行
rm module.sh
ln -s module-lite.sh module.sh
3 編譯ffmpeg,生成libijkffmpeg.so
進入android/contrib目錄
先執(zhí)行,如下命令,清除ffmpeg的編譯文件
./compile-ffmpeg.sh clean
再執(zhí)行
./compile-ffmpeg.sh armv7a
有前面可知,在android/contrib/build/ffmpeg-armv7a/output目錄下會生成libijkffmpeg.so。這里只編譯armv7a架構(gòu),如果要編譯所有架構(gòu)則將armv7a改成all,要編譯其它架構(gòu)則自己修改成對應的架構(gòu)。
4 替換libffmpeg.so
libijkplayer.so及l(fā)ibijksdl.so這2個庫可以不用重新編譯。前者的功能主要是播放控制,以及調(diào)用ffmpeg庫進行解碼等,后者主要作用是視頻渲染等。使用時不管是aar依賴還是gradle依賴,只要將libffmpeg.so庫替換成自己編譯生成的這個libffmpeg.so庫就可以了。