2. FFmpeg 编译 for Android

本文详细介绍如何在Android平台上编译FFmpeg库,包括所需工具、编译前准备及具体步骤。适合Android开发者及音视频处理爱好者。

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

白话:
         由于自己工作中一直从事Android方面的开发,因此此文只介绍FFmpeg在Android平台的编译方法。Android开发从开发语言角度分,主要涉及到Java开发和C/C++开发。C/C++开发就是俗称的Android Native开发,通常Native开发的是一些so后缀名的lib库。Java上层开发的功能单元通过JNI与C/C++开发的Native层的lib库进行通信。由于FFmpeg主要是C语言开发,所以我们需要将FFmpeg源码编译成so的lib库,供JAVA层通过JNI调用Native层的这些so库中的方法/函数。

2.1 Android Native开发
       Android开发分为Java层的开发和C/C++层的开发。如果仅仅是Java层的开发,我们仅需要Android的SDK来支撑JAVA层的开发就可以了。如果需要Native层开发,那么我们就需要Android的NDK来支撑我们C/C++层的开发。
      
      NDK的下载:
      Android NDK官网: https://developer.android.com/ndk/downloads/index.html(需要翻墙,但是可以通过一些网盘分享获取,请google或baidu)。   
       针对自己的开发平台选择不同的版本下载。 本文以Ubuntu12.04 64位作为开发平台介绍如何编译。
       目前可以下载的最新版本为: android-ndk-r14b-linux-x86_64.zip
2.2 使用NDK编译FFmpeg准备工作
  • 下载android ndk,解压,我解压后的目录为:android-ndk-r14b。
  • 将FFmpeg源码目录放入android-ndk-r14b目录中的sources目录下。
  • 进入sources下的FFmpeg目录,新建android/arm和android/arm/tmp目录,android/arm/tmp主要存放编译过程的中间生成文件。当编译成功后,android/arm目录下会生成include目录和lib目录,分别存放头文件和生成的so库。
2.3 使用编译脚本编译
  • 在FFmpeg目录下创建编译脚本build_android.sh:
#!/bin/bash
#配置编译中间文件的存储目录,此目录在2.2已经创建过
export TMPDIR=$(pwd)/android/arm/tmp
#配置android ndk的目录路径。
NDK=$HOME/Android/android-ndk-r14b
#sysroot 选项设定 gcc 在编译源码的时候,寻找头文件和库文件的根目录。
#配置sysroot目录路径,在platforms目录下选择自己需要的android版本,
#我自己现在使用的是android 7对应的是API level 24因此选择android-24。
#因为我需要so运行在cpu的架构为arm因此选择arch-arm,此目录下主要包括
#编译时需要使用的标准库,比如libc库等。
SYSROOT=$NDK/platforms/android-24/arch-arm
#配置交叉编译工具目录,此目录主要包括各种编译平台的编译工具,因为我使用的so库是在arm上
#运行,因此我选择了toolchains目录下最高版本的rm-linux-androideabi-4.9。
#交叉编译为在一个平台上去编译另一个平台上可以执行的本地代码,而我是在64位ubuntu12.04
#上编译可以跑在arm上的目标库。
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CPU=arm
#配置编译完毕后,so库文件安装目录,此目录上几步中已配置。
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"

function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--enable-small \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
build_one
./build_android.sh





内容概要:本文档为《400_IB Specification Vol 2-Release-2.0-Final-2025-07-31.pdf》,主要描述了InfiniBand架构2.0版本的物理层规范。文档详细规定了链路初始化、配置与训练流程,包括但不限于传输序列(TS1、TS2、TS3)、链路去偏斜、波特率、前向纠错(FEC)支持、链路速度协商及扩展速度选项等。此外,还介绍了链路状态机的不同状态(如禁用、轮询、配置等),以及各状态下应遵循的规则和命令。针对不同数据速率(从SDR到XDR)的链路格式化规则也有详细说明,确保数据包格式和控制符号在多条物理通道上的一致性和正确性。文档还涵盖了链路性能监控和错误检测机制。 适用人群:适用于从事网络硬件设计、开发及维护的技术人员,尤其是那些需要深入了解InfiniBand物理层细节的专业人士。 使用场景及目标:① 设计和实现支持多种数据速率和编码方式的InfiniBand设备;② 开发链路初始化和训练算法,确保链路两端设备能够正确配置并优化通信质量;③ 实现链路性能监控和错误检测,提高系统的可靠性和稳定性。 其他说明:本文档属于InfiniBand贸易协会所有,为专有信息,仅供内部参考和技术交流使用。文档内容详尽,对于理解和实施InfiniBand接口具有重要指导意义。读者应结合相关背景资料进行学习,以确保正确理解和应用规范中的各项技术要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值