编译FFmpeg4.3.1 、x264并移植到Android

1、前言

FFmpeg 既是一款音视频编解码工具,同时也是一组音视频编解码开发套件。

2、准备工作

3、下载NDK 在linux环境中,使用命令如下:

复制代码
#1.进入用户目录
cd /usr

#2.新建一个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.进入用户目录
cd /usr

#2.新建一个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.进入用户目录
cd /usr

#2.新建一个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.进入x264解压之后的目录
cd /x264-master

#2.新建一个编译脚本build_x264_android-v7a.sh
vim build_x264_android-v7a.sh

#3.执行build_x264_android-v7a.sh
sh build_x264_android-v7a.sh

#4.命令执行成功后会后如下内容
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
#静态库-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内容如下:

复制代码
#!/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

#编译结果存放目录
PREFIX=$(pwd)/android/armeabi-v7a

function build_android
{
#如果你需要的是动态库,--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

【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击788280672加群免费领取~

7、开始编译FFmpeg并依赖x264

复制代码
#1.进入ffmpeg解压之后的目录
cd /ffmpeg

#2.新建一个编译脚本build_ffmpeg_with_x264.sh
vim build_ffmpeg_with_x264.sh

#3.执行build_ffmpeg_with_x264.sh,如果提示缺少xxx.mak,则先执行一下./configure,然后继续
sh build_ffmpeg_with_x264.sh

#4.命令执行成功后会有如下内容
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

#静态库
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脚本内容:

复制代码
#!/bin/bash

echo ">>>>>>>>> 编译ffmpeg <<<<<<<<"

#NDK路径.
export NDK=/usr/android/android-ndk-r21b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64

#如果只需要单独的ffmpeg,不需要依赖x264,去掉$ADD_H264_FEATURE这句就可以了;
#如果你需要的是动态库,--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的静态库地址
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、合并编译出来的静态库为一个单独的libffmpeg.so

复制代码
#1.进入ffmpeg静态库目录
cd android/armv7-a/lib/
#2.新建union_ffmpeg_so.sh
vim union_ffmpeg_so.sh
#3.执行union_ffmpeg_so.sh
sh union_ffmpeg_so.sh
#4.执行成功后会看到如下内容
-rwxr-xr-x. 1 root root 17863896 Sep 18 20:00 libffmpeg.so

union_ffmpeg_so.sh脚本内容如下:

复制代码
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项目中步骤如下:

1.新建一个native项目,然后进行如下配置

2.配置build.gradle,如果你是按照我这样在module中导入的ffmpeg,则在app-build.gradle需要添加 ndk{ abiFilters 'armeabi-v7a' }

3.新建andr_ffmpeg.cpp

4.新建AndrFFmpeg.java

5.调用AndrFFmpeg->getFFmpegVersion()、AndrFFmpeg.getAVCodeInfo()

10、如有遗漏、错误的地方欢迎指正、拍砖~~~~

原文链接 编译FFmpeg4.3.1 、x264并移植到Android

相关推荐
每次的天空2 小时前
Android学习总结之算法篇五(字符串)
android·学习·算法
Gracker3 小时前
Android Weekly #202513
android
张拭心5 小时前
工作九年程序员的三月小结
android·前端
每次的天空5 小时前
Flutter学习总结之Android渲染对比
android·学习·flutter
鸿蒙布道师7 小时前
鸿蒙NEXT开发土司工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
智想天开7 小时前
11.使用依赖注入容器实现松耦合
android
yunteng5218 小时前
音视频(四)android编译
android·ffmpeg·音视频·x264·x265
tangweiguo030519879 小时前
(kotlin) Android 13 高版本 图片选择、显示与裁剪功能实现
android·开发语言·kotlin
匹马夕阳9 小时前
(一)前端程序员转安卓开发分析和规划建议
android·前端
Kika写代码9 小时前
【Android】UI开发:XML布局与Jetpack Compose的全面对比指南
android·xml·ui