FFmpeg源碼的編譯和裁剪得哆,生成安卓使用的.so庫

版權(quán)聲明:本文為衛(wèi)偉學(xué)習(xí)總結(jié)文章脯颜,轉(zhuǎn)載請注明出處!
本文在Linux環(huán)境下編譯ffmpeg源碼:

  • 1.準(zhǔn)備工作:下載ndk和ffmpeg源碼贩据,我的是android-ndk-r16b-linux-x86_64和ffmpeg-3.3.9

  • 2.如圖栋操,將下載的ndk和ffmpeg源碼解壓,放在同一目錄下

    關(guān)于版本的選擇問題饱亮,大家基本都用2.x.x的版本矾芙。高版本與低版本相比,一般性能和各個方面都會有一些改進(jìn)近上,比如視頻解碼方法 avcodec_decode_video2 在 3.x.x 的版本后取而代之的是 avcodec_send_packet 和 avcodec_receive_frame 剔宪。因此如果你想去查一下 3.x.x 版本的 api 資料可能會發(fā)現(xiàn)比較少,或者開發(fā)過程中遇到某些問題也會比較棘手。因此建議大家學(xué)習(xí)時盡量使用較高的版本葱绒,開發(fā)時盡量使用大眾的版本感帅。
    下載完成后把下載好的 ndk 和 FFmpeg 用 xftp 推到 linux 云主機(jī)上。把 ndk 解壓到 /lib/ndk 目錄下地淀,然后配置 NDK_PATH 環(huán)境變量:
    當(dāng)在控制窗口中輸入echo $NDK_PATH 命令后失球,顯示出/lib/ndk/android-ndk-r16b 表示配置成功。
    一帮毁、FFmpeg庫編譯的思想
    第三方庫編譯的通用思想:

    • 1.看了看README.md
    • 2.編譯項(xiàng)目(動靜態(tài)庫)需要MakeFile管理她倘,如果已經(jīng)有寫好的MakeFile可以嘗試著用make命令去編譯,如果沒有需要自己寫Makefile或者采用cmake構(gòu)建
    • 3.如果報錯需要解決作箍,一般情況下都是Makefile的一些配置文件沒有生成硬梁,所有一般需要運(yùn)行configure文件
    • 4.生成配置文件之后,再次運(yùn)行make,但是編譯后的文件(elf,so,a)只能在當(dāng)前類型系統(tǒng)上運(yùn)行
    • 5.如果需要跑到android或者ios那么需要交叉編譯
    • 6.因此我們一般都需要往configure文件里面?zhèn)饕恍┚幾g參數(shù)

FFmpeg 直接解壓到工作目錄下:

我們發(fā)現(xiàn)目錄下已經(jīng)有寫好的 Makefile 編譯文件了胞得,那是不是可以直接編譯運(yùn)行呢荧止?使用 make 命令出現(xiàn)如下錯誤:

Makefile:2: config.mak: No such file or directory
Makefile:67: /common.mak: No such file or directory
Makefile:114: /libavutil/Makefile: No such file or directory
Makefile:114: /library.mak: No such file or directory
Makefile:116: /doc/Makefile: No such file or directory
Makefile:206: /tests/Makefile: No such file or directory
make: *** No rule to make target '/tests/Makefile'.  Stop.

這些文件怎么來?在 configure 腳本文件里面阶剑,當(dāng)然剛開始基本看不懂,后來查看紅橙博客跃巡,只需要再寫一個build,sh腳本來執(zhí)行./configure腳本文件即可,至于需要傳遞哪些參數(shù)牧愁,怎么裁剪 so 動態(tài)庫這里先不詳細(xì)講素邪,大家可以用 來查看。

根據(jù)自身需求編譯FFmpeg庫文件腳本ffmpeg_build.sh內(nèi)容:

#!/bin/bash
. /etc/profile
function build
{
echo "start build ffmpeg for $ARCH"
./configure --target-os=linux \
--prefix=$PREFIX --arch=$ARCH \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-asm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--cross-prefix=$CROSS_COMPILE \
--enable-cross-compile \
--sysroot=$SYSROOT \
--enable-small \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "build ffmpeg for $ARCH finished"
}

ARCH=arm
CPU=arm
PREFIX=$(pwd)/android/$ARCH
TOOLCHAIN=$NDK_PATH/android-toolchains/arm-19
CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
ADDI_CFLAGS="-marm"
SYSROOT=$TOOLCHAIN/sysroot
build

如果大家不出意外會得到以上文件猪半,我們發(fā)現(xiàn)編譯出來是 linux 的命名方式兔朦。只能在Linux平臺下運(yùn)行。如果想到android平臺下運(yùn)行磨确,還需要用到NDK目錄下make_standalone_toolchain.py交叉工具鏈沽甥,生成android平臺的so庫文件

ubuntu@VM-0-9-ubuntu:~/ffmpeg-3.3.9/android/arm/lib$ ls
libavcodec.so            libavformat.so            libswresample.so
libavcodec.so.57         libavformat.so.57         libswresample.so.2
libavcodec.so.57.89.100  libavformat.so.57.71.100  
libswresample.so.2.7.100
libavdevice.so           libavutil.so              libswscale.so
libavdevice.so.57        libavutil.so.55           libswscale.so.4
libavdevice.so.57.6.100  libavutil.so.55.58.100    libswscale.so.4.6.100
libavfilter.so           libpostproc.so            pkgconfig
libavfilter.so.6         libpostproc.so.54
libavfilter.so.6.82.100  libpostproc.so.54.5.100

用的ndk build/tools路徑下的make-standalone-toolchain.py 腳本文件

 book@www.100ask.org:/lib/ndk/androanid-ndk-r20/build/tools$ sudo ./make_standalone_toolchain.py --arch arm --api 19 --install-dir /lib/ndk/android-ndk-r20/android-toolchains/android-19/arch-arm

我們還需要在 configure 中改一下生成文件名的格式:

# SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
# LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
# SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
# SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

替換成如下

添加congfigure和ffmpg_build.sh的執(zhí)行權(quán)限:

chmod u+x ffmpeg_build.sh 

執(zhí)行ffmpeg_build.sh腳本后生成如下圖綠色的顏色的.so文件就可以在arm平臺上運(yùn)行啦。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乏奥,一起剝皮案震驚了整個濱河市摆舟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邓了,老刑警劉巖恨诱,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骗炉,居然都是意外死亡照宝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門痕鳍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硫豆,“玉大人龙巨,你說我怎么就攤上這事笼呆⌒芟欤” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵诗赌,是天一觀的道長汗茄。 經(jīng)常有香客問我,道長铭若,這世上最難降的妖魔是什么洪碳? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮叼屠,結(jié)果婚禮上瞳腌,老公的妹妹穿的比我還像新娘。我一直安慰自己镜雨,他們只是感情好嫂侍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荚坞,像睡著了一般挑宠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颓影,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天各淀,我揣著相機(jī)與錄音,去河邊找鬼诡挂。 笑死碎浇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的璃俗。 我是一名探鬼主播南捂,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旧找!你這毒婦竟也來了溺健?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤钮蛛,失蹤者是張志新(化名)和其女友劉穎鞭缭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體魏颓,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岭辣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了甸饱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沦童。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡仑濒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出偷遗,到底是詐尸還是另有隱情墩瞳,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布氏豌,位于F島的核電站喉酌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泵喘。R本人自食惡果不足惜泪电,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纪铺。 院中可真熱鬧相速,春花似錦、人聲如沸鲜锚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春奔缠,著一層夾襖步出監(jiān)牢的瞬間看成,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓抠刺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親摘昌。 傳聞我的和親對象是個殘疾皇子速妖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容