ffmpeg命令笔记

一: ffmpeg 目录及作用

  • libavcodec:提供了一系列编码器的实现
  • libavformat: 实现在流协议,容器格式及其IO访问
  • libavutil:包括了hash器,解码器和各种工具函数
  • libavfilter:提供了各种音视频过滤器
  • libavdevice:提供了访问捕获设备和回放设备的接口
  • libswresample:实现了混音和重采样
  • libswscale:实现了色彩转换和缩放功能

二: ffmpeg基本概念

音/视频流

在音视频领域,我们把一路音/视频成为一路流。
如我们小时候经常使用VCD看电影,在里边可以选择粤语或国语,其实就是CD视频文件中存放了两路音频流,用户可以选择其中一路进行播放。

容器

我们一般把MP4,FLV,MOV等文件格式称为容器。在这些常用格式文件中,可以存放多路音视频文件。以MP4为例,就可以存放一路视频流,多路音频流,多路字幕流。

channel

channel是音频中的概念,称之为声道。在一路音频流中,可以有单声道,双声道或立体声。

ffmpeg命令

我们按使用目的可以将ffmpeg命令分为以下几类:

  • 基本信息查询命令
  • 录制
  • 分解/复用
  • 处理原始数据
  • 滤镜
  • 切割与合并
  • 图/视 互转
  • 直播相关
    除了ffmpeg的基本信息查询命令外,其它命令都是按下图所示的流程处理音视频:
    在这里插入图片描述
    将编码的数据包传送给解码器(除非为数据流选择了流拷贝)。解码器产生未压缩的帧(原始视频/PCM音频/…),可以通过滤波进一步处理。在过滤之后,帧被传递到编码器,编码器输出编码的数据包。最后,这些传递过复用器,将编码的数据包写入输出文件。
    默认情况下,ffmpeg只包含输入文件中每种类型(视频,音频,字幕)的一个流,并将其添加到每个输出文件中。它根据以下标准挑选每一个的“最佳”:对于视频,它是具有最高分辨率的流,对于音频,它是具有最多channel的流,对于字幕,是第一个字幕流。在相同类型的几个流相等的情况下,选择具有最低索引的流。
    可以通过使用-vn / -an / -sn / -dn选项来禁用某些默认设置。要进行全面的手动控制,请使用-map选项,该选项禁用刚描述的默认设置。
基本信息查询命令

ffmpeg可以使用下面的参数进行基本信息查询。
例如:想查询一下现在使用的ffmpeg都支持哪些filter,就可以使用ffmpeg -filters来查询。
详细参数说明如下:

  • -version 显示版本
  • -formats 显示可用的格式(包括设备)
  • -demuxers 显示可用的muxers
  • -muxers 显示可用的muxers
  • -devices 显示可用的设备
  • -codecs 显示libavcodec已知的所有编解码器
  • -decoders 显示可用的解码器
  • -encoders 显示可用的编码器
  • -bsfs 显示可用的比特流
  • -protocols 显示可用的协议
  • -filters 显示可用的libavfilter过滤器
  • -pix_fmts 显示可用的像素格式
  • -sample_fmts 显示可用的采样格式
  • -layouts 显示channel名称和标准channel布局
  • -colors 显示识别的颜色名称
命令基本格式和参数

常用命令:

ffmpeg [global_options]{[input_file_options] -i input_url}...
{[output_file_options] output_url}...

ffmpeg通过-i选项读取任意数量的输入"文件"
可以是常规文件,管道,网络流,抓取设备等,并写入任意数量的输出“文件”。原则上,每个输入/输出“文件”都可以包含任意数量的不同类型的视频流(视频/音频/字幕/附件/数据)。
流的数量和类型是由容器格式来限制。选择从哪个输入进入到哪个输出将自动完成或使用-map选项。
要引用选项中的输入文件,你必须使用它们的索引(从0开始)。例如,第一个输入文件是0,第二个输入文件是1,等等。类似地,文件内的流被它们的索引引用。例如:2:3是指第三个输入文件中的第四个流。

主要参数:

  • -f fmt (输入/输出) 强制输入或输出文件格式。格式通常是自动检测输入文件,并从输出文件的文件扩展名猜测出来,所以在大多数情况下这个选项是不需要的。
  • -i url (输入) 输入文件的网址
  • -y (全局参数)覆盖输出文件而不询问
  • -n (全局参数) 不要覆盖输出文件,如果指定的输出文件已经存在,请立即退出。
  • -c [:stream_specifier] codec (输入/输出, 每个流)选择一个编码器(当在输出文件之前使用)或解码器(当在输入文件之前使用时)用于一个或多个流。codec是解码器/编码器的名称或copy(仅输出)以指示该流不被重新编码。如: ffmpeg - i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
  • -codec [:stream_specifier] 编解码器(输入/输出,每个流)同-c
  • -t duration(输入/输出) 当用作输入选项(在-i之前)时,限制从输入文件读取的数据的持续时间。当用作输出选项时(在输出url之前),在持续时间到达持续时间之后停止输出。
  • -ss 位置(输入/输出)当用作输入选项时(在-i之前),在这个输入文件中寻找位置。请注意,在大多数格式中,不可能精确搜索,因此ffmpeg将在位置之前寻找最近的搜索点。当转码和-accurate_seek被启用时(默认),搜索点和位置之间的这个额外分段将被解码和丢弃。当进行流式复制或使用-noaccurate_seek时,它将被保留。当用作输出选项(在输出url之前)时,解码当丢弃输入,直到时间戳到达位置。
  • -frames [:stream_specifier] framecount (输出,每个流) 停止在帧计数帧之后写入流。
  • filter [:stream_specifier] filtergraph (输出,每个流)创建由filtergraph指定的过滤器图,并使用它来过滤流。filtergraph是应用于流的filtergraph的描述,并且必须具有相同类型的流的单个输入和单个输出。在过滤器图形中,输入与标签中的标签相关联,标签中的输出与标签相关联。

视频参数:

  • -vframes num (输出) 设置要输出的视频的数量。对于-frames: v,这是一个过时的别名,你应该使用它。
  • -r [:stream_specifier] fps (输入/输出, 每个流) 设置帧率(Hz值,分数或缩写)。作为输入选项,忽略存储在文件中的任何时间戳,根据速率生成新的时间戳。这与用于-framerate选项不同(它在FFmpeg的旧版中使用的是相同的)。如果有疑问,请使用-framerate而不是输入选项-r。作为输出选项,复制或丢弃输入帧以实现恒定输出帧频fps。
  • -s [:stream_specifier]大小(输入/输出,每个流)设置窗口的大小。作为输入选项,这是video_size专用选项的快捷方式,由某些分帧器识别,其帧尺寸未被存储在文件中。作为输出选项,这会将缩放视频过滤器插入到相应过滤器图形的末尾。请直接使用比例过滤器将其插入到开头或其他地方。格式时wxh (默认,-与源相同)
  • -aspect [:stream_specifier] 宽高比(输出,每个流)设置方面指定的视频显示宽高比。aspect可以是浮点数字符串,也可以是num:den形式的字符串,其中num和den是宽高比的分子和分母。例如“4:3”, “16:9”,“1.3333”,和“1.7777”是有效的参数值。如果与-vcodec副本一起使用,则会影响存储在容器级别的宽高比,但不会影响存储在编码帧中的宽高比(如果存在).
  • -vn(输出)禁用视频录制
  • -vcodec编解码器(输出)设置视频的编解码器。这是-codec: v的别名
  • vf filtergraph(输出) 创建由filtergraph指定的过滤器图,并使用它来过滤流。

音频参数:

  • aframes (输出) 设置要输出的音频帧的数量。这是-frames: a的一个过时的别名。
  • -ar [:stream_specifier] freq(输入/输出,每个流)设置音频的采样频率。对于输出流,它默认设置为相应输入流的频率。对于输入流,此选项仅适用于音频捕获设备和原始分路器,并映射到相应的分路器选件。
  • -ac [:stream_specifier]通道(输入/输出,每个流)设置音频通道的数量。对于输出流,它默认设置为输入音频通道的数量。对于输入流,此选项仅适用于音频捕获设备和原始分路器,并映射到相应的分路器选件。
  • -an(输出) 禁用录音。
  • -acodec编解码器(输入/输出)设置音频编解码器。这是-codec的别名: a.
  • -sample_fmt [:stream_specifier] sample_fmt(输出,每个流)设置音频采样格式。使用-sample_fmts获取支持的样本格式列表。
  • -af filtergraph (输出) 创建由filtergraph指定的过滤器图,并使用它来过滤流。

录制:
首先通过下面的命令查看mac上有哪些设备
ffmpeg -f avfoundation -list_devices true -i ""
在这里插入图片描述

录屏:
ffmpeg -f avfoundation -i 1 -r 30 out.yuv
-f: 指定使用avfoundation采集数据
-i:指定从哪儿采集数据,它是一个文件索引号。根据上面图片可知,在我的mac上,1代表桌面。
-r:指定帧率。按ffmpeg官方文档说-r-framerate作用相同,但实际测试时发现不同。-framerate用于限制输入,而-r用于限制输出。
注意:桌面的输入对帧率没有要求,所以不用限制桌面的帧率。其实限制了也没用。

录屏+声音:
ffmpeg -f avfoundation -i 1:0 -r 29.97 -c:v libx264 -crf 0 -c:a libfdk_aac -profile:a aac_he_v2 -b:a 32k out.flv
-i 1:0 “1”代表的是屏幕索引号。“0”代表的声音索引号
-c:v 与参数-vcodec一样,表示视频编码器。c是codec的缩写,v是video的缩写。
-crf 是x264的参数。0表示无损压缩。
-c:a与参数-acodec一样,表示音频编码器。
-profile是fdk_aac的参数。aac_he_v2表示使用AAC_HE v2压缩数据。
-b:a 指定音频码率。b是bitrate的缩写,a是audio的缩写。

录视频:
ffmpeg -framerate 30 -f avfoundation -i 0 out.mp4
-framerate限制视频的采集帧率。这个必须要根据提示要求进行设置,如果不设置就会报错。
-f 指定使用avfoundation采集数据
-i 指定视频设备的索引号

视频+音频:
ffmpeg -framerate 30 -f avfoundation -i 0:0 out.mp4

录音:
ffmpeg -f avfoundation -i :0 out.wav

录制音频裸数据:
ffmpeg -f avfoundation -i :0 -ar 44100 -f s16le out.pcm

分解与复用:
流拷贝是通过将copy参数提供给-codec选项来选择流的模式。它使得ffmpeg省略了指定流的解码和编码步骤,所以它只能进行多路分解和多路复用。这对于更改容器格式或修改容器级元数据很有用。在这种情况下,上图将简化为:
在这里插入图片描述
由于没有解码或编码,速度非常快,没有质量损失。但是,由于许多因素,在某些情况下可能无法正常工作。应用过滤器显然也是不可能的,因为过滤器处理未压缩的数据。

抽取音频流:
ffmpeg -i input.mp4 -acodec copy -vn out.aac
acodec: 指定音频编码器,copy指明只拷贝,不做编解码。
vn: v代表视频,n代表no,也就是无视频的意思。

抽取视频流:
ffmpeg -i input.mp4 -vcodec copy -an out.h264
vcodec: 指定视频编码器,copy指明只拷贝,不做编解码。
an:a代表视频,n代表no,也就是无音频的意思。

转格式:
ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv
上面的命令表示的是音频,视频都直接copy,只是将mp4的封装格式转成了flv。

音视频合并:
ffmpeg -i out.h264 -i out.aac -vcodec copy -acodec copy out.mp4
处理原始数据

提取YUV数据:
ffmpeg -i input.mp4 -an -c:v rawvideo -pixel_format yuv420p out.yuv
ffplay -s wxh out.yuv
-c:v rawvideo:指定将视频转成原始数据
-pixel_format yuv420p:指定转换格式为yuv420p

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神小夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值