ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg 工具使用基础——ffmpeg常用命令
相关资源:
Developing Programs Using the FFmpeg Libraries
- How to setup Eclipse IDE for FFmpeg development
- Using libav* – Instructions for how to integrate FFmpeg’s main libraries into your own custom programs
- Including FFmpeg headers in a C++ application
?- List of FFmpeg API changes/compatibility test results
?- Lei Xiaohua’s Simplest FFmpeg Demos - Migration notes for major bump on 2021-04-27
我们重点以 https://trac.ffmpeg.org/wiki/BooksAndOtherExternalResources 中的 深入理解FFmpeg + FFmpeg 从入门到精通 开始我们的教程笔记。.
文章目录
第2章 FFmpeg 工具使用基础
FFmpeg 中常用的工具主要是 ffmpeg、ffprobe、ffplay ,它们分别用作多媒体的编解码工具、内容分析工具和播放器,本章将重点介绍这三个工具的常用命令。
本章主要介绍如下几个方面。
- 2.1 节将重点介绍 ffmpeg 命令,介绍 ffmpeg 常用的参数用法并举例说明,例如何查看 ffmpeg 的帮助信息,如何通过 ffmpeg 的帮助信息快速了解转码参数并快速上手使用。
- 2.2 节将重点介绍 ffprobe 命令,介绍 ffprobe 进行音视频数据分析的常用参数,并通过实例介绍如何分析视频文件的流信息、包信息、帧信息、导出数据等。
- 2.3 节将重点介绍 ffplay 命令,介绍 ffplay 常用的参数使用及示例,例如,如何 ffplay 定制化窗口播放视频、输出音频可视化数据、输出视频可视化数据等。
2.1 ffmpeg 常用命令
ffmpeg -help
ffmpeg 在做音视频编解码时非常方便,所以在很多场景下转码使用的是 ffmpeg ,通过 ffmpeg -help
可以看到 ffmpeg 常见的命令大概分为6个部分,具体如下。
- ffmpeg 信息查询部分
- 公共操作参数部分
- 文件主要操作参数部分
- 视频操作参数部分
- 音频操作参数部分
- 字幕操作参数部分
ffmpeg 信息查询部分的主要参数具体如下:
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
Getting help:
-h -- print basic options
-h long -- print more options
-h full -- print all options (including all format and codec specific options, very long)
-h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf
See man ffmpeg for detailed description of the options.
Print help / information / capabilities:
-L show license
-h topic show help
-? topic show help
-help topic show help
--help topic show help
-version show version
-buildconf show build configuration
-formats show available formats
-muxers show available muxers
-demuxers show available demuxers
-devices show available devices
-codecs show available codecs
-decoders show available decoders
-encoders show available encoders
-bsfs show available bit stream filters
-protocols show available protocols
-filters show available filters
-pix_fmts show available pixel formats
-layouts show standard channel layouts
-sample_fmts show available audio sample formats
-colors show available color names
-sources device list sources of the input device
-sinks device list sinks of the output device
-hwaccels show available HW acceleration methods
通过 ffmpeg --help
查看到的 help 信息 ffmpeg 命令的基础信息,如果想获得高级参数部分,可以通过使用 ffmpeg --help long
参数来查看,如果希望获得全部的帮助信息, 那么可以通过使用 ffmpeg --help full
参数来获得。
通过 -L
参数,可以看到 ffmpeg 目前所支持的 license 协议;通过 -version
可以查ffmpeg 的版本 ,包括子模块的详细版本信息,如 libavformat、 libavcodec、 libavutil、libavfilter、 libswscale、 libswresample 的版本:
ffmpeg -formats
使用 ffmpeg 转码,有时候可能会遇到无法解析的视频文件或者无法生成视频文件,报错提示不支持生成对应的视频文件,这时候就需要查看当前使用的 ffmpeg 是否支持对应的视频文件格式,需要使用 ffmpeg -formats
参数来查看:
D. = Demuxing supported
.E = Muxing supported
根据上面输出的信息可以看到,输出的内容分为3个部分, 具体如下。
- 第一列是多媒体文件封装格式的 Demuxing 支持(D)与 Muxing 支持(E)。
- 第二列是多媒体文件格式
- 第三列是文件格式的详细说明
ffmpeg -codecs
& ffmpeg -decoders
& ffmpeg -encoders
使用 ffmpeg 命令时,可能会出现 ffmpeg 不支持某种编码格式或者某种解码格式的错误提示信息,这种错误常见于并未将该编码器或者解码器集成到 ffmpeg 中,若想查看ffmpeg 是否支持 H.264 编码或者解码,可以通过 ffmpeg -codecs
查看全部信息,也可以通过 ffmpeg -encoders
查看 ffmpeg 是否支持 H.264 编码器,或者通过 ffmpeg -decoders
查看 ffmpeg 是否支持 H.264 解码器。
ffmpeg -decoders
命令行执行后,输出如下:
输出信息中包含了三部分内容,具体如下。
- 第一列包含6个字段,第一个字段用来表示此编码器为音频、视频还是字幕(video、audio、subtitle),第二个字段表示帧级别的多线程支持,第三个字段表示分片级别的多线程,第四个字段表示该编码为试验版本,第五个字段表示 draw horiz band 模式支持,第六个字段表示直接渲染模式支持
- 第二列是编码格式
- 第三列是编码格式的详细说明
ffmpeg -encoders
命令执行后,输出如下:
输出信息中同样包含了三部分内容,具体如下。
- 第一列包含6个字段,第一个字段用来表示此编码器为音频、视频还是字幕,第二个字段表示帧级别的多线程支持,第三个字段表示分片级别的多线程,第四个字段表示该编码为试验版本 ,第五个字段表示 draw horiz band 模式支持,第六个字段表示直接渲染模式支持
- 第二列是编码格式
- 第三列是编码格式的详细说明
ffmpeg -filter
除了查看 ffmpeg 支持的封装(Muxer)格式与解封装(Demuxer)格式、编码(Encoder)类型与解码(Decoder)类型,还可以通过 ffmpeg -filter
查看 ffmpeg 支持哪些滤镜:
输出信息的内容分为四列,具体如下。
- 第一列总共有3个字段,第一个字段是时间轴支持,第二个字段是分片线程处理支持,第三个字段是命令支持
- 第二列是滤镜名
- 第三列是转换方式,如音频转音频,视频转视频,创建音频,创建视频等操作
- 第四列是滤镜作用说明
ffmpeg --help full
通过 FFmpeg 通过 ffmpeg --help full
命令,可以查看 ffmpeg 支持的所有封装(demuxer、muxer)格式,编解码器(encoders、decoders)和滤镜处理器(filters)。如果 了解 ffmpeg 支持的具体某一种 demuxer、muxer 类型,可以通过 ffmpeg -h 查看该类型的详细参数,包括 encoder、decoder 所支持的操作参数, filter 所支持的参数,下面就列举几个对应的例子。
1)查看 FLV 封装器的参数支持(ffmpeg -h muxer=flv
)
从输出的帮助信息中可以看到, FLV 的 muxer 的信息包含两大部分,具体如下。
- 第一部分为 FLV 封装的默认配置描述,如扩展名、MIME 类型、默认的视频编码格式、默认的音频编码格式
- 第二部分为 FLV 封装时可以支持的配置参数及相关说明
2)查看 flv 解封装器的参数支持 (ffmpeg -h demuxer=flv
)
从帮助信息中可以看到, FLV 的 demuxer 的信息包含两大部分, 具体如下。
- 第一部分为 FLV 解封装默认的扩展文件名
- 第二部分为 FLV 解封装设置的参数及相关说明
3)查看 H.264(AVC)的编码参数支持(ffmpeg -h encoder=h264
)
从帮助信息可以看到,H.264 (AVC)的编码参数包含两大部分,具体如下。
- 第一部分为 H.264 所支持的基本编码方式、支持的多线程编码方式(例如帧级别多线程编码或 Slice 级别多线程编码)、编码器所支持的像素的色彩格式
- 第二部分为编码的具体配置参数及相关说明
4)查看 H.264 (AVC)的解码参数支持(ffmpeg -h decoder=h264
)
从帮助信息可以看到, H.264 (AVC)的解码参数查看包含两大部分,具体如下。
- 第一部分为解码 H.264 时可以采用的常规支持、多线程方式支持(帧级别多线程解码或 Slice 级别多线程解码)
- 第二部分为解码 H.264 时可以采用的解码参数及相关说明)
5)查看 colorkey 滤镜的参数支持(ffmpeg -h filter=colorkey
)
从帮助信息中可以看到, colorkey 滤镜参数查看信息包含两大部分,具体如下。
- colorkey 所支持的色彩格式信息, colorkey 所支持的多线程处理方式,输入或输出支持
- colorkey 所支持的参数及说明
关于 ffmpeg 的帮助信息查询部分已介绍完毕 ,下面详细介绍 ffmpeg 的封装转换。
2.1.1 ffmpeg 的封装转换
ffmpeg 封装转换(转封装)功能包含在 AVFormat 模块中,通过 libavformat 库进行 Mux 和 Demux 操作;多媒体文件的格式有很多种,这些格式中的很多参数在 Mux 与 Demux 的操作参数中是公用的,下面就来详细介绍一下这些公用的参数。
通过查看 ffmpeg --help full
信息,找到 AVFormatContext 参数部分(可以用ffmpeg --help full | grep AVFormatContext -A 100
命令),该参数下的所有参数均为封装转换可使用的参数。表 2-1 列出了 ffmpeg AVFormatContext 主要参数及说明。
这些都是通用的封装、解封装操作时使用的参数,后续章节中介绍转封装操作、解封操作、封装操作时,上述参数可以与对应的命令行参数搭配使用
2.1.2 ffmpeg 的转码参数
ffmpeg 编解码部分的功能主要是通过模块 AVCodec 来完成的,通过 libavcodec 库进行 Encode 与 Decode 操作。多媒体编码格式的种类有很多,但是还是有很多通用的基本操作参数设置,下面就来详细介绍一下这些公用的参数。
通过命令 ffmpeg --help full
可以看到 AVCodecContext 参数列表信息(可以用ffmpeg --help full | grep AVCodecContext -A 500
命令查看),具体见表 2-2,该选项下面的所有参数均为编解码可以使用的参数。
ffmpeg 还有一些更细化的参数,本节中并未详细提及,可以根据本节中提到的查看方法查看 ffmpeg 的帮助文件以查看更多的内容,本节中介绍的是重点及常用的通用参数,后续章节中介绍编码操作时,上述参数可以配合对应的例子使用。
2.1.3 ffmpeg 的基本转码原理
ffmpeg 工具的主要用途为编码、解码、转码以及媒体格式转换,ffmpeg 常用于进行转码操作,使用 ffmpeg 转码的主要原理如图 1-4 所示。
通过前两节介绍的参数,可以设置转码的相关参数,如果转码操作涉及封装的改变,则可以通过设置 AVCodec 与 AVFormat 的操作参数进行封装与编码的改变 ,下面列举一个例子:
(注意在此之前,我们先用图片ffmpeg -loop 1 -i Lena_Soderberg.jpg -c:v rv20 -t 10 -f rm video3.rmvb
生成一个rmvb的视频)
ffmpeg -i video3.rmvb -vcodec mpeg4 -b:v 200k -r 15 -an output.mp4
此命令解释如下:
-i /Movies/input.rmvb
:指定输入文件。-vcodec mpeg4
:设置输出视频编码为 MPEG-4。-b:v 200k
:设置视频比特率为 200kbps。-r 15
:设置帧率为 15fps。-an
:禁用音频记录。output.mp4
:指定输出文件名。
命令行执行后输出的基本信息如下:
从输出信息中可以看到,以上输出的参数中使用了前面介绍过的参数,具体如下。
- 转封装格式从 RMVB 格式转换为 MP4 格式
- 视频编码从 RV20 转换为 MPEG4 格式
- 视频码率从原来的 200kbit/s 转换为 200kbit/s(没变)
- 视频帧率从原来的 25fps 转换为 15fps
- 转码后的文件中不包括音频( -an 参数)
可以分析出,这个例子的流程与前面提到的流程相同 ,首先解封装,需要解的封装为RMVB;然后解码,其中视频编码为 RV20 ,音频编码为 COOK(我上面无);然后解码后的视频编码为 MPEG4;最后封装为一个没有音频的 MP4 文件。更多详细的例子在后面的章节中将有详细的介绍。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!