本文首发于微信公众号——世界上有意思的事,搬运转载请注明出处,否则将追究版权责任。微信号:a1018998632,交流qq群:859640274
GitHub地址
好久不见,最近加班比较多所以第二篇音视频方面的文章 delay 了一周,大家多包涵哈。本文预计阅读时间二十分钟。
本文分为以下章节,读者可以按需阅读
-
1.FFmpeg源码食用——Clion中编译、修改、引用FFmpeg源码
-
2.FFmpeg Api食用——FFmpeg 数据结构以及官方 demo 解析
-
3.极简视频播放器——写一个基于 FFmpeg 的极简 Android 视频播放器
1、FFmpeg源码食用
注意事项:
-
1.需要一些 git 的知识,git中文文档。
-
2.我的FFmpeg:我 fork 的 FFmpeg 项目,源码的编译已经完成,编译的 shell 脚本在根目录下。
-
3.FFmpeg-learing:本文章的示例代码
-
4.下面代码块中,使用 -----代码块x,本文发自简书、掘金:何时夕----- 来区分各个代码块,该文字不属于代码的一部分
-
5.下面使用 project 指代 clone 下来的 FFmpeg 项目的路径。
-
6.下面的操作都是基于 Mac 平台,linux 平台应该也能顺利运行,win 平台的话笔者实在没时间去折腾(靠你们自己啦)。
-
7.开始前需要安装一些前置软件:Clion(百度)、make(mac 可以用 brew 装、linux 可以用 apt 装)
1.1开始
拿到一个项目,我们一般有两种方式可以使用它:一个是使用它编译打包后的产物,一个是自己引用他的项目集成到自己的项目中。我们在这一章就来讲讲如何食用 FFmpeg 的源码,将我们的代码写入 FFmpeg项目中,然后编译到 android 项目中。 FFmpeg-learing,强烈建议大家依照项目代码进行文章的阅读。
-
1.首先将 FFmpeg官方项目 fork 到我们自己的 github 上,以便以后对这个项目的修改。
-
2.clone 自己的 FFmpeg 项目到电脑上。
-
3.以后我的代码修改和编译会基于 FFmpeg 3.3.8 这个版本(这个版本好编译一点),所以我们需要新建一个分支 local_build_base_on_3.3.8。然后使用 git reset --hard 18c9d5d3e80dc0b47e0a260b51f5230bdd499e8b 来到 FFmpeg 的 tag 为 n3.3.8 这个 commit 上。
-
4.现在我们就可以开始编译代码了。
编译的流程网上很多,我就简单说一下。
-
1.将 project/configure 文件中 3305-3308行,这四行代码换成代码块1中的代码。
-
2.将代码块2中的代码保存为 project/build_android.sh 文件,然后执行 ./build_android.sh 命令。
-
-----代码块1,本文发自简书、掘金:何时夕-----
# 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)'
-----代码块2,本文发自简书、掘金:何时夕-----
#!/bin/bash
# 切换到 FFmpeg 的目录
cd /Users/whensunset/AndroidStudioProjects/KSVideoProject/ffmpeg
# NDK的路径,根据自己的安装位置进行设置
export NDK=/Users/whensunset/AndroidStudioProjects/KSVideoProject/android-ndk-r14b
export SYSROOT=$NDK/platforms/android-16/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
export CPU=arm
# 配置编译后的产物放置路径
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
# 创建一个方法,这个方法使用 configure 这个文件传入一些参数来对 FFmpeg 进行编译,可以使用 configure -help 命令来对参数进行了解
function build_one
{
./configure \
--prefix=$PREFIX \
--target-os=linux \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--arch=arm \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--enable-shared \
--enable-runtime-cpudetect \
--enable-gpl \
--enable-small \
--enable-cross-compile \
--disable-debug \
--disable-static \
--disable-doc \
--disable-asm \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disab