ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg 工具使用基础——第一节:ffmpeg常用命令

文章目录

    • 第2章 FFmpeg 工具使用基础
      • 2.1 ffmpeg 常用命令
          • `ffmpeg -help`
          • `ffmpeg -formats`
          • `ffmpeg -codecs` & `ffmpeg -decoders ` & `ffmpeg -encoders`
          • `ffmpeg -filter`
          • `ffmpeg --help full`
            • 1)查看 FLV 封装器的参数支持(`ffmpeg -h muxer=flv`)
            • 2)查看 flv 解封装器的参数支持 (`ffmpeg -h demuxer=flv`)
            • 3)查看 H.264(AVC)的编码参数支持(`ffmpeg -h encoder=h264`)
            • 4)查看 H.264 (AVC)的解码参数支持(`ffmpeg -h decoder=h264`)
            • 5)查看 colorkey 滤镜的参数支持(`ffmpeg -h filter=colorkey`)
        • 2.1.1 ffmpeg 的封装转换
        • 2.1.2 ffmpeg 的转码参数
        • 2.1.3 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教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg 工具使用基础——第一节:ffmpeg常用命令_第1张图片

ffmpeg -formats

使用 ffmpeg 转码,有时候可能会遇到无法解析的视频文件或者无法生成视频文件,报错提示不支持生成对应的视频文件,这时候就需要查看当前使用的 ffmpeg 是否支持对应的视频文件格式,需要使用 ffmpeg -formats 参数来查看:

ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg 工具使用基础——第一节:ffmpeg常用命令_第2张图片

 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 命令行执行后,输出如下:

ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg 工具使用基础——第一节:ffmpeg常用命令_第3张图片
ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg 工具使用基础——第一节:ffmpeg常用命令_第4张图片

输出信息中包含了三部分内容,具体如下。

  • 第一列包含6个字段,第一个字段用来表示此编码器为音频、视频还是字幕(video、audio、subtitle),第二个字段表示帧级别的多线程支持,第三个字段表示分片级别的多线程,第四个字段表示该编码为试验版本,第五个字段表示 draw horiz band 模式支持,第六个字段表示直接渲染模式支持
  • 第二列是编码格式
  • 第三列是编码格式的详细说明

ffmpeg -encoders 命令执行后,输出如下:

ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg 工具使用基础——第一节:ffmpeg常用命令_第5张图片

输出信息中同样包含了三部分内容,具体如下。

  • 第一列包含6个字段,第一个字段用来表示此编码器为音频、视频还是字幕,第二个字段表示帧级别的多线程支持,第三个字段表示分片级别的多线程,第四个字段表示该编码为试验版本 ,第五个字段表示 draw horiz band 模式支持,第六个字段表示直接渲染模式支持
  • 第二列是编码格式
  • 第三列是编码格式的详细说明
ffmpeg -filter

除了查看 ffmpeg 支持的封装(Muxer)格式与解封装(Demuxer)格式、编码(Encoder)类型与解码(Decoder)类型,还可以通过 ffmpeg -filter 查看 ffmpeg 支持哪些滤镜:

ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg 工具使用基础——第一节:ffmpeg常用命令_第6张图片

输出信息的内容分为四列,具体如下。

  • 第一列总共有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

ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg 工具使用基础——第一节:ffmpeg常用命令_第7张图片

从输出的帮助信息中可以看到, FLV 的 muxer 的信息包含两大部分,具体如下。

  • 第一部分为 FLV 封装的默认配置描述,如扩展名、MIME 类型、默认的视频编码格式、默认的音频编码格式
  • 第二部分为 FLV 封装时可以支持的配置参数及相关说明
2)查看 flv 解封装器的参数支持 (ffmpeg -h demuxer=flv

在这里插入图片描述

从帮助信息中可以看到, FLV 的 demuxer 的信息包含两大部分, 具体如下。

  • 第一部分为 FLV 解封装默认的扩展文件名
  • 第二部分为 FLV 解封装设置的参数及相关说明
3)查看 H.264(AVC)的编码参数支持(ffmpeg -h encoder=h264

ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg 工具使用基础——第一节:ffmpeg常用命令_第8张图片
ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg 工具使用基础——第一节:ffmpeg常用命令_第9张图片

从帮助信息可以看到,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

ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg 工具使用基础——第一节:ffmpeg常用命令_第10张图片

从帮助信息中可以看到, 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 所示。

ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg 工具使用基础——第一节:ffmpeg常用命令_第11张图片

通过前两节介绍的参数,可以设置转码的相关参数,如果转码操作涉及封装的改变,则可以通过设置 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 :指定输出文件名。

命令行执行后输出的基本信息如下:

ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg 工具使用基础——第一节:ffmpeg常用命令_第12张图片

从输出信息中可以看到,以上输出的参数中使用了前面介绍过的参数,具体如下。

  • 转封装格式从 RMVB 格式转换为 MP4 格式
  • 视频编码从 RV20 转换为 MPEG4 格式
  • 视频码率从原来的 200kbit/s 转换为 200kbit/s(没变)
  • 视频帧率从原来的 25fps 转换为 15fps
  • 转码后的文件中不包括音频( -an 参数)

可以分析出,这个例子的流程与前面提到的流程相同 ,首先解封装,需要解的封装为RMVB;然后解码,其中视频编码为 RV20 ,音频编码为 COOK(我上面无);然后解码后的视频编码为 MPEG4;最后封装为一个没有音频的 MP4 文件。更多详细的例子在后面的章节中将有详细的介绍。

你可能感兴趣的:(音视频,ffmpeg,ffmpeg,笔记,c++)