相信每一个搞音视频开发的都或多或少的接触过FFmpeg或者听说它的大名。它可以说是音视频领域的第一开源框架,代码极其庞大,能达到熟练使用就已经不易了!在Android这个平台上如果要使用软解的话,我相信它是一个不错的选择。同时它也被应用到各大视频类的APP中,比如抖音什么的。嘿嘿当你反编译QQ或者微信你会发现它的倩影。下面直接上干货:

  访问FFmpeg开源框架的官网FFmpeg 。

android ffmpeg格式转换 安卓ffmpeg_视频编解码

点击 Download 下载最近的release版本进行编译,笔者选择的是 FFmepg 4.0 其实编译 ffmepg分为以下几个步骤:

1.cd ffmegdir (进入ffmepg源码所在的目录文件夹下面)

2. ./configure (注意该命令下面有个小点)

3. make

4. make install

以上的4个命令,可能有些初学者不是很明白(很正常,make命令,这些如果不是搞C/C++ 嵌入式方面的人 根部不会遇到这个的),依次解释下!cd 这个不用说了不管是在Window 、Mac OS 、还Linux 系统上都是进入某个文件夹的的意思。 ./configure是对所要编译的源码的配置。这操作会检测一些系统环境,例如,ffplay的编译是需要sdl(Simple DirectMedia Layer),它是一套用C语言写成的开放源代码的跨平台多媒体开发库。如果没有sdl,那么就无法编译出ffplay.(编译这个的时候笔者遇到过大坑,后面细说)。make命令是就是编译源码的命令,它会根据makefile文件进行编译(这些文件源码中已经含有)。编译完成之后,在ffmpeg文件夹下面会生成几个可执行文件ffplay(默认不生成),ffserver(默认不生成),ffmpeg,ffprobe文件夹等。实际上,至此我们已经完成了源码的编译。make install 的作用就是把这些命令和编译好的lib安装到你的系统里面。实际上你不安装也可以,在你之后用的时候,就显示的指明执行文件的路径,头文件以及lib的位置就行,不过还是建议安装一下,否则用起来还是比较费事的。 以上的4个命令可以说的非常的实用,尤其是以后编译第三方库(C/C++)的时候,这就是万能的步骤,万变不离其宗,哈哈!

前提准备 :(笔者是在Mac下编译的)

1.Mac要有安装Xcode ,恩,这个实用mac开发的程序员,我相信都已经安装过了。没有的话去APP Store安装下载。

2.安装brew  在终端上(复制黏贴)执行下面一跳命令即可:

ruby -e "$(curl --insecure -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

如果执行无效,请参考这篇文章解决  

3.安装 sdl

brew install sdl2

4.安装pkgconfig  (可选,关于这个,网上说要安装,但是笔者没有安装一样完美运行)

sudo port install pkgconfig

pkg-config 

 

准备工作完成之后,我们开始编译FFmpeg.

1.先看看FFmpeg 4.0中的源码文件

android ffmpeg格式转换 安卓ffmpeg_视频编解码_02

其中 android_build.sh 是笔者后来添加上去的,后文会详细讲解。

按照上面的步骤进行:

android ffmpeg格式转换 安卓ffmpeg_视频编解码_03

发现编译出错,这是正常的现象,编译第三方库经常遇到习惯就好.首先你应该观察为什么?不知道的时候就只有度娘再不行就只能谷爸了。

configure时增加--disable-x86asm. asm是汇编编译器, 因为ffmpeg中为了提高效率用到了汇编指令。

android ffmpeg格式转换 安卓ffmpeg_mac下编译ffmpeg_04

 

--prefix=/Users/zhulei/Desktop/ffmpeg_out  指定输出文件的路径   --disable-x86asm 不使用asm汇编编译器。

接下来使用 make 命令

make 命令敲完之后 就要经过漫长的等待了,因为编译这个挺消耗时间的!编译过程中警告不用管,错误你就要查阅相应的资料解决了。

make 命令之后紧接着一个 make install 命令:

android ffmpeg格式转换 安卓ffmpeg_android多媒体_05

然后我们可以打开我们的ffmpeg_out文件夹看看. bing go 编译出来了.

android ffmpeg格式转换 安卓ffmpeg_视频编解码_06

include 文件里面是ffmpeg各个模块要使用的头文件  lib文件夹下面则是ffmpeg库  share文件下面是ffmepg库的使用样例。bin目录下面则是ffmpeg 的工具 。

可能有人没有编译出 ffplay 这个工具 这里有2个重要的原因:

1.config.h 中的 #define CONFIG_FFPLAY 的值为0 将其改为1

2.sdl版本需要安装sdl2 而不是sdl(第一代)

尤其是第二点 真是深坑啊。

make install 之后我们可以使用ffpaly当播放器 进行播放视频了 比如在终端敲一个简单的命令:

ffplay  视频全路径     

那么到了这里就完了么。no 我们还有一个android_build.sh 脚本没有讲解 下面来看看吧:

#!/bin/bash  
#这里修改为你的ndk的路径
NDK=/Users/zhulei/android-ndk-r13b

#注意android-23文件夹的版本号,替换好自己的版本号。下面的路径同理 
SYSROOT=$NDK/platforms/android-23/arch-arm64/
TOOLCHAIN=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64

function build_one(){
 ./configure \
--prefix=$PREFIX \
--disable-shared \
--enable-static \
--disable-doc \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \
--target-os=android \
--arch=aarch64 \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
}


CPU=arm64
PREFIX=/Users/zhulei/Desktop/ffmpeg/$CPU
#ADDI_CFLAGS="-marm"
build_one

为什么会有这个sh脚本 ,原因很简单因为我们编译的代码要在android上运行啊,使用mac编译,没有进行相应的配置的话,默认使用mac的gcc编译器 这样编译出来的库我们是没有办法使用的。所以我们需要使用ndk里面的编译器进行编译。

--prefix  指定输出路径

--disable-shared 不编译动态库

--enable-static  编译静态库

--disable-doc   不编译文档

--enable-cross-compile 可以进行交叉编译

--cross-prefix 交叉编译器的路径 (它会自己到相应路径下寻找)

--target-os=android    android平台

--arch=aarch64  架构

--sysroot  指定了逻辑目录。编译过程中需要引用的库,头文件,如果要到/usr/include目录下去找的情况下,则会在前面加上逻辑目录

其余的extra 是一些优化特色可用不用管,对于初学者而言。

我上面的脚本是编译64位的arm库  如果需要编译32位的。需要修改 --arch  --cross-prefix  SYSROOT   TOOLCHAIN 这四个值,改成相应的ndk目录下面对应的32未的即可!

 

 

额外小技巧工具:

我们的mac电脑上安装了brew之后 以后安装软件就可方便了 。只要在终端 brew install 软件名字 ,就会自动下载并安装相应的软件 ,似不似很方便,哈哈!

比如: brew install you-get

you-get 是一个很有用的下载视频工具 。安装好了 你可以使用简单的命令行下载国内各大网站的视频,而不需要通过他们的客户端,是不是神器 ,很happy是吧,嘿嘿!