开发环境配置
Mac下安装FFmpeg
FFmpeg的学习看其源代码时需要下载他的仓库,直接读源码,其他场景下的编译都是自己根据自己的需求进行编译的,但是在Mac 中不需要进行编译就可以学习FFmpeg的各个API:
brew install ffmpeg
通过brew安装之后,ffmpeg需要的头文件和lib文件都会安装到/usr/local/X的位置,我的为:
/usr/local/Cellar/ffmpeg/6.0
xcode
Xcode 创建一个Commond Line Tools 项目,选择C++/C都可
配置Header、Library路径
添加动态链接库
main.cpp测试代码
#if defined(__cplusplus)
extern "C"
{
#endif
#include "libavcodec/avcodec.h"
#if defined(__cplusplus)
}
#endif
#include <iostream>
using namespace std;
#include <iostream>
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
cout << "avcodec_configuration : " << avcodec_configuration() << endl;
return 0;
}
运行结果:
Hello, World!
avcodec_configuration : --prefix=/usr/local/Cellar/ffmpeg/6.0 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox
Program ended with exit code: 0
Android Studio配置FFmpeg开发环境
下载ffmpeg源码
下载ffmpeg的源码 官网地址:http://www.ffmpeg.org/download.html 里面有Linux、macOS、Windows系统的版本,根据自己的需要下载对应的版本。下载完成后把源码放在你喜欢的路径,如:/Users/ccc/ffmpeg
修改FFmpeg目录下的configuration配置文件:
然后搜索Toolchain options部分,增加:
--cross-prefix-clang=PREFIX use PREFIX for compilation tools [$cross_prefix_clang]
再搜索CMDLINE_SET,也增加上面的自定义参数配置:
最后再搜索set_default target_os,进行一下修改:
4436 set_default target_os
4437 if test "$target_os" = android; then
4438 cc_default="clang"
4439 # 增长这一行
4440 cxx_default="clang++"
4441 fi
4442
4443 ar_default="${cross_prefix}${ar_default}"
4444 # 修改这一行
4445 cc_default="${cross_prefix_clang}${cc_default}"
4446 # 修改这一行
4447 cxx_default="${cross_prefix_clang}${cxx_default}"
4448 nm_default="${cross_prefix}${nm_default}"
这样修改之后咱们在编译时就可使用咱们新增的cross_prefix_clang参数了,而后其余的如nm,ar,ranlib,strip则继续使用cross_prefix参数。
为什么要这样改? 首先,需要先了解编译库的流程。 ①编写自定义的编译脚本 ②脚本根据各个配置项,去寻找对应的库工具路径 ③生成动态链接库 而上面的修改,目的就是为了第二步能正常找到对应的库工具。配置中的nm,ar,ranlib,strip这些的前缀,是arm-linux-androideabi-,而cc,cxx这两个是arm-linux-androideabi21-这样的前缀,而且他们放的位置也不一样。所以增加一个自定义的配置项,用于指向不同的目录。
编写编译脚本
在ffmepg的文件夹中新建一个文件夹build-android,里面再新建一个build-android.sh文件。
#!/bin/bash
#NDK路径
export NDK=/Users/xxxx/Library/Android/sdk/ndk/21.0.6113669
#CPU类型
export CPU=armv8-a
# 目标Android版本
API=21
#架构类型
export ARCH=arm
export SYSROOT=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot
#交叉编译工具链
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
#编译成功后,存放的路径
export PREFIX=./build-android/dist
cd .. #回到ffmpeg根目录
echo "start configure"
./configure \
--prefix=$PREFIX \
--enable-shared \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--cross-prefix-clang=$TOOLCHAIN/bin/armv7a-linux-androideabi21- \
--target-os=android --arch=$ARCH --cpu=$CPU \
--enable-gpl --enable-version3 \
--disable-programs --disable-ffmpeg --disable-ffplay --disable-ffprobe \
--disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages \
--disable-postproc \
--disable-debug \
--sysroot=$SYSROOT \
--extra-cflags="-I$SYSROOT/usr/include" \
--extra-ldflags="-L$SYSROOT/usr/lib" \
--enable-small \
--enable-jni \
--enable-mediacodec
--disable-everything \
--enable-decoder=hevc --enable-decoder=h264 --enable-decoder=aac \
--enable-parser=h264 --enable-parser=hevc --enable-parser=aac \
--enable-demuxer=flv --enable-demuxer=mov --enable-demuxer=avi --enable-demuxer=mpegts \
--enable-protocol=file --enable-protocol=hls
echo "make clean start"
make clean
echo "make start"
make -j4
echo "make finished"
make install
echo "make install finished"
cd到ffmpeg一级目录,然后执行以下的命令
chmod 777 build_android.sh //改变脚本权限,使其能够运行,然后
./build_android.sh //运行脚本
等编译完成后,进入目录就能看到生成的库:
还有一个问题,就是能不能不修改configure文件? 其实也是可以,只需要明确指定cc和cxx的路径就行。
--cc=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang \ --cxx=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++ \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ 脚本部分配置项解释 1.—prefix:指定编译输出的文件路径 2.—target-os:指定目标操作系统 3.--disable-static:禁止生成静态库 4.—disable-programs:禁止生成ffplay、ffmpeg等可执行文件 5.—disable-doc:禁止生成文档 6.—enable-shared:生成动态链接库 7.enable-cross-compile:开启交叉编译(跨平台编译) 8.make -j12:定义用几个CPU编译
到这里为止,就已经编译出我们需要的so库了,之后就是怎么在android项目中使用了。
Android编译方式2
ffmpeg-android-maker项目已经把下载、编译都给写好了,我们要做的就是下载下来后, 环境变量中配置ANDROID_SDK_HOME和ANDROID_NDK_HOME:
export ANDROID_SDK_HOME=/Users/xuchuanren/Library/Android/sdk
export ANDROID_NDK_HOME=/Users/xuchuanren/Library/Android/sdk/ndk/23.1.77796 20
然后运行进入目录执行:
sh ffmpeg-android-maker.sh
它会自动下载并编译android上可用的so,结果为:
项目集成
新建项目,增加C++支持。手动创建jniLibs文件夹 然后将上一步生成的所有文件(库文件和头文件)复制到jniLibs文件夹下面 最终目录结构: