ubuntu下编译ffmpeg的过程

最后都变了- 提交于 2020-02-28 01:02:53

后续一段时间准备音视频相关知识的学习,所以先编译ffmpeg做练习用.

以最新版本的android api 29, ndk21, ffmpeg4.2,编译ffmpeg库文件.

1,环境配置,

1)安装yasm,如果没有安装会报nasm not found的错误.

下载 http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz

解压后,进入目录:cd yasm-1.3.0

执行配置 ./configure

编译 :make

安装 make install (这一步使用root权限)

2,ndk的配置,

1)下载 https://developer.android.google.cn/ndk/downloads/ 选择 linux版本的ndk

2)解压后,配置ndk环境

vim ~/.bashrc
# 在文件末尾添加
export NDKROOT=/home/**/ndk/android-ndk-r21
exprot PATH=$NDKROOT:$PATH
# 保存退出,更新一下环境变量
source ~/.bashrc

或者配置 ~/.profile文件,功能是类似的.

.bashrc和.profile这两种配置环境参数的区别,大概时profile是以login方式进入bash环境运行的,意思是要用户登录才行;

bashrc是交互式non-login方式进入bash运行,用户可以不登录,只要以用户身份运行就会读取这个文件.

配好环境,执行./ndk-build 不提示命令找不到就OK了.

3, 下载ffmpeg源码包,因为ubuntu从github clone太慢,还是从官网下载较好

http://www.ffmpeg.org/download.html

下载后解压就OK了

4,编译共享库

创建.sh脚本文件:build_bash.sh

#!/bin/bash
#这里NDK路径路径改成自己的,
#交叉编译的工具链指向NDK目录下的位置,改成自己的
NDK=/home/linjw/Android/Sdk/ndk/21.0.6113669
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
API=29

function build_android
{
echo "Compiling FFmpeg for $CPU"
#configure的目录根据ffmpeg解压路径选择.
./ffmpeg-4.2.2/configure \
--prefix=$PREFIX \
--disable-neon \
--disable-hwaccels \
--disable-gpl \
--disable-postproc \
--enable-shared \
--enable-jni \
--disable-mediacodec \
--disable-decoder=h264_mediacodec \
--disable-static \
--disable-doc \
--disable-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" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}

#x86_64
ARCH=x86_64
CPU=x86-64
CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
build_android

#armv8-a
ARCH=arm64
CPU=armv8-a
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
#armv7-a
ARCH=arm
CPU=armv7-a
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

环境配置好,脚本写好,整个编译过程还是很顺利的,这里只针对cpu架构armv7-a,armv8-a,x86-64编译共享库.

编译完成后,会在你执行bash脚本的目录下生成android文件下,里面就是完成编译的共享库,及头文件.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!