ffmpeg的使用

本文章记录ffmpeg 源码下载,编译,及使用。

一、FFMPEG 源码下载解压

源码官网地址:http://ffmpeg.org/download.html#releases

下载最新版本ffmpeg6.0。

使用命令tar xvJf ffmpeg-6.0.tar.xz 解压。

二、了解FFMPEG源码

(一)configure编译脚本及帮助命令

bash 复制代码
./configure --help -->ffmpeg_help.txt

1、Shell脚本:由第一行Shell解释器声明 #!/bin/sh 代码,可以看出,configure是Shell脚本。

2、configure 脚本作用:该脚本用于生成make工具的构建脚本Makefile文件。

3、configure脚本执行:该脚本需要进行配置才能执行,如果直接执行,会报错。

4、configure帮助命令:

1)脚本复杂:c/c++开源库都会提供一个configure脚本,该脚本的配置非常复杂,但一般都提供一个帮助选项;

2)帮助信息:执行./configure --help 既可查看帮助信息。建议先将帮助信息熟悉一遍后再进行编译。

(二)配置configure脚本

1、FFMPEG编译流程

1)配置:使用configure脚本进行相关参数的配置。

2)编译:配置完毕后,直接执行make命令,开始进行编译。

2、配置的内容

1)输出配置:配置 生成的相关文件输出路径;

2)函数库配置:配置静态库,动态库。函数库优化等相关参数。

3)命令行程序配置:配置是否生成命令行程序,FFMPEG 自带3个命令行程序。

4)编译组件配置:FFMPEG有22个可选的独立组件配置,可以选择性编译或不编译某些组件。

5)编码解码配置:配置FFMPEG编解码功能。

6)交叉编译配置(重点):配置交叉编译工具链、头文件、库文件查找路径参数,GCC编译器参数,CPU架构等参数。

(三)输出目录配置

1 、生成文件的输出目录 : FFMPEG 编译后需要生成一系列的函数库 , 及头文件等 ; 需要为这些生成的文件指定输出目录 。

2、指定生成的文件输出位置 。

1)定义变量 : 使用 PREFIX=./android/arme64-v8a命令 , 定义输出目录根目录变量;

2) 路径配置 : 使用 ./configure --prefix=PREFIX 命令 , 指定输出文件的根目录为 ./android/arme64-v8a ;

bash 复制代码
# 将输出目录存储到 PREFIX 变量中
PREFIX=./android/arme64-v8a

# 执行 configure 脚本配置输出文件的根目录
./configure --prefix=$PREFIX

3、自动生成其它目录 : 指定了 --prefix 选项 , 那么其它生成 bin 可执行文件目录 , lib 函数库目录 等类型的文件输出目录会在 --prefix 配置的目录基础上生成 。

1) 根目录 : 指定了 --prefix 目录为 ./android/arme64-v8a ;

2) 可执行文件目录 : 自动生成的可执行文件输出目录为 PREFIX/bin , 即 ./android/arme64-v8a/bin ;

3) 函数库目录 : 自动生成的函数库数据目录为 PREFIX/lib , 即 ./android/arme64-v8a/lib ;

其它的标准选项配置 ( Standard options ) 请仔细阅读下面的 configure 帮助文档内容 ;

(四)函数库配置

1、 函数库配置 : FFMPEG 编译时 , 可以选择编译静态库或动态库 , 及设置编译函数库的行为 ;

2、 默认编译的函数库 : FFMPEG 默认编译静态库 , 此处也推荐在 Android 中使用 FFMPEG 静态库开发音视频功能 , 保持默认状态即可 ;

3、优化函数库 :

1)设置后效果 : FFMPEG 编译时可以选择优化函数库大小 , 让编译出来的函数库尽可能小 , 但相应的编译速度会降低很多 ;

2)设置的要性 : 由于是在 Android 中进行开发 , 为了使打包后的 APK 文件尽可能小 , 这里我们需要开启该选项 ;

3)设置命令 : 调用 ./configure --enable-small 命令 , 启用优化函数库大小的功能;

bash 复制代码
# 启用函数库大小优化
./configure --enable-small

其它的配置选项 ( Configuration ) 请仔细阅读下面的 configure 帮助文档内容 ;

(五)程序配置选项

1)FFMPEG 命令行程序 : FFMPEG 提供了一些可执行的命令行程序 , 如 ffmpeg.exe , ffplay.exe , ffprobe.exe 等程序 ;

2) 使用情况 : 在 Android 开发中只需要 FFMPEG 的函数库 , 不需要这些程序 , 建议关闭命令行程序编译选项 ;

3)配置命令 : 调用 ./configure --disable-programs 命令 , 关闭编译命令行程序的功能 。

bash 复制代码
# 关闭编译命令行程序
./configure --disable-programs

其它的配置选项 ( Configuration ) 请仔细阅读下面的 configure 帮助文档内容

(六)组件配置选项

1、组件配置选项

默认状态 : FFMPEG 组件选项 , 默认都是打开的 , 如果需要关闭某一个需要单独配置

2、FFMPEG 常用组件

1)avdevice 组件 : 操作摄像头等视频设备 , Android 中是不支持该操作 , 需要手动关闭;

2)avcodec 组件 : 声音 / 图像编解码组件;

3)avformat 组件 : 音视频封装格式生成或解析;

4)swresample 组件 : 音频重采样 , 修改音频参数;

5)swscale 组件 : 视频场景比例缩放 , 色彩映射转换;

6)postproc 组件 : 后期效果处理 , 这里不需要 , 需要手动关闭;

7) avfilter 组件 : 过滤器 , 添加字幕水印。

3、关闭 avdevice 配置命令 : 调用 ./configure --disable-avdevice 命令 , 关闭 avdevice 模块编译。

bash 复制代码
# 关闭编译命令行程序
./configure --disable-avdevice

其它的组件配置选项 ( Configuration ) 请仔细阅读下面的 configure 帮助文档内容 。

(七)编码配置

1、提供的编码配置

1)编码器 : 关闭指定编码器 , 关闭所有编码器 , 打开指定编码器;

2)解码器 : 关闭指定解码器 , 关闭所有解码器 , 打开指定解码器;

2、 关闭编码配置命令 : 调用 ./configure --disable-encoders 命令 , 关闭编码器模块编译

bash 复制代码
# 关闭编译编码器
./configure --disable-encoders

3、 关闭混合封装配置命令 : 调用 ./configure --disable-muxers 命令 , 关闭混合封装模块编译

bash 复制代码
# 关闭混合封装
./configure --disable-muxers

4、关闭视频滤镜配置命令 : 调用 ./configure --disable-filters 命令 , 关闭视频滤镜模块编译

bash 复制代码
# 关闭视频滤镜
./configure --disable-filters

其它的单个组件配置选项 ( Configuration ) 请仔细阅读下面的 configure 帮助文档内容

三、交叉编译

(一) ffmpeg4.1.11 + ndk17 编译arm32平台库

参考文章:参考博客https://blog.csdn.net/shulianghan/article/details/104351312

1、官网下载ffmpeg4.1.11版本,并解压。省略

2、官网下载ndk17版本。省略。

具体方法参考文章"ndk开发-交叉编译"。

3、执行./configure

  1. 进入ffmpeg-4.1.11文件夹;
bash 复制代码
cd ffmpeg-4.1.11

2)修改权限到root权限;

bash 复制代码
sudo su root

3)执行命令;

bash 复制代码
./configure

执行后,我这里会报错,如下。

解决方案:安装asm.

下载yasm-1.3.0版本并解压。下载地址http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz

http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz

tar -zxvf yasm-1.3.0.tar.gz

进入yasm-1.3.0文件夹,执行./configure

执行make指令

安装成功。

再回到ffmpeg-4.1.11文件夹,执行./configure指令,不会报错。

4)编写编译脚本

将参考文章https://blog.csdn.net/shulianghan/article/details/104351312中的编译脚本拷贝过来。修改。

a 新建"build_ffmpeg.sh"文件夹;

b 拷贝编译脚本,并修改ndk根目录。

bash 复制代码
#!/bin/bash

# NDK 根目录(按照自己的路径修改)
NDK_ROOT=/home/vagrant/software/ndk/android-ndk-r17c

# TOOLCHAIN 变量指向 gcc g++ 等交叉编译工具所在的目录
TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64

# gcc 编译器参数
FLAGS="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -isystem $NDK_ROOT/sources/android/support/include -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fPIC"

# 编译结果输出路径
PREFIX=./android/armeabi-v7a

# 执行 configure 脚本生成 Makefile 构建脚本
./configure \
--prefix=$PREFIX \
--enable-small \
--disable-programs \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--sysroot=$NDK_ROOT/platforms/android-21/arch-arm \
--extra-cflags="$FLAGS" \
--arch=arm \
--target-os=android 

# 清除之前的编译内容
make clean

# 开启新的 FFMPEG 编译
make install

c 在ffmpeg文件夹新建android/armeabi-v7a文件夹。

d chmod 777 build_ffmpeg.sh 添加权限

e ./build_ffmpeg.sh 执行脚本

生成一下文件,说明编译成功。可以使用file xxx查看生成的库文件是否为arm32平台。

注意:很奇怪,使用同样的linux环境,ndk和ffmpeg第一次用该脚本编译,报错。今天重新做一遍又不会报错。把报错及解决方法记录一下。

修改方法:去掉脚本中"-D__ANDROID_API__=21 -g -DANDROID",完成脚本如下,可以编译so 动态库和静态库。

bash 复制代码
#!/bin/bash

# NDK 根目录
NDK_ROOT=/home/vagrant/software/ndk/android-ndk-r17c

# TOOLCHAIN 变量指向 gcc g++ 等交叉编译工具所在的目录
TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64

# gcc 编译器参数
FLAGS="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -isystem $NDK_ROOT/sources/android/support/include -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fPIC"

#FLAGS="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -isystem $NDK_ROOT/sources/android/support/include -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -#funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fPIC"

# 编译结果输出路径
PREFIX=./android/armeabi-v7a

# 执行 configure 脚本生成 Makefile 构建脚本
./configure \
--prefix=$PREFIX \
--enable-small \
--disable-programs \
--enable-static \
--enable-shared \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--sysroot=$NDK_ROOT/platforms/android-21/arch-arm \
--extra-cflags="$FLAGS" \
--arch=arm \
--target-os=android 

# 清除之前的编译内容
make clean

# 开启新的 FFMPEG 编译
make install

#--extra-cflags="$FLAGS" \
相关推荐
扶尔魔ocy2 小时前
【QT window】ffmpeg实现录音功能之无损格式--PCM
ffmpeg·pcm
止礼4 小时前
FFmpeg8.0.1 源代码的深入分析
ffmpeg
小曾同学.com5 小时前
音视频中的“透传”与“DTS音频”
ffmpeg·音视频·透传·dts
vivo互联网技术5 小时前
数字人动画云端渲染方案
前端·ffmpeg·puppeteer·web3d
止礼6 小时前
FFmpeg8.0.1 编解码流程
ffmpeg
qs70166 小时前
c直接调用FFmpeg命令无法执行问题
c语言·开发语言·ffmpeg
止礼7 小时前
FFmpeg8.0.1 Mac环境 CMake本地调试配置
macos·ffmpeg
简鹿视频1 天前
视频转mp4格式具体作步骤
ffmpeg·php·音视频·实时音视频