前言

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。市面上常见的播放器如:暴风影音、QQ影音、KMP、GOM Player、PotPlayer等都使用了该开源项目。

编译

本文主要讲述在Ubuntu下,使用开源项目FFmpeg编译成.so文件。本文只讲实际动手操作,更多理论知识稍后补充或者自己搜索了解。

使用前准备make

git

NDK(android-ndk-r14b-linux-x86_64.zip)

FFmpeg(ffmpeg-3.2.1.tar.gz)

Ubuntu系统

集成步骤

安装make

安装make,后面编译时会用到

a4229955c1551ad0c7a7d994bde6cd38.png

安装Git

习惯了使用Git,也可以使用Terminal操作

60e7dad447cf51a7ba77b8ef9c6b0195.png

NDK

我曾经使用过NDK R15C,编译不过,后来改为 NDK R14,为保证成功,建议使用 NDK R14

NDK 下载

下载地址

NDK 解压

使用 unzip 指令解压NDK到指定目录

FFMPEG

下载FFmpeg

使用下面的指令下载ffmpeg3.2.1(我曾尝试过ffmpeg4.0版本,因为一些列元音未编译成功)

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

3993433daff98edc9d8b384381abead4.png

解压FFmpeg

使用解压指令解压FFmpeg

unzip ffmpeg-3.2.1.tar.gz

ea8cf5ce1fcf24e9dbc76310ee10c695.png

修改配置文件

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

修改前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)'

c34262ba236cfdf08cb1a5cd6a332058.png

修改后SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'

LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'

SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'

SLIB_INSTALL_LINKS='$(SLIBNAME)'

c8f78580d9578e6eef91864b1efee03e.png

编写编译(.sh)脚本

创建编译脚本

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

175bbb29abf5e287c92bfcd6dd1d48c2.png

创建后,脚本如下所示:

94589a6edd9b98285f06dd4772414244.png

创建build文件目录(android)

android 文件夹用于存放build后的.so文件和其他文件

ffmpeg-create-android.png

修改编译脚本内容#!/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

编译运行

修改.sh脚本文件权限

没有限权,后面的脚本命令无法执行

00db063a0074195f6bfd607235eafbc4.png

运行.sh脚本

f79f9f940d0b7e3e111e1a797d104a4c.png

脚本执行过程

9fa371ab2e0626110f8d084e0a251665.png

编译完成

编译时间较长 20分钟左右,之后在android目录下,可以看到生成的文件

db285bd1027f226d44de9223855c8895.png

33f0f7cad20f1eed0dc1021e72e35849.png

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐