一鍵編譯FFmpeg Android arm64位和32位共享庫(kù)(armeabi-v7a arm64-v8a)

雖然32位的庫(kù)在64位機(jī)器上也能正常運(yùn)行仙蛉,但是經(jīng)過測(cè)試亿蒸,用小米8轉(zhuǎn)碼64位的庫(kù)比32位還是要快10%左右苫耸,所以還是同時(shí)提供32位和64位比較好。

  • 根據(jù)此教程編譯出來(lái)的FFmpeg支持mediacodec硬件解碼h264,h265,不支持硬件編碼扯夭;編碼h264可以用x264。文中的編譯腳本可以直接編譯出arm32位和64位的動(dòng)態(tài)鏈接庫(kù)。

1.搭建編譯環(huán)境

1.1安裝ubuntu14.04住练,安裝完成后執(zhí)行以下命令

apt-get update
apt-get install yasm
apt-get install pkg-config

1.2下載ndk

我用的是ndk r15c,下載ndk r15c
將ndk下載到 /home/ndk/目錄下愁拭,下載完成后執(zhí)行unzip android-ndk-r15c-linux-x86_64.zip解壓

1.3下載FFmpeg

關(guān)于FFmpeg版本澎羞,推薦3.4這個(gè)分支的最新版本就可以了,因?yàn)?.0和4.1不知道為什么都沒有mediacodec硬件加速敛苇,還是我自己哪里沒搞明白妆绞?知道的朋友可以留言討論下顺呕。
這里我們就下載3.4.5,下載FFmpeg n3.4.5括饶,也可以自己選擇最新版株茶,查看最新版
下載完成后解壓進(jìn)入根目錄,執(zhí)行./configure --list-hwaccels图焰,可以看到支持的硬件加速:

在這里插入圖片描述

./configure --list-encoders查看支持的編碼器

./configure --list-decoders查看支持的解碼器
可以看到FFmpeg只支持mediacodec解碼启盛,并不支持mediacodec編碼,如果要使用FFmpeg進(jìn)行編碼的話需要引入x264技羔,需要編碼hevc的話還要引入x265僵闯。

1.4下載x264

x264的源碼并沒有包含在FFmpeg源碼中,要啟用libx264需要自己下載源碼藤滥,下載x264源碼
將x264下載到FFmpeg源碼根目錄鳖粟,執(zhí)行tar -zxvf x264-stable.tar.gz解壓,將解壓出來(lái)的目錄x264-stable重命名為x264拙绊。

2.編譯

2.1編譯x264

進(jìn)入x264源碼目錄向图,新建build.sh,寫入以下腳本:

#!/bin/bash
NDK=/home/ndk/android-ndk-r15c

configure()
{
    CPU=$1
    PREFIX=$(pwd)/android/$CPU
    HOST=""
    CROSS_PREFIX=""
    SYSROOT=""
    if [ "$CPU" == "armv7-a" ]
    then
        HOST=arm-linux
        SYSROOT=$NDK/platforms/android-21/arch-arm/
        CROSS_PREFIX=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
    else
        HOST=aarch64-linux
        SYSROOT=$NDK/platforms/android-21/arch-arm64/
        CROSS_PREFIX=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-
    fi
    ./configure \
    --prefix=$PREFIX \
    --host=$HOST \
    --enable-pic \
    --enable-static \
    --enalbe-neon \
    --extra-cflags="-fPIE -pie" \
    --extra-ldflags="-fPIE -pie" \
    --cross-prefix=$CROSS_PREFIX \
    --sysroot=$SYSROOT
}

build()
{
    make clean
    cpu=$1
    echo "build $cpu"

    configure $cpu
    #-j<CPU核心數(shù)>
    make -j4
    make install
}

build arm64
build armv7-a

保存退出标沪,chmod +x build.sh賦予腳本執(zhí)行權(quán)限榄攀,執(zhí)行腳本編譯,編譯完成后查看是否在x264源碼目錄生成了android目錄金句,如果一切正常檩赢,可以分別在android/armv7-a/lib和android/arm64/lib目錄下找到編譯好的靜態(tài)庫(kù)libx264.a。

2.2修改configure

進(jìn)入FFmpeg源碼根目錄违寞,用vim打開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)'  

2.3編譯FFmpeg

進(jìn)入FFmpeg源碼根目錄,新建build.sh坞靶,寫入以下腳本:

#!/bin/bash
NDK=/home/ndk/android-ndk-r15c
ADDI_CFLAGS="-fPIE -pie"
ADDI_LDFLAGS="-fPIE -pie"

configure()
{
    CPU=$1
    PREFIX=$(pwd)/android/$CPU
    x264=$(pwd)/x264/android/$CPU
    HOST=""
    CROSS_PREFIX=""
    SYSROOT=""
    ARCH=""
    if [ "$CPU" == "armv7-a" ]
    then
        ARCH="arm"
        HOST=arm-linux
        SYSROOT=$NDK/platforms/android-21/arch-arm/
        CROSS_PREFIX=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
    else
        ARCH="aarch64"
        HOST=aarch64-linux
        SYSROOT=$NDK/platforms/android-21/arch-arm64/
        CROSS_PREFIX=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-
    fi
    ./configure \
    --prefix=$PREFIX \
    --disable-encoders \
    --disable-decoders \
    --disable-avdevice \
    --disable-static \
    --disable-doc \
    --disable-ffplay \
    --disable-network \
    --disable-doc \
    --disable-symver \
    --enable-neon \
    --enable-shared \
    --enable-libx264 \
    --enable-gpl \
    --enable-pic \
    --enable-jni \
    --enable-pthreads \
    --enable-mediacodec \
    --enable-encoder=aac \
    --enable-encoder=gif \
    --enable-encoder=libopenjpeg \
    --enable-encoder=libmp3lame \
    --enable-encoder=libwavpack \
    --enable-encoder=libx264 \
    --enable-encoder=mpeg4 \
    --enable-encoder=pcm_s16le \
    --enable-encoder=png \
    --enable-encoder=srt \
    --enable-encoder=subrip \
    --enable-encoder=yuv4 \
    --enable-encoder=text \
    --enable-decoder=aac \
    --enable-decoder=aac_latm \
    --enable-decoder=libopenjpeg \
    --enable-decoder=mp3 \
    --enable-decoder=mpeg4_mediacodec \
    --enable-decoder=pcm_s16le \
    --enable-decoder=flac \
    --enable-decoder=flv \
    --enable-decoder=gif \
    --enable-decoder=png \
    --enable-decoder=srt \
    --enable-decoder=xsub \
    --enable-decoder=yuv4 \
    --enable-decoder=vp8_mediacodec \
    --enable-decoder=h264_mediacodec \
    --enable-decoder=hevc_mediacodec \
    --enable-hwaccel=h264_mediacodec \
    --enable-hwaccel=mpeg4_mediacodec \
    --enable-ffmpeg \
    --enable-bsf=aac_adtstoasc \
    --enable-bsf=h264_mp4toannexb \
    --enable-bsf=hevc_mp4toannexb \
    --enable-bsf=mpeg4_unpack_bframes \
    --enable-cross-compile \
    --cross-prefix=$CROSS_PREFIX \
    --target-os=android \
    --arch=$ARCH \
    --sysroot=$SYSROOT \
    --extra-cflags="-I$x264/include $ADDI_CFLAGS" \
    --extra-ldflags="-L$x264/lib"
}

build()
{
    make clean
    cpu=$1
    echo "build $cpu"
    
    configure $cpu
    make -j4
    make install
}

build arm64
build armv7-a

保存退出憔狞,chmod +x build.sh賦予腳本執(zhí)行權(quán)限,執(zhí)行腳本編譯彰阴,編譯完成后可以在下面目錄查看生成.so文件:

在這里插入圖片描述

至此就編譯完成了瘾敢,接下來(lái)就是集成到工程中調(diào)用,如何集成到工程中供調(diào)用可以看這篇文章:Android集成FFmpeg并實(shí)現(xiàn)視頻轉(zhuǎn)碼
編譯好的文件:FFmpeg Android動(dòng)態(tài)鏈接庫(kù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尿这,一起剝皮案震驚了整個(gè)濱河市簇抵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌射众,老刑警劉巖碟摆,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異叨橱,居然都是意外死亡典蜕,警方通過查閱死者的電腦和手機(jī)断盛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)愉舔,“玉大人钢猛,你說(shuō)我怎么就攤上這事⌒停” “怎么了命迈?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)火的。 經(jīng)常有香客問我壶愤,道長(zhǎng),這世上最難降的妖魔是什么馏鹤? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任征椒,我火速辦了婚禮,結(jié)果婚禮上假瞬,老公的妹妹穿的比我還像新娘陕靠。我一直安慰自己迂尝,他們只是感情好脱茉,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著垄开,像睡著了一般琴许。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溉躲,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天榜田,我揣著相機(jī)與錄音,去河邊找鬼锻梳。 笑死箭券,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疑枯。 我是一名探鬼主播辩块,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼荆永!你這毒婦竟也來(lái)了废亭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤具钥,失蹤者是張志新(化名)和其女友劉穎豆村,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骂删,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掌动,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年四啰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粗恢。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拟逮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出适滓,到底是詐尸還是另有隱情敦迄,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布凭迹,位于F島的核電站罚屋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嗅绸。R本人自食惡果不足惜脾猛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鱼鸠。 院中可真熱鬧猛拴,春花似錦、人聲如沸蚀狰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)麻蹋。三九已至跛溉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扮授,已是汗流浹背芳室。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刹勃,地道東北人堪侯。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像荔仁,于是被迫代替她去往敵國(guó)和親伍宦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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