FFmpeg命令创建规则与解析


看了那么多别人写的FFmpeg命令操作,能完成各种各样的编码、解码、录屏、推流、分流、合流等操作,就是一直看别人写,然而当要亲自写一个操作命令的时候,却无法下手,因此还是必须对FFmpeg的命令有一个更清晰的了解,了解如何创建、需要哪些构成、创建规则、一些常用选项等等,总之要熟悉到可以很容易的创建自己需要的命令。

操作命令示例

ffmpeg -f v4l2 -s 1280x720 -i /dev/video0 -f alsa -i hw:1,0 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -ab 16000 -ar 22050 -ac 1 -f mp3 -f flv rtmp://192.168.1.102:1935/live0
这个命令的作用是
命令的输出信息如下:

ffmpeg version 4.0.2 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.9) 20160609
  configuration: --prefix=/usr/local --enable-shared --enable-libx264 --enable-libopencv --enable-gpl
  libavutil      56. 14.100 / 56. 14.100
  libavcodec     58. 18.100 / 58. 18.100
  libavformat    58. 12.100 / 58. 12.100
  libavdevice    58.  3.100 / 58.  3.100
  libavfilter     7. 16.100 /  7. 16.100
  libswscale      5.  1.100 /  5.  1.100
  libswresample   3.  1.100 /  3.  1.100
  libpostproc    55.  1.100 / 55.  1.100
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 688590.974857, bitrate: 110592 kb/s
    Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x360, 110592 kb/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
Guessed Channel Layout for Input Stream #1.0 : stereo
Input #1, alsa, from 'hw:1,0':
  Duration: N/A, start: 1561430261.799069, bitrate: 1024 kb/s
    Stream #1:0: Audio: pcm_s16le, 32000 Hz, stereo, s16, 1024 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
  Stream #1:0 -> #0:1 (pcm_s16le (native) -> adpcm_swf (native))
Press [q] to stop, [?] for help
[video4linux2,v4l2 @ 0x16ae480] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
[libx264 @ 0x16d6d40] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 AVX2 LZCNT BMI2
[libx264 @ 0x16d6d40] profile High 4:2:2, level 3.0, 4:2:2 8-bit
[libx264 @ 0x16d6d40] 264 - core 148 - H.264/MPEG-4 AVC codec - Copyleft 2003-2016 - http://www.videolan.org/x264.html 
- options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 
chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=5 lookahead_threads=5
 sliced_threads=1 slices=5 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 
 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=crf mbtree=0 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4
 ip_ratio=1.40 aq=0
[alsa @ 0x16b0900] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
Output #0, flv, to 'rtmp://192.168.1.102:1935/live0':
  Metadata:
    encoder         : Lavf58.12.100
    Stream #0:0: Video: h264 (libx264) ([7][0][0][0] / 0x0007), yuv422p(progressive), 640x360, q=-1--1, 30 fps, 1k tbn, 30 tbc
    Metadata:
      encoder         : Lavc58.18.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
    Stream #0:1: Audio: adpcm_swf ([1][0][0][0] / 0x0001), 22050 Hz, mono, s16, 88 kb/s
    Metadata:
      encoder         : Lavc58.18.100 adpcm_swf
[flv @ 0x16d0740] Failed to update header with correct duration.ate= 842.7kbits/s speed=1.02x    
[flv @ 0x16d0740] Failed to update header with correct filesize.
frame= 1028 fps= 30 q=24.0 Lsize=    3664kB time=00:00:35.29 bitrate= 850.4kbits/s speed=1.01x    
video:3245kB audio:382kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.002358%
[libx264 @ 0x16d6d40] frame I:5     Avg QP:18.80  size: 33174
[libx264 @ 0x16d6d40] frame P:1023  Avg QP:21.69  size:  3086
[libx264 @ 0x16d6d40] mb I  I16..4: 100.0%  0.0%  0.0%
[libx264 @ 0x16d6d40] mb P  I16..4:  3.0%  0.0%  0.0%  P16..4: 45.6%  0.0%  0.0%  0.0%  0.0%    skip:51.4%
[libx264 @ 0x16d6d40] coded y,uvDC,uvAC intra: 30.6% 55.9% 12.7% inter: 14.8% 19.7% 1.0%
[libx264 @ 0x16d6d40] i16 v,h,dc,p: 18% 52% 18% 11%
[libx264 @ 0x16d6d40] i8c dc,h,v,p: 45% 33% 13%  9%
[libx264 @ 0x16d6d40] kb/s:775.72
Exiting normally, received signal 2.

输出了这么一大串,都是些什么鬼?

命令解释

总的来说以上的命令示例含义是:获取v4l2设备/dev/video0的视频分辨率是1280*720,获取alsa设备hw:1,0的音频,音频采样参数为单声道16K;视频采用libx264编码为H264帧,音频采用MP3编码,音频编码参数为双声道,22050采样率;然后将视频与音频合成为flv格式的音视频流,通过rtmp方式推送。

命令选项 命令参数 命令释义
-f v4l2 -f 是个很常用的选项,指示一个设备类型,或者文件的格式,dshow来表示Windows的音视频设备
-s 1280*720 用于指示视频的分辨率
-i /dev/video0 -i 选项用于指示一个数据输入源的设备或者具体的音视频文件
-f alsa 指示Linux下的音频设备类型
-i hw:1,0 指示Linux下的ALSA类型音频设备
-vcodec libx264 指示一个视频编码器
-preset:v ultrafast x264编码器预设参数,ultrafast表示最快的编码方式
-tune:v zerolatency 编码调优参数,zerolatency表示无延迟
-ab 16000 表示音频的码率
-ar 22050 表示音频的采样率
-ac 1 音频采样通道数
-f mp3 文件格式MP3
-f flv 文件格式flv

简单介绍一下命令行中输出的信息:

  • FFmpeg首先输出编译这个FFmpeg命令时的编译选项、gcc版本、库版本等信息
  • Input #0:表示第一个输入文件,是v4l2格式的/dev/video0设备文件
  • Stream #0:0:表示第一个输入文件的第一个输入流
  • Input #1, alsa, from 'hw:1,0':表示第二个输入文件,格式为alsa,设备是hw:1,0,这种设备格式,是alsa的设备选择方式
  • Stream #1:0: Audio: pcm_s16le, 32000 Hz, stereo, s16, 1024 kb/s:表示音频数据格式pcm,16bit,小端存储方式,采样率为32K,stereo表示双声道,码率是1024kb/s
  • Stream mapping:给出了输入与输出流之间的映射关系,仔细看其后面的Stream #0:0Stream #1:0的输出信息,就明白两个输入流的要经过怎样的处理,本例中Stream #0:0原生视频流要被编码成H264视频流,Stream #1:0原生音频流,转换成adpcm_swf可被flv识别的音频流,并未经过音频编码
  • [video4linux2,v4l2 @ 0x16ae480]:表示通过v4l2操作,读取视频流的线程输出的相关信息,大致意思是,线程消息队列被阻塞,考虑提升当前线程的消息队列数量,当前值是8
  • [libx264 @ 0x16d6d40]:这是libx264编码库输出的信息,主要是检查当前CPU下可提供的编码能力,H264编码profile、level选择,编码参数选项等信息
  • [alsa @ 0x16b0900]:音频处理线程的输出信息,基本与视频线程输出信息一致
  • Output #0, flv, to 'rtmp://192.168.1.102:1935/live0':表示输出文件的格式,目标文件是一个rtmp网络流
    Stream #0:0: Video: h264 (libx264) ([7][0][0][0] / 0x0007), yuv422p(progressive), 640x360, q=-1--1, 30 fps, 1k tbn, 30 tbc:表示输出文件的第1个索引的流信息,h264,并给出基本的视频分辨率,帧率等信息
    Stream #1:0:Audio: adpcm_swf ([1][0][0][0] / 0x0001), 22050 Hz, mono, s16, 88 kb/s:表示输出文件的第2个索引的流信息,audio,格式adpcm_swf
  • [flv @ 0x16d0740]:输出文件flv,音视频合成muxer的输出信息,主要关注文件的总体码率、帧率等信息
  • [libx264 @ 0x16d6d40]:后续输出一些在进行H264编码时的状态信息,主要是一些统计信息

FFmpeg命令创建规则

要理解一条FFmpeg命令,我们首先应该知道FFmpeg命令由那几部分组成,每一部分的用途,有哪些选项、参数可供使用等;命令的格式,选项与参数如何表示、关联关系等,只有明白这些之后才能很好的理解一条FFmpeg命令。

FFmpeg命令组成

FFmpeg的命令由简到繁,主要包含以下以几个部分

  • FFmpeg的信息查询:主要用于查询编码器、解码器、合成器、分解器等版本、支持的操作参数等信息
  • FFmpeg的公用操作部分:主要是封装、格式转换、编码、解码等都可以使用的参数
  • 文件操作:主要用于指定输入文件、输出文件、文件类型、文件格式
  • 音频操作:主要用于指定音频的格式、采样、量化、编码、解码、合成、提取等操作
  • 视频操作:主要用于指定视频的格式、分辨率、帧率、编码、解码、合成、提取等操作
  • 字幕操作:主要用于指定字幕的格式、文件,将字幕合成到视频,或者从视频中提取字幕

一个完整的FFmpeg操作命令,包含以上一个或多个部分。

FFmpeg命令基本格式与规则

ffmpeg [全局选项] {[输入文件选项] -i 输入文件} ... {[输出文件选项] 输出文件} ...

  • 命令格式中[]括号内的内容为可选项,可有可无
  • 命令格式中{}括号内的内容为必选项,必须存在
  • 命令中必须至少包含一个输入文件、一个输出文件;可以同时存在多个输入文件、或者输出文件
  • 命令中输入文件必须用-i选项指定,输出文件无须用选项指定
  • 任何在命令中不能被解释为选项、参数的信息,都将被作为输出文件
  • 每个输入或输出文件都可包含数量不同的数据流(视频/音频/字幕/附件/数据等),具体文件中包含流的数量、数据类型是文件的容器格式限定的,即我们看到的文件后缀名
  • 具体选择那些流从输入文件到输出文件,是自动或者依据-map选项来指定
  • 输入与输出文件的索引从0开始,同理一个输入与输出文件中的流索引也是从0开始
  • 命令的规则中,选项位于其作用的输入或者输出文件之前,且只能作用于一个输入或者输出文件,若需要作用于其它输入与输出文件,必须重复指定选项
  • 命令必须先指定输入文件,当有多个输入输出文件时,输入文件指定完毕之后才能指定输出文件
  • 以上规则也适用于ffplayffproble命令

FFmpeg常用参数选项

命令选项 命令释义
-f -f 是个很常用的选项,指示一个设备类型,或者文件的格式,dshow来表示Windows的音视频设备
-s 设置视频的分辨率
-ss 设置命令动作开始时间
-t 设置命令操作时间长度
-i -i 选项用于指示一个数据输入源的设备或者具体的音视频文件,可以与-i联合指定一个设备文件
-vcodec 指示一个视频编码器
-acodec 指示一个视频编码器
-b 设置音频与视频加起来的码率,可以用b:a设置音频码率,b:v设置视频码率
-ab 设置音频码率
-ar 设置音频采样率
-ac 设置音频通道数
-r 设置视频帧率
-g 设置视频GOP数值
-bf 设置视频连续编码为B帧的个数
-an 设置禁用音频
-vn 设置禁用视频
-aspect 设置视频画面宽高比,一般是4:3,16:9等

ffpaly命令

新版本的FFMpeg源码需要SDL-2.0的支持,才能编译出ffplay工具,其主要是一个播放器,用于播放多媒体文件,同时可以查看视频图像的运动方向估计,音频数据的波形。
ffplay不仅可以用作播放器,还可以测试FFmpeg的codec引擎、format引擎、filter引擎的工具
ffplay命令的常用选项如下:

命令选项 命令释义
-formats 列出所有可用的格式
-muxers 列出所有的复用器
-demuxers 列出所有的解复用器
-devices 显示所有设备
-codecs 显示所有编解码
-decoders 显示所有解码器
-encoders 显示所有编码器
-protocols 显示所有协议
-filters 显示所有滤镜
-pix_fmts 显示所有像素格式
-layouts 显示标准channel布局
-sample_fmts 设置音频采样格式
-loglevel 设置日志登记
-x 设置视频显示宽度
-y 设置视频显示高度
-ast 设置将要播放的音频流
-vst 设置将要播放的视频流
-sst 设置将要播放的字幕流
-stats 输出多媒体播放状态
-fast 非标准的多媒体播放优化
-sync 设置音视频同步,可根据音频、视频、外部时钟进行同步
-autoexit 多媒体播放完毕后自动退出,默认不自动退出
-exitonkeydown 任意按键按下,播放器退出
-exitonmousedown 鼠标键按下,播放器退出
-loop 设置循环播放次数
-framedrop CPU占用过高时,自动丢帧
-infbuf 设置无极限的播放器buffer,主要用于播放实时流媒体
-vf 设置视频滤镜
-acodec 设置音频解码器
-vcodec 设置视频解码器
-scodec 设置字幕解码器

命令示例

  • ffpaly -ss 30 -t 10 input.mp4:从输入文件的第30S开始播放,播放时长为10S
  • ffpaly showmode 1 input.mp3:将输入的音频MP3文件,以波形的方式进行播放
  • ffplay input.mp4 -vf codecview=mv=pf+bf+bb:查看B帧和P帧预测信息

ffprobe命令

ffprobe命令工具主要用于查看多媒体文件的信息,其参数选项大部分与ffpaly命令一致,这里仅列出我们跟关心的不同的参数选项:

命令选项 命令释义
-print_format 设置输出信息的打印格式
-select_streams 选择流
-show_data 显示packet的数据
-show_format 显示容器(即多媒体文件格式)的信息
-show_frames 显示帧信息,解码前
-show_packets 显示数据包信息,解码后
-count_frames 计算帧数量
-count_packts 计算包数量

命令示例

  • ffprobe -show_packets input.flv:探测输入文件的包信息
  • ffprobe -show_packets -show_data input.flv:选项配合,显示更精确的信息
  • ffprobe -show_format input.flv:探测输入文件的封装信息

以上就是关于FFmpeg命令的创建于规则的解析,至此我大概明白了FFmpeg的命令该如何使用,希望对感兴趣的小伙伴有点用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章