本文用于记录Linux环境下编译最新FFmpeg(3.3.3)库过程,方便后续参考。
1.编译环境
- Linux环境:Ubuntu14.04-64bit(使用的虚拟机是VMware9,本人的系统是Win7-64bit)
- SDK版本:24.4.1 Android SDK下载地址
- NDK版本:r13b, 链接和SDK相同
- git版本管理工具
2. 编译过程
1. 下载FFmpeg源码
源码下载方式有很多种,可以使用git下载,可以直接zip下载,也可以直接去官网下载,我采用最简单的git下载方式。由于我的电脑在linux环境下下载太慢,故我首先在win环境下下载,然后拷贝到ubuntu中,速度快很多。
下载方法:
git clone https://github.com/FFmpeg/FFmpeg.git
2.配置Linux环境下的SDK和NDK路径,相当于win环境下的环境变量
对下载的SDK和NDK进行解压缩操作(要熟悉linux常用命令,这里不再详述),我将这两个文件放置到了/home/hha/android下面,然后进行下面操作配置路径(配置路径的作用是为了在编译过程中,让FFmpeg编译脚本知道sdk和ndk在哪里)。
1.vim ~/.bash_profile
2.在打开的该文件中写入:
export ANDROID_SDK=/home/hha/android/android-sdk-linux
export ANDROID_NDK=/home/hha/android/android-ndk-r13b
export PATH=$PATH:$ANDROID_NDK:$ANDROID_SDK/tools:$ANDROID_SDK/platforms
3.退出保存文件 (要熟悉vim的常用操作)
4.使配置生效 : source ~/.bash_profile
3.配置编译环境
如果自己去写配置脚本,难度有点大,我这里直接使用github上高手写好的脚本,可以直接使用,对于的链接为高手写的linux环境编译FFmpeg脚本,该链接有写具体如何修改,并执行。为了详细点,这里贴出我的脚本文件
#! /usr/bin/env bash
export TMPDIR=/home/hha/android/tmpdir
NDK=/home/hha/android/android-ndk-r13b
SYSROOT=$NDK/platforms/android-16/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CPU=arm
PREFIX=/home/hha/android/ffmpeg_shared_compile/arm/
ADDI_CFLAGS="-marm"
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--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
4.执行脚本,得到so库和头文件
拷贝上述文件到指定目录下,执行以下命令即可
./build_android_arm.sh
编译完成后,会在 $PREFIX 目录下生成 include和lib两个文件夹(我的路径是 /home/hha/android/ffmpeg_shared_compile/arm/),将lib文件夹中的 pkgconfig 目录和so的链接文件删除,只保留so文件,然后将include 和lib两个目录一起copy到你的apk jni下去编译,即可进行后续开发。
5.各库简单分析
└── arm
├── include
│ ├── libavcodec
│ ├── libavfilter
│ ├── libavformat
│ ├── libavdevice
│ ├── libavutil
│ ├── libswresample
│ └── libswscale
└── lib
├── libavcodec-57.so
├── libavfilter-6.so
├── libavformat-57.so
├── libavdevice-57.so
├── libavutil-55.so
├── libswresample-2.so
├── libswscale-4.so
└── pkgconfig
- libavformat
用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,为 libavcodec 分析码流提供独立的音频或视频码流源; - libavcodec
用于各种类型声音/图像编解码;该库是音视频编解码核心,实现了市面上可见的绝大部分解码器的功能,libavcodec 库被其他各大解码器 ffdshow,Mplayer 等所包含或应用; - libavdevice
硬件采集、加速 、显示 ,操作计算机中常用的音视频捕获或输出设备; - libavfilter
filter(FileIO、FPS、DrawText)音视频滤波器的开发,如宽高比 裁剪 格式化 非格式化 伸缩; - libavutil
包含一些公共的工具函数的使用库,包括算数运算 字符操作; - libswscale
(原始视频格式转换)用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb565,rgb888 等与 yuv420 等之间转换; - libswresample
原始音频格式转码。