windows環(huán)境下編譯android中使用的FFmpeg

編譯環(huán)境是win10董虱,ndk r14,ffmpeg3.0
1.首先自然是下載NDKFFmpeg 申鱼。windows下編譯的話還要下載個(gè)MinGW
下載完畢后MinGW需要安裝愤诱。安裝時(shí)其實(shí)先裝的是個(gè)下載管理器,到選擇安裝選項(xiàng)的時(shí)候要選上msys-base和mingw32-gcc-ada兩項(xiàng)捐友。
另外兩個(gè)只是解壓就好了淫半。
然后開(kāi)始做編譯前的配置。

2.編輯FFmpeg目錄里的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)'

修改為

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

這是為了修改文件名格式

3.在FFmpeg目錄里創(chuàng)建ffmpegtemp目錄作為臨時(shí)文件目錄
創(chuàng)建build_android.sh文件作為編譯腳本

#!/bin/bash
export TMPDIR=F:/demo/ffmpeg-3.0/ffmpegtemp #設(shè)置編譯中臨時(shí)文件目錄科吭,不然會(huì)報(bào)錯(cuò) unable to create temporary file

# NDK的路徑昏滴,根據(jù)實(shí)際安裝位置設(shè)置
NDK=D:/adt-bundle-windows-x86_64-20131030/sdk/ndk-bundle

# 編譯針對(duì)的平臺(tái),這里選擇最低支持android-14, arm架構(gòu)对人,生成的so庫(kù)是放在libs/armeabi文件夾下的谣殊,若針對(duì)x86架構(gòu),要選擇arch-x86
PLATFORM=$NDK/platforms/android-14/arch-arm

# 工具鏈的路徑牺弄,arm-linux-androideabi-4.9與上面設(shè)置的PLATFORM對(duì)應(yīng)姻几,4.9為工具的版本號(hào)
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64

function build_one
{
./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-avdevice \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --target-os=linux \
    --arch=arm \
    --enable-cross-compile \
    --sysroot=$PLATFORM \
    --extra-cflags="-I$PLATFORM/usr/include" \

$ADDITIONAL_CONFIGURE_FLAG
sed -i '' 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h
sed -i '' 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h
sed -i '' 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h
sed -i '' 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h
sed -i '' 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h
sed -i '' 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h
sed -i '' 's/HAVE_CBRT 0/HAVE_CBRT 1/g' config.h
sed -i '' 's/HAVE_RINT 0/HAVE_RINT 1/g' config.h

make clean
make -j4
make install

}

# arm v7vfp
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
PREFIX=./android/$CPU-vfp
ADDITIONAL_CONFIGURE_FLAG=
build_one

# CPU=armv
# PREFIX=$(pwd)/android/$CPU
# ADDI_CFLAGS="-marm"
# build_one

#arm v6
#CPU=armv6
#OPTIMIZE_CFLAGS="-marm -march=$CPU"
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

#arm v7vfpv3
# CPU=armv7-a
# OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
# PREFIX=./android/$CPU
# ADDITIONAL_CONFIGURE_FLAG=
# build_one

#arm v7n
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=--enable-neon
#build_one

#arm v6+vfp
#CPU=armv6
#OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
#PREFIX=./android/${CPU}_vfp 
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

其中要注意TMPDIR、NDK势告、TOOLCHAIN蛇捌、--cross-prefix對(duì)應(yīng)實(shí)際目錄地址,可別漏了咱台。
./configure部分根據(jù)自己的需要調(diào)整功能络拌。全要的話庫(kù)文件未免太大。

4.方便起見(jiàn)在環(huán)境變量中的Path中添加路徑NDK路徑和MinGW的bin目錄路徑吵护,這兩個(gè)目錄通常長(zhǎng)類(lèi)似這樣:
D:\adt-bundle-windows-x86_64-20131030\sdk\ndk-bundle
C:\MingG\bin

5.運(yùn)行MinGW\bin目錄下的msys.bat盒音,cd到ffmpeg目錄執(zhí)行build_android.sh

6.等待,繼續(xù)等待馅而,還是等待祥诽。

7.理論上一直等下去就能見(jiàn)到光明,但是實(shí)際情況是開(kāi)始編譯后會(huì)報(bào)各種錯(cuò)瓮恭。萬(wàn)幸都不是什么關(guān)鍵性的地方出錯(cuò)雄坪。報(bào)錯(cuò)的地方自己修改下或者干脆注釋掉算了。大部分其實(shí)也不用管屯蹦。
修改后重新編譯维哈,重新等待。
(期間會(huì)生成相應(yīng)的config.h等文件登澜,以后在android studio里編譯執(zhí)行文件的時(shí)候會(huì)用到阔挠。)

8.在快要忘了我還在編譯著的時(shí)候,終于編譯完了脑蠕。會(huì)看到ffmpeg的目錄下生成了一個(gè)android目錄购撼。里面就是我們的成果了。

附1:看到lib里一堆.so是不是特?zé)┰昵聪桑縟on't panic迂求。可以把他們打包成一個(gè).so晃跺。只要修改下編譯配置揩局。(要注意的是,如果你那個(gè)configure文件已經(jīng)按上面方法修改過(guò)了掀虎,那么把他改回來(lái)凌盯。)
設(shè)置

–enable-static
–disable-shared

以及make install后面的:

$TOOLCHAIN/bin/arm-linux-androideabi-ld \
-rpath-link=$SYSROOT/usr/lib \
-L$SYSROOT/usr/lib \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$PREFIX/libffmpeg.so \
    libavcodec/libavcodec.a \
    libavfilter/libavfilter.a \
    libswresample/libswresample.a \
    libavformat/libavformat.a \
    libavutil/libavutil.a \
    libswscale/libswscale.a \
    -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
    $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a \

這里需要注意的是$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a這里的4.9要和上面的版本一致付枫。然后還要注意這里面的各種文件夾路徑。

改完大致長(zhǎng)這樣:(這個(gè)文件使用的ffmpeg版本和配置與上面的略有不同十气,這不重要励背,看自己需求)

#!/bin/bash
export TMPDIR=F:/demo/ffmpeg-3.2.4/ffmpegtemp #設(shè)置編譯中臨時(shí)文件目錄,不然會(huì)報(bào)錯(cuò) unable to create temporary file

# NDK的路徑砸西,根據(jù)自己的安裝位置進(jìn)行設(shè)置
NDK=D:/adt-bundle-windows-x86_64-20131030/sdk/ndk-bundle

# 編譯針對(duì)的平臺(tái)叶眉,可以根據(jù)自己的需求進(jìn)行設(shè)置
# 這里選擇最低支持android-14, arm架構(gòu),生成的so庫(kù)是放在
# libs/armeabi文件夾下的芹枷,若針對(duì)x86架構(gòu)衅疙,要選擇arch-x86
SYSROOT=$NDK/platforms/android-14/arch-arm/

# 工具鏈的路徑,根據(jù)編譯的平臺(tái)不同而不同
# arm-linux-androideabi-4.9與上面設(shè)置的PLATFORM對(duì)應(yīng)鸳慈,4.9為工具的版本號(hào)饱溢,
# 根據(jù)自己安裝的NDK版本來(lái)確定,一般使用最新的版本
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64

function build_one
{
    ./configure \
        --prefix=$PREFIX \
        --enable-neon \
        --enable-hwaccel=h264_vaapi \
        --enable-hwaccel=h264_dxva2 \
        --enable-hwaccel=mpeg4_vaapi \
        --enable-hwaccels \
        --enable-static \
        --enable-jni \
        --enable-mediacodec \
        --enable-asm \
        --disable-shared \
        --disable-doc \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-ffserver \
        --disable-avdevice \
        --disable-doc \
        --disable-symver \
        --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
        --target-os=linux \
        --arch=arm \
        --enable-cross-compile \
        --sysroot=$SYSROOT \
        --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
        --extra-ldflags="$ADDI_LDFLAGS" \
        $ADDITIONAL_CONFIGURE_FLAG
    make clean
    make -j4
    make install

    $TOOLCHAIN/bin/arm-linux-androideabi-ld \
    -rpath-link=$SYSROOT/usr/lib \
    -L$SYSROOT/usr/lib \
    -L$PREFIX/lib \
    -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
    $PREFIX/libffmpeg.so \
        libavcodec/libavcodec.a \
        libavfilter/libavfilter.a \
        libswresample/libswresample.a \
        libavformat/libavformat.a \
        libavutil/libavutil.a \
        libswscale/libswscale.a \
        -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
        $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a \
}
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=--enable-neon
build_one

# CPU=armv
# PREFIX=$(pwd)/android/$CPU
# ADDI_CFLAGS="-marm"
# build_one

#arm v6
#CPU=armv6
#OPTIMIZE_CFLAGS="-marm -march=$CPU"
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

#arm v7vfpv3
# CPU=armv7-a
# OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
# PREFIX=./android/$CPU
# ADDITIONAL_CONFIGURE_FLAG=
# build_one

#arm v7n
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=--enable-neon
#build_one

#arm v6+vfp
#CPU=armv6
#OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
#PREFIX=./android/${CPU}_vfp 
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

這樣編譯出來(lái)的就是一個(gè)單獨(dú)的libffmpeg.so文件走芋。

附2:編譯這個(gè)問(wèn)題其實(shí)前后研究了三天绩郎,各種出錯(cuò),各種找不到文件啦翁逞,無(wú)法創(chuàng)建可執(zhí)行文件啦肋杖。放棄了一個(gè)禮拜后今天再拿出來(lái)整理了一遍,忽然挖函,他就成功了状植。

th.jpg

相關(guān)github項(xiàng)目地址:https://github.com/codeqian/ffmpegCLDemo
(誠(chéng)邀各位多去點(diǎn)幾個(gè)star)


參考:
Android最簡(jiǎn)單的基于FFmpeg的例子(一)---編譯FFmpeg類(lèi)庫(kù)
Android最簡(jiǎn)單的基于FFmpeg的例子(三)---編譯FFmpeg成一個(gè)SO庫(kù)
FFmpeg 編譯(2)--單一版

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市怨喘,隨后出現(xiàn)的幾起案子津畸,更是在濱河造成了極大的恐慌,老刑警劉巖必怜,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肉拓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡梳庆,警方通過(guò)查閱死者的電腦和手機(jī)暖途,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)靠益,“玉大人,你說(shuō)我怎么就攤上這事残揉‰屎螅” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵抱环,是天一觀的道長(zhǎng)壳快。 經(jīng)常有香客問(wèn)我纸巷,道長(zhǎng),這世上最難降的妖魔是什么眶痰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任瘤旨,我火速辦了婚禮,結(jié)果婚禮上竖伯,老公的妹妹穿的比我還像新娘存哲。我一直安慰自己,他們只是感情好七婴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布祟偷。 她就那樣靜靜地躺著,像睡著了一般打厘。 火紅的嫁衣襯著肌膚如雪修肠。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天户盯,我揣著相機(jī)與錄音嵌施,去河邊找鬼。 笑死莽鸭,一個(gè)胖子當(dāng)著我的面吹牛吗伤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒋川,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼牲芋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了捺球?” 一聲冷哼從身側(cè)響起缸浦,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氮兵,沒(méi)想到半個(gè)月后裂逐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泣栈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年卜高,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片南片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掺涛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疼进,到底是詐尸還是另有隱情薪缆,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布伞广,位于F島的核電站拣帽,受9級(jí)特大地震影響疼电,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜减拭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一蔽豺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拧粪,春花似錦修陡、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至啥纸,卻和暖如春号杏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背斯棒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工盾致, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荣暮。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓庭惜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親穗酥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子护赊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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