雖然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ù)