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" \
相关推荐
lxkj_202413 小时前
使用线程局部存储解决ffmpeg中多实例调用下自定义日志回调问题
ffmpeg
runing_an_min18 小时前
ffmpeg视频滤镜:替换部分帧-freezeframes
ffmpeg·音视频·freezeframes
ruizhenggang18 小时前
ffmpeg本地编译不容易发现的问题 — Error:xxxxx not found!
ffmpeg
runing_an_min20 小时前
ffmpeg视频滤镜:提取缩略图-framestep
ffmpeg·音视频·framestep
韩曙亮1 天前
【FFmpeg】FFmpeg 内存结构 ③ ( AVPacket 函数简介 | av_packet_ref 函数 | av_packet_clone 函数 )
ffmpeg·音视频·avpacket·av_packet_clone·av_packet_ref·ffmpeg内存结构
oushaojun22 天前
ubuntu中使用ffmpeg和nginx推流rtmp视频
nginx·ubuntu·ffmpeg·rtmp
莫固执,朋友2 天前
网络抓包工具tcpdump 在海思平台上的编译使用
网络·ffmpeg·音视频·tcpdump
lxkj_20242 天前
修改ffmpeg实现https-flv内容加密
网络协议·https·ffmpeg
cuijiecheng20182 天前
音视频入门基础:MPEG2-TS专题(6)——FFmpeg源码中,获取MPEG2-TS传输流每个transport packet长度的实现
ffmpeg·音视频
VisionX Lab2 天前
数据脱敏工具:基于 FFmpeg 的视频批量裁剪
python·ffmpeg·音视频