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 |
简单介绍一下命令行中输出的信息:
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/sStream mapping
:给出了输入与输出流之间的映射关系,仔细看其后面的Stream #0:0
与Stream #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 [全局选项] {[输入文件选项] -i 输入文件} ... {[输出文件选项] 输出文件} ...
[]
括号内的内容为可选项,可有可无{}
括号内的内容为必选项,必须存在-i
选项指定,输出文件无须用选项指定-map
选项来指定0
开始,同理一个输入与输出文件中的流索引也是从0
开始ffplay
、ffproble
命令命令选项 | 命令释义 |
---|---|
-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等 |
新版本的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开始播放,播放时长为10Sffpaly showmode 1 input.mp3
:将输入的音频MP3文件,以波形的方式进行播放ffplay input.mp4 -vf codecview=mv=pf+bf+bb
:查看B帧和P帧预测信息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的命令该如何使用,希望对感兴趣的小伙伴有点用。