1、前言
FFmpeg 既是一款音視頻編解碼工具,同時(shí)也是一組音視頻編解碼開發(fā)套件。
2、準(zhǔn)備工作
- 系統(tǒng):Linux
- NDK:android-ndk-r21b-linux-x86_64.zip
- FFmpeg:ffmpeg-snapshot.tar.bz2
- x264:x264
3、下載NDK 在linux環(huán)境中,使用命令如下:
?
#1.進(jìn)入用戶目錄
cd /usr
#2.新建一個(gè)android文件夾用來存放ndk
mkdir android
cd /android
#3.下載ndk
wget https://dl.google.com/android/repository/android-ndk-r21b-linux-x86_64.zip
#4.安裝解壓工具
yum -y install unzip
#5.解壓ndk
unzip android-ndk-r21b-linux-x86_64.zip
4、下載FFmpeg
#1.進(jìn)入用戶目錄
cd /usr
#2.新建一個(gè)ffmpeg文件夾用來存放ffmpeg
mkdir ffmpeg
cd /ffmpeg
#3.下載ffmpeg
wget https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
#4.解壓ffmpeg
tar -xf ffmpeg-snapshot.tar.bz2
5、下載x264
#1.進(jìn)入用戶目錄
cd /usr
#2.新建一個(gè)x264文件夾用來存放x264
mkdir x264
cd /x264
#3.下載x264
wget https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2
#4.解壓x264
tar -xf x264-master.tar.bz2
6、開始編譯x264
#1.進(jìn)入x264解壓之后的目錄
cd /x264-master
#2.新建一個(gè)編譯腳本build_x264_android-v7a.sh
vim build_x264_android-v7a.sh
#3.執(zhí)行build_x264_android-v7a.sh
sh build_x264_android-v7a.sh
#4.命令執(zhí)行成功后會(huì)后如下內(nèi)容
cd /android/armeabi-v7a
#頭文件-include
-rw-r--r--. 1 root root 172 Sep 18 03:01 x264_config.h
-rw-r--r--. 1 root root 47960 Sep 18 03:01 x264.h
#靜態(tài)庫-lib
-rw-r--r--. 1 root root 1820080 Sep 18 03:01 libx264.a
drwxr-xr-x. 2 root root 21 Sep 18 03:01 pkgconfig
build_x264_android-v7a.sh內(nèi)容如下:
#!/bin/bash
echo ">>>>>>>>> 編譯x264 android-v7a <<<<<<<<"
# 你的ndk路徑,如果你是按照以上步驟來的,此處可以不用修改
export NDK=/usr/android/android-ndk-r21b
export HOST_TAG=linux-x86_64
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG
#C、C++編譯器
export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang # c compiler path
export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++ # c++ compiler path
#編譯結(jié)果存放目錄
PREFIX=$(pwd)/android/armeabi-v7a
function build_android
{
#如果你需要的是動(dòng)態(tài)庫,--enable-static 改為 --enable-shared
echo ">>>>>>>>開始編譯<<<<<<<<<<"
./configure \
--prefix=$PREFIX \
--enable-static \
--enable-pic \
--disable-asm \
--disable-opencl \
--disable-cli \
--host=arm-linux \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--sysroot=$TOOLCHAIN/sysroot \
make clean
make
make install
echo ">>>>>>編譯完成!<<<<<<"
}
build_android
【免費(fèi)分享】音視頻學(xué)習(xí)資料包、大廠面試題、技術(shù)視頻和學(xué)習(xí)路線圖,資料包括(C/C++,Linux,F(xiàn)Fmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以點(diǎn)擊788280672加群免費(fèi)領(lǐng)取~
7、開始編譯FFmpeg并依賴x264
#1.進(jìn)入ffmpeg解壓之后的目錄
cd /ffmpeg
#2.新建一個(gè)編譯腳本build_ffmpeg_with_x264.sh
vim build_ffmpeg_with_x264.sh
#3.執(zhí)行build_ffmpeg_with_x264.sh,如果提示缺少xxx.mak,則先執(zhí)行一下./configure,然后繼續(xù)
sh build_ffmpeg_with_x264.sh
#4.命令執(zhí)行成功后會(huì)有如下內(nèi)容
cd /android/armv7-a
drwxr-xr-x. 2 root root 20 Sep 18 19:54 bin
drwxr-xr-x. 9 root root 137 Sep 18 19:54 include
drwxr-xr-x. 3 root root 214 Sep 18 20:00 lib
drwxr-xr-x. 3 root root 20 Sep 18 19:54 share
#頭文件
cd /include
drwxr-xr-x. 2 root root 4096 Sep 18 19:54 libavcodec
drwxr-xr-x. 2 root root 80 Sep 18 19:54 libavfilter
drwxr-xr-x. 2 root root 55 Sep 18 19:54 libavformat
drwxr-xr-x. 2 root root 4096 Sep 18 19:54 libavutil
drwxr-xr-x. 2 root root 44 Sep 18 19:54 libpostproc
drwxr-xr-x. 2 root root 43 Sep 18 19:54 libswresample
drwxr-xr-x. 2 root root 40 Sep 18 19:54 libswscale
#靜態(tài)庫
cd /lib
-rw-r--r--. 1 root root 11900662 Sep 18 19:54 libavcodec.a
-rw-r--r--. 1 root root 3672928 Sep 18 19:54 libavfilter.a
-rw-r--r--. 1 root root 3425150 Sep 18 19:54 libavformat.a
-rw-r--r--. 1 root root 531514 Sep 18 19:54 libavutil.a
-rw-r--r--. 1 root root 28484 Sep 18 19:54 libpostproc.a
-rw-r--r--. 1 root root 98088 Sep 18 19:54 libswresample.a
-rw-r--r--. 1 root root 445110 Sep 18 19:54 libswscale.a
drwxr-xr-x. 2 root root 158 Sep 18 19:54 pkgconfig
build_ffmpeg_with_x264.sh腳本內(nèi)容:
#!/bin/bash
echo ">>>>>>>>> 編譯ffmpeg <<<<<<<<"
#NDK路徑.
export NDK=/usr/android/android-ndk-r21b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
#如果只需要單獨(dú)的ffmpeg,不需要依賴x264,去掉$ADD_H264_FEATURE這句就可以了;
#如果你需要的是動(dòng)態(tài)庫,--enable-static 改為 --disable-static,--disable-shared 改為 --enable-shared
function build_android
{
echo "開始編譯 $CPU"
./configure \
--prefix=$PREFIX \
--enable-neon \
--enable-hwaccels \
--enable-gpl \
--enable-postproc \
--disable-shared \
--disable-debug \
--enable-small \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-static \
--disable-doc \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS"
$ADD_H264_FEATURE
make clean
make
make install
echo "編譯完成 $CPU"
}
#x264庫所在的位置,ffmpeg 需要鏈接 x264
LIB_DIR=/usr/x264/x264-master/android/armeabi-v7a;
#x264的頭文件地址
INC="$LIB_DIR/include"
#x264的靜態(tài)庫地址
LIB="$LIB_DIR/lib"
ADD_H264_FEATURE="--enable-encoder=aac \
--enable-decoder=aac \
--enable-gpl \
--enable-encoder=libx264 \
--enable-libx264 \
--extra-cflags=-I$INC \
--extra-ldflags=-L$LIB "
#armv7-a
ARCH=arm
CPU=armv7-a
API=21
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
build_android
8、合并編譯出來的靜態(tài)庫為一個(gè)單獨(dú)的libffmpeg.so
#1.進(jìn)入ffmpeg靜態(tài)庫目錄
cd android/armv7-a/lib/
#2.新建union_ffmpeg_so.sh
vim union_ffmpeg_so.sh
#3.執(zhí)行union_ffmpeg_so.sh
sh union_ffmpeg_so.sh
#4.執(zhí)行成功后會(huì)看到如下內(nèi)容
-rwxr-xr-x. 1 root root 17863896 Sep 18 20:00 libffmpeg.so
union_ffmpeg_so.sh腳本內(nèi)容如下:
echo "開始編譯ffmpeg so"
#NDK路徑.
export NDK=/usr/android/android-ndk-r21b
PLATFORM=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
PREFIX=$(pwd)
#如果不需要依賴x264,去掉/usr/x264/x264-master/android/armeabi-v7a/lib/libx264.a \就可以了
$TOOLCHAIN/bin/arm-linux-androideabi-ld \
-rpath-link=$PLATFORM/usr/lib \
-L$PLATFORM/usr/lib \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$PREFIX/libffmpeg.so \
libavcodec.a \
libavfilter.a \
libswresample.a \
libavformat.a \
libavutil.a \
libpostproc.a \
libswscale.a \
/usr/x264/x264-master/android/armeabi-v7a/lib/libx264.a \
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a \
echo "完成編譯ffmpeg so"
9、移植編譯的libffmpeg.so及頭文件到Androidstudio項(xiàng)目中步驟如下:
1.新建一個(gè)native項(xiàng)目,然后進(jìn)行如下配置
2.配置build.gradle,如果你是按照我這樣在module中導(dǎo)入的ffmpeg,則在app-build.gradle需要添加 ndk{ abiFilters 'armeabi-v7a' }
3.新建andr_ffmpeg.cpp
4.新建AndrFFmpeg.java
5.調(diào)用AndrFFmpeg->getFFmpegVersion()、AndrFFmpeg.getAVCodeInfo()
10、如有遺漏、錯(cuò)誤的地方歡迎指正、拍磚~~~~文章來源:http://www.zghlxwxcb.cn/news/detail-804656.html
原文鏈接?編譯FFmpeg4.3.1 、x264并移植到Android文章來源地址http://www.zghlxwxcb.cn/news/detail-804656.html
到了這里,關(guān)于編譯FFmpeg4.3.1 、x264并移植到Android的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!