Android 使用 FFmpeg 编译生成.so文件

本文详细介绍如何在安卓平台上编译FFmpeg库,包括所需环境搭建、配置文件修改及编译脚本编写等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,必要准备

    一般需要在android手机上使用FFmpeg ,首先需要将将FFmpeg 编译为android 能使用的.so 文件(动态库)。所以我们首先需要准备:

1,编译环境——Windows,Mac OS,Linux……不同的系统在具体操作时可能会有所不同。以本文为例,锁使用的编译环境是在阿里云服务上搭建Ubuntu(Linux系统),大致配置如下(仅做学习使用):

阿里云服务器配置

2,FFmpeg源码

源码下载地址
本文以ffmpeg-3.2.1.tar.gz版本为例 。

(以本文为例,登录阿里服务器后)定位到对应的文件目录下使用命令:

wget https://ffmpeg.org/releases/ffmpeg-3.2.1.tar.gz

下载源码并使用解压到当前目录,解压命令如下:

unzip ffmpeg-3.2.1.tar.gz

3,NDK
本文所使用的NDK版本是:android-ndk-r13b-linux-x86_64.zip。可以同样通过wget 和 unzip 命令下载并解压到对应的目录下(不用配置环境变量)。

注意:如果你想要以本文作为实践参照,请务必将你准备的FFmpeg源码和下载的ndk 版本与本文给出的保持一致,保持一致,保持一致。因为ffmpeg 个版本的改动,以及ndk 的版本改动,导致后续编译动态库时的配置参数会有所不同,加之FFmpeg 的中文学习资料有限(英文的又理解不了),所以的使用其他版本可能很有可能无法编译通过,至少我已经尝试过使用更新的版本进行编译......但最终还是放弃了......

二,配置文件

    在具体编译动态库之前你还需要设置相应的编译规则。具体如下:

1,修改.so文件命名规则

默认编译后的.so文件格式为:文件明+.so+三段版本号的格式比如libavformat.so.57.0.101。这样的文件格式不太符合我们的使用要求,而且即便是将这样的文件名称简单粗暴的删除.so后面的版本号,在实际使用时也无法编译。所以修改如下:

定位到下载解压的ffmpeg 根目录下打开configure文件

vim configure

在大约3247行左右的地方

替换:

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)'

保存并退出。

注意:由于FFmpeg 的不同版本,这里所说的修改行号,以及    
命名规则可能会有所部同。

2,编写编译(.sh)脚本

首先在ffmpeg 跟目录下创建build_android.sh(名称随意):

vim build_android.sh

(编辑状态下)编入以下内容:

#!/bin/bash
make clean
#填写你具体的ndk解压目录
export NDK=/android/ndk/android-ndk-r13b
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
#编译后的文件会放置在 当前路径下的android/arm/下
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"


#./configure 即为ffmpeg 根目录下的可执行文件configure
#你可以在ffmpeg根目录下使用./configure --hellp 查看 ./configure后可填入的参数。

./configure --target-os=linux \
        --prefix=$PREFIX --arch=arm \
        --disable-doc \
        --enable-shared \
        --disable-static \
        --disable-yasm \
        --disable-symver \
        --enable-gpl \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-ffserver \
        --disable-doc \
        --disable-symver \
        --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
        --enable-cross-compile \
        --sysroot=$SYSROOT \
        --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
        --extra-ldflags="$ADDI_CFLAGS" \
        $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install

保存并退出

注意:
–disable-yasm
1,在下文实际编译时可能会提示你需要安装yasm(在更早期的版本中没有这相关提示)。据说yasm时为了提高ffmpeg编译速度,但我实际感觉好想并没有多快,估计是我打开的方式不对吧。
2,上文中每行的编码结束后不要留空格。
3,确保NDK,SYSROOT,TOOLCHAIN 等相关变量存储的是你自己下载解压的ndk真实目录。并确认你的系统是32位还是64位——必须与ndk的版本保持一致。


三,编译生成.so文件

执行具体编译之前需要为build_android.sh文件添加的可执行权限。操作命令如下:

chmod +x build_android.sh

执行编译命令:

./build_android.sh

实际编译可能需要几分钟。
编译完成后,在当前目录下的android/arm/下会有inclue 和 lib两文件夹
inclue 存放的是相关模块的.h文件:
生成头文件目录

lib 存放的就是.so文件
so文件

 

原文地址:https://blog.youkuaiyun.com/longzw0/article/details/78820814

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值