iOS技术交流收藏iOS开发

FFmpeg:浅谈命令集合

2019-11-08  本文已影响0人  神经骚栋

前言


在上一篇博客中我们搭建了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代码编写进行的,欢迎指导批评.

上一篇下一篇

猜你喜欢

热点阅读