前言
在上一篇博客中我们搭建了FFmpeg的基本环境,这一篇博客我们主要来说一下FFmpeg的各种命令,主要包含一下九大类命令.如下所示.接下来我们就逐一的来说明每一种命令的使用与示例.
FFmpeg命令分类 |
---|
基本信息查询命令 |
录制命令 |
播放命令 |
分解/复用命令 |
处理原始数据命令 |
裁剪与合并命令 |
图片/视频互转命令 |
直播相关命令 |
视频滤镜命令 |
基本信息查询命令
常用基本信息查询命令如下所示.
命令 | 作用 | 命令 | 作用 |
---|---|---|---|
-version | 显示版本 | -formats | 显示可用的格式 |
-demuxers | 显示可用的demuxers | -protocols | 显示可用的协议 |
-muxers | 显示可用的muxers | -filters | 显示可用的过滤器 |
-devices | 显示可用的设备 | -pix_fmts | 显示可用的像素点 |
-codecs | 显示所有编解码器 | -sample_fmts | 显示可用的采样格式 |
-decoders | 显示可用的解码器 | -layouts | 显示channel名称 |
-encoders | 显示可用的编码器 | -colors | 显示识别的颜色名称 |
-bsfs | 显示比特流filter |
例如查询 可用的解码器,我们直接使用下面的命令即可.
ffmpeg -decoders
录制命令
录制命令也是我们常用的一种命令,这里直接上命令了.
ffmpeg -f avfoundation -i 1 -r 30 out.yuv
各个参数的解释如下所示.
参数 | 说明 |
---|---|
-f | 指定使用哪个库来采集数据,avfoundation是iOS的音视频库 |
-i | 指定从哪里采集数据,它是一个文件索引号,我们可以通过ffmpeg -f avfoundation -list_devices true -i "" 查询. |
-r | 指定帧率 |
这里先说明一下查询文件索引号的命令.
ffmpeg -f avfoundation -list_devices true -i ""
当我们使用上面的命令去查询avfoundation的所能使用的设备的时候.
[AVFoundation input device @ 0x7fb4cb50f1c0] AVFoundation video devices:
[AVFoundation input device @ 0x7fb4cb50f1c0] [0] FaceTime 高清摄像头(内建)
[AVFoundation input device @ 0x7fb4cb50f1c0] [1] Capture screen 0
[AVFoundation input device @ 0x7fb4cb50f1c0] AVFoundation audio devices:
[AVFoundation input device @ 0x7fb4cb50f1c0] [0] Built-in Microphone
我们可以看到我的电脑一共有两个视频设备和一个音频设备, 在录制的时候,我们使用-i 1
的指令就是来指定我们需要录制桌面,所以我们可以捕捉到桌面的图像.当然了,我们可以使用-i 0
来开启电脑的高清摄像头,来捕捉到我这个逗比,哈哈[手动滑稽]
上面我们可以录制视频,我们如何录制音频呢?我们在录制音频的时候该如何制定我们的设备呢?我们带着这些疑问接着往下看.录制音频的时候,我们整体的命令如下所示.
ffmpeg -f avfoundation -i :0 out.wav
这时候我们发现
-i
指定音频设备的时候文件索引号前面需要加冒号 :
上面我们看到了如何录制视频和音频,如果我们想同时录制音视频该怎么办呢?我们只需要把上面的两条命令合并一下即可.整体命令如下所示.
ffmpeg -f avfoundation -i :0 -f avfoundation -i 0 -r 30 out.flv
播放命令
在录制命令模块中我们录制了视频和音频,所以我们需要看我们录制的结果,这时候需要播放命令.播放命令是基于 ffplay 的,这里有个点需要注意,那就是yuv格式的视频数据是没有包含帧大小(WxH)的视频文件.所以我们需要指定帧大小.整体命令如下所示.
ffplay -s 1920x1080 -pix_fmts uyvy422 out.yuv
参数 | 说明 |
---|---|
-s | 设置显示帧存储(WxH格式),仅适用于类似原始YUV等没有包含帧大小(WxH)的视频. |
-pix_fmts | 设置像素格式.ffplay 默认使用的像素格式yuv420p,但是录制的是uyvy422. |
上面两个参数具体指可以参考录制过程中的打印值.
对于音频和常见的音视频,我们可以不加任何的参数直接进行播放,如下所示.
ffplay out.wav
上面我们说到了如何播放音视频,接下来我们简单的说一下 ffplay 其他常见的参数.
ffplay参数 | 说明 |
---|---|
-x | 强制显示宽带。 |
-y | 强制显示高度。 |
-s | 帧尺寸 设置显示帧存储(WxH格式),仅适用于类似原始YUV等没有包含帧大小(WxH)的视频。该参数已经被废弃,请尝试用-video_size代替. |
-fs | 以全屏模式启动。 |
-an | 禁用音频(不播放声音) |
-vn | 禁用视频(不播放视频) |
-sn | 禁用字幕(不显示字幕) |
-ss | 根据设置的秒进行定位拖动,注意时间单位:比如'55' 55 seconds, '12:03:45' ,12 hours, 03 minutes and 45 seconds, '23.189' 23.189 second |
-t | 设置播放视频/音频长度,时间单位如 -ss选项 |
-bytes | 按字节进行定位拖动。 |
-seek_interval | 自定义左/右键定位拖动间隔(以秒为单位),默认值为10秒 |
-nodisp | 关闭图形化显示窗口,视频将不显示 |
-noborder | 无边框窗口 |
-volume | 设置起始音量。音量范围[0 ~100] |
-f | 强制使用设置的格式进行解析。比如-f s16le |
-loop | 设置播放循环次数 |
-showmode | 设置显示模式,可用的模式值:0 显示视频,1 显示音频波形,2 显示音频频谱。缺省为0,如果视频不存在则自动选择2 |
-vf | 设置视频滤镜 |
-af | 设置音频滤镜 |
分解/复用命令
上面说到录制和播放命令两种命令,这一个模块我们来说说分解与复用命令.比如一个视频里面包含着视频流,音频流以及其他信息,我们想单独的抽取视频或者音频,这时候我们该怎么办呢?这时候我们就需要用到我们的分解/复用命令了.
例如我们想把一个视频格式进行转换,其实就是一个分解与复用的过程.那么我们就可以如下命令进行操作.
ffmpeg -i input.mp4 -vcodec copy -acodec copy out.mov
参数 | 说明 |
---|---|
-i | 指定需要转换格式的文件 |
-vcodec | 视频处理方式 |
-acodec | 音频处理方式 |
当我们需要单独抽取音频或者视频的时候,我们需要用的操作是这样的.-vn 和 -an 两个参数去除视频和音频.命令如下所示.
#抽取视频
ffmpeg -i input.mp4 -vcodec copy -an out.mov
#抽取音频
ffmpeg -i input.mp4 -acodec copy -vn out.aac
当我们了解基本的分解与复用命令之后,我们就可以做一些比较有趣的事情,例如做一个小咖秀的功能,给一段视频进行配音.其实就是我们需要抽取出我们的视频数据,把视频数据和音频数据合并在一起即可.
#移除原始的音频数据
ffmpeg -i input.mp4 -vcodec copy -an out.mp4
#合并新的视频和音频数据
ffmpeg -i out.mp4 -i out.aac -vcodec copy -acodec copy result.mp4
处理原始数据命令
有些时候,我们需要提取音视频文件中的原始数据,例如yuv视频原始数据和pcm音频原始数据等等,这时候我们就需要使用到处理原始数据命令了.接下来我们直接来看示例.
ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv
参数 | 说明 |
---|---|
-i | 指定操作的多媒体文件 |
-an | 移除音频 |
-c:v rawvideo | 对视频进行编码(原始数据格式) |
-pix_fmt | 设置像素格式. |
我们抽取音频的时候,需要指定 音频采样率 ,声道信息 ,存储格式 等相关参数.命令如下所示.
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
参数 | 说明 |
---|---|
-i | 指定操作的多媒体文件 |
-vn | 移除视频 |
-ar | 音频的采样率 例如 44100 48000 32000 16000 等 |
-ac | 设置声道 |
-f | 设置存储格式 例如这里使用的是s16le |
同时注意的是,在播放的时候也需要注意存储格式.所以播放命令示例如下所示.
ffplay -f s16le out.pcm
裁剪与合并命令
在日常生活中我们会有对视频进行裁剪以及对多个视频进行合并需求,这时候我们就需要使用到裁剪与合并命令了.废话不多讲,我们直接上示例.
ffmpeg -i input.mp4 -ss 00:00:00 -t 3 out.mp4
参数 | 说明 |
---|---|
-i | 指定操作的多媒体文件 |
-ss | 裁剪开始时间 |
-t | 剪切时长,单位秒 |
合并命令和我们以前命令有些不同,为了实现多个视频的合并,我们需要在一个文件中写下我们所需要合并的所有的多媒体文件.格式如下所示.
file 'input.mp4'
file 'input2.mp4'
接着我们使用我们的合并命令就行了.命令如下所示.
ffmpeg -f concat -i inputs.txt out.mp4
参数 | 说明 |
---|---|
-i | 指定操作的文件 |
-f concat | 合并操作 |
图片/视频互转命令
图片和视频的互相转换也是我们日常生活比较常用的功能.我们经常需要去视频中抽取图片,也会有把图片转换为视频的需求.这是我们就可以使用FFmpeg来解决这些问题了.
#视频转图片
ffmpeg -i input.mp4 -r 1 -f image2 image-%3d.jpeg
参数 | 说明 |
---|---|
-i | 指定操作的文件 |
-f image2 | 指定图片类型 |
-r | 转换图片的帧率,一秒几张 |
#图片转视频
ffmpeg -i image-%3d.jpeg -r 6 out.mp4
参数 | 说明 |
---|---|
-i | 指定操作的文件 |
-r | 指定一张图片所占的帧率 |
直播命令
直播命令我们可能更多的会用于测试,例如使用直播命令推流或者拉流.
#直播推流命令
ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/stramName
#直播拉流命令
ffmpeg -i rtmp://server/live/stramName -c copy dump.flv
例如,下面就是可用的示例.
ffmpeg -i http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8 -c copy dump.m3u8
视频滤镜命令
FFmpeg中的视频滤镜也是非常的丰富的,我们可以通过以前的命令查询所有可用的滤镜信息.
ffmpeg -filters
这里我们只说几个常见的滤镜.
- 视频的裁剪滤镜
ffmpeg -i input.mp4 -vf crop=in_w-100:in_h-100 -c:v libx264 -c:a copy out.mp4
参数 | 说明 |
---|---|
-i | 指定操作的文件 |
-vf | 指定视频滤镜 |
crop | 滤镜名称 |
-c:v | 指定视频编码格式 |
-c:a | 指定音频编码格式 |
- 视频的缩放
ffmpeg -i input.mp4 -vf scale=iw/2:-1 scale.mp4
参数 | 说明 |
---|---|
-i | 指定操作的文件 |
-vf | 指定视频滤镜 |
scale | 滤镜名称,iw/2表示宽缩小一倍,-1表示高等比例缩小 |
- 添加水印
ffmpeg -i input.mp4 -i logo.png -filter_complex "[1:v] scale=80:80[logo];[0:v][logo]overlay=x=0:y=0" logo.mp4
参数 | 说明 |
---|---|
-i | 指定操作的文件 |
-vf | 指定视频滤镜 |
scale | 图片宽高信息 |
overlay | 图片的位置信息 |
- 去除水印
ffmpeg -i logo.mp4 -filter_complex "delogo=x=1:y=1:w=80:h=80:show=1" delogo.mp4
参数 | 说明 |
---|---|
-i | 指定操作的文件 |
-filter_complex | 指定视频滤镜 |
delogo | 去除logo滤镜 |
show | 会暂时是否显示去除的绿色边框 |
总结
FFmpeg中的命令多用于脚本的编写以及测试用途,也可以自己做一些简单的小工具进行日常的使用.这里就不过多叙述了.下面的博客基本是围绕FFmpeg代码编写进行的,欢迎指导批评.