linux源码包编译-FFmpeg系列(一)-Mac环境下使用NDK编译FFmpeg

如果你需要制作音频和视频相关的内容,你无法避免的一件事就是FFmpeg。 它是一组开源计算机程序,可用于录制、转换数字音频和视频,并将其转换为流。 使用 LGPL 或 GPL 许可证。 它为录制、转换和流式传输音频和视频提供了完整的解决方案。 它包括非常先进的音频/视频编解码器库 libavcodec。 为了保证高可移植性和编解码质量,libavcodec 中的许多代码都是从头开始开发的。 简而言之,FFmpeg是一个非常强大的音频和视频处理库。 下面我们就从源码编译开始揭开它的神秘面纱。

编制计划

Mac环境,这个是在mac环境下编译的,所以需要准备一个MacOs系统的笔记本FFmpeg源码库,进入FFmpeg官网,点击下载最新的FFmpeg(这里下载的是4.1.3版本)源码到您当地的

解压后会得到如下文件夹

NDK,为Android Studio配置的ndk这里不能使用,因为它会缺少一些头文件。 您需要从NDK官网单独下载独立完整的NDK版本。 这里选择NDK17

ps:一开始使用的是NDK16版本,但是编译时会报类似如下的错误:

libavformat/udp.c: In function 'udp_set_multicast_sources':
libavformat/udp.c:290:28: error: request for member 's_addr' in something not a structure or union

所以我最终选择了NDK17版本。

推荐相关学习资料,点击下方链接免费注册,先保存以免迷路~】

免费音视频学习地址:FFmpeg/WebRTC/RTMP/NDK/Android音视频流中间开发

【免费分享】音视频学习资料包、各大厂商面试题、技术视频和学习路线图。 资料包括(C/C++、Linux、FFmpeg webRTC rtmp hls rtsp ffplay srs等)如有需要可以点击788280672进群免费分发~

编译实践

编译安装源码包_linux源码包编译_linux源码包安装教程

在编译之前,需要对FFmpeg的配置进行一些修改linux源码包编译linux源码包编译,编写自己的编译sh脚本,然后使用这个脚本编译需要的库。

修改设置

在FFmpeg文件下找到configure

用Sublime等文本编辑工具打开,修改以下几行(共4行)

修改前:

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 中现有的名为 version 的 shell 脚本

进入FFmpeg根目录,重命名为android_build.sh

修改内容如下:

#!/bin/bash
 
ADDI_CFLAGS="-marm"
API=19
PLATFORM=arm-linux-androideabi
CPU=armv7-a
#自己本地的ndk路径。
NDK=/Users/cainjiang/ProgramFiles/android-ndk-r17c
SYSROOT=$NDK/platforms/android-$API/arch-arm/
ISYSROOT=$NDK/sysroot
ASM=$ISYSROOT/usr/include/$PLATFORM
TOOLCHAIN=$NDK/toolchains/$PLATFORM-4.9/prebuilt/darwin-x86_64
#自己指定一个输出目录,用来放生成的文件的。
OUTPUT=/Users/cainjiang/ProgramFiles/ffmpeg-4.1.3/android_out 
function build
{
./configure 
--prefix=$OUTPUT 
--enable-shared 
--disable-static 
--disable-doc 
--disable-ffmpeg 
--disable-ffplay 
--disable-ffprobe 
--disable-avdevice 
--disable-doc 
--disable-symver 
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- 
--target-os=android 
--arch=arm 
--enable-cross-compile 
--sysroot=$SYSROOT 
--extra-cflags="-I$ASM -isysroot $ISYSROOT -Os -fpic -marm" 
--extra-ldflags="-marm" 
$ADDITIONAL_CONFIGURE_FLAG
  make clean
  make 
  make install
}
build

这里的脚本是我自己编译并通过测试的。 如果需要练习的话,可以直接复制并使用。 你只需根据自己的情况更改里面的两条注释即可。

开始编译

最后在控制台进入FFmpeg的根目录,为编译后的脚本设置权限。

然后使用sh命名并编译FFmpeg库,

整个编译过程大约需要5~10分钟,最终编译出来的库文件就在我们sh脚本中设置的android_out目录中。

OUTPUT=/Users/cainjiang/ProgramFiles/ffmpeg-4.1.3/android_out

ps:如果遇到意外错误,可以查看log.txt中的编译日志,然后查找并解决问题。

参考

FFmpeg4.1 Android库最新版Windows交叉编译

编译Android平台的ffmpeg 4.1版本

原创FFmpeg系列(一)——Mac环境下使用NDK编译FFmpeg - 掘金