精选文章 FFmpeg:浅谈命令集合

FFmpeg:浅谈命令集合

作者:神经骚栋 时间: 2019-11-08 10:59:05
神经骚栋 2019-11-08 10:59:05
FFmpeg:浅谈命令集合1


前言


在上一篇博客中我们搭建了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的所能使用的设备的时候.

FFmpeg:浅谈命令集合2
[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.

上面两个参数具体指可以参考录制过程中的打印值.

FFmpeg:浅谈命令集合3

对于音频和常见的音视频,我们可以不加任何的参数直接进行播放,如下所示.

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:浅谈命令集合4

例如我们想把一个视频格式进行转换,其实就是一个分解与复用的过程.那么我们就可以如下命令进行操作.

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:浅谈命令集合5

接着我们使用我们的合并命令就行了.命令如下所示.

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代码编写进行的,欢迎指导批评.


勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:夜光带你走进C# 游戏开发等(三十五)擅长的领域

下一篇:质量属性定义与风险点敏感点权衡点

您可能感兴趣

  • bilibili视频爬取与水印去除

    需求 采集特定用户下面的视频 分析 首先是获取到用户视频的列表 然后进行翻页 获取所有视频的ID 进行视频的下载 实践 通过观察发现用户的下面的视频列表来自特定的API 翻页也是修改pn=的参数即可 通过API拿到的数据的格式类似 {"code":0,"message":"0","ttl":1,"data":{"list":{"tlist":{"1":{"tid":1,"count":1,"...

  • 献给那些浮躁的年轻人

    本文转载自https://blog.csdn.net/gneveek/article/details/8690657 年龄,那是一种对时间的焦虑。张爱玲一句“出名要趁早”,害了不知多少人。人是靠价值相互认同的,而不是年龄;一个人要知道自己想要什么,才能做成事情。别着急,你还年轻,喜欢的事情大可以努力去做,没有钱途也没关系。毕竟,你还年轻啊! 【1】上周在南京出差,深夜拖着疲惫去跟朋友见面,畅...

  • 3万字通俗易懂告诉你什么是.NET?什么是.NET Framework?什么是.NET Core?

    通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core? 什么是.NET?什么是.NET Framework?本文将从上往下,循序渐进的介绍一系列相关.NET的概念,先从类型系统开始讲起,我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念,这主要包括:CLS、CTS(CLI)、FCL、Windows下CLR的相关核心组成、Windows下托管程序运行...

  • 八卦、阶层、人性、职场、创业

    点击上方蓝字关注「中产之路」 树大招风,最近看到多个群里在吃阿里的瓜。 其一 P10、P9、P8多角非正常关系,有好事者画出了关系图。 我是实在看不懂啊,微博搜了一下,以下据说是满分答案。 P10男性出轨P8-B女性,招聘了P9男性,然而P8-B对P10无感爱上了P9男性,P9男性早期就跟P8-A女性搞上并让P8-A女性怀孕了属二婚;P8-A女性前夫P8男性离职阿里去了有赞出轨了有赞运营。 ...

  • Visual FoxPro已经过时了吗 ?我也经常问自己!

    恕我直言,这样的问题我真的听腻了。这个问题我听了好几年了。从谣言出现到今天Visual FoxPro的版本已经生了两次变化,就是Visual FoxPro 6.0 与2001年春天推出的Visual FoxPro 7.0。根据微软的官方消息,Visual FoxPro 8(可能是这个名称吧)已经在研发之中了。我不敢保证是否会有Visual FoxPro 9.0(这就像我不敢保证微软是否在那时...

  • 10分钟看懂Docker和k8s

    2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司。 这家公司主要提供基于PaaS的云计算技术服务。具体来说,是和LXC有关的容器技术。 LXC,就是Linux容器虚拟技术(Linux container) 后来,dotCloud公司将自己的容器技术进行了简化和标准化,并命名为——Docker。 Docker技术诞生之后,并没有引起行业的关注。而dotClo...

  • Android开发工程师常见面试题整理

    主要分为以下几部分: (1)java面试题 (2)Android面试题 (3)高端技术面试题 (4)非技术性问题&HR问题汇总 1. java面试题 熟练掌握java是很关键的,大公司不仅仅要求你会使用几个api,更多的是要你熟悉源码实现原理,甚至要你知道有哪些不足,怎么改进,还有一些java有关的一些算法,设计模式等等。 (一) java基础面试知识点 java中==和equals和has...

  • Bigo的Java面试,我挂在了第三轮技术面上.........

    本文是鄙人薛某的投稿(博客主页:https://www.cnblogs.com/yeya/)。虽然面试最后挂了,但是老哥本身还是挺优秀的,而且通过这次面试学到了很多东西,我想这就足够了!加油!不要畏惧面试失败,好好修炼自己,多准备一下,后面一定会找到让自己满意的工作。相信老哥总结的这篇文章对大部分人都会有一点帮助! 下面问题的很多答案在笔主开源的 https://github.com/gzc...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。