FFmpeg命令分类
- 基本信息查询命令
- 录制命令
- 分解、复用命令
- 处理原始数据命令
- 各种滤镜命令
- 裁剪与合并命令
- 图片、视频互转命令
- 直播相关命令
FFmpeg处理音视频流程
- 编码的数据包传送给解码器(除非为数据流选择了流拷贝)
- 解码器产生未压缩的帧(原始视频/ PCM音频/ ...),可以通过滤波进一步处理
- 在过滤之后,帧被传递到编码器,编码器并输出编码的数据包
- 最后,这些传递给复用器,将编码的数据包写入输出文件
FFmpeg可以使用下面的参数进行基本信息查询
-version 显示版本
-formats 显示可用的格式(包括设备)
-demuxers 显示可用的demuxers
-muxers 显示可用的muxers
-devices 显示可用的设备
-codecs 显示libavcodec已知的所有编解码器
-decoders 显示可用的解码器
-encoders 显示所有可用的编码器
-bsfs 显示可用的比特流filter
-protocols 显示可用的协议
-filters 显示可用的libavfilter过滤器
-pix_fmts 显示可用的像素格式
-sample_fmts 显示可用的采样格式
-layouts 显示channel名称和标准channel布局
-colors 显示识别的颜色名称
FFmpeg 的基本命令格式
ffmpeg [global_options] {[input_file_options] -i input_url} ...
{[output_file_options] output_url} ...
- ffmpeg 通过 -i 选项读取输任意数量的输入“文件”
- 可以是常规文件,管道,网络流,抓取设备等,并写入任意数量的输出“文件”。
- 原则上,每个输入/输出“文件”都可以包含任意数量的不同类型的视频流(视频/音频/字幕/附件/数据)。
- 流的数量和/或类型是由容器格式来限制。
- 选择从哪个输入进入到哪个输出将自动完成或使用 -map 选项。
- 要引用选项中的输入文件,您必须使用它们的索引(从0开始)。
- 例如:第一个输入文件是0,第二个输入文件是1,等等。
- 类似地,文件内的流被它们的索引引用。
主要参数:
-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(output,per-stream)
停止在帧计数帧之后写入流。
-filter [:stream_specifier] filtergraph(output,per-stream)
创建由filtergraph指定的过滤器图,并使用它来过滤流。
filtergraph是应用于流的filtergraph的描述,并且必须具有相同类型的流的单个输入和单个输出。
在过滤器图形中,输入与标签中的标签相关联,标签中的输出与标签相关联。
有关filtergraph语法的更多信息,请参阅ffmpeg-filters手册。
视频参数:
-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指定的过滤器图,并使用它来过滤流。
FFmpeg实例
1、列出ffmpeg支持的所有格式
ffmpeg -formats
2、剪切一段媒体文件, 可以是音频或者视频文件
ffmpeg -i input.mp4 -ss 00:00:50.0 -codec copy -t 20 output.mp4
- 表示将文件input.mp4从第50s开始剪切20s的时间,
- 输出到文件output.mp4中,
- 其中 -ss指定偏移时间( time Offset) ,
- -t指定的时长( duration)
3、如果在手机中录制了一个时间比较长的视频无法分享到微信中,那么可以使用ffmpeg将该视频文件切割为多个文件
ffmpeg -i input.mp4 -t 00:00:50 -c copy small-1.mp4 -ss 00:00:50 -codec copy small-2.mp4
4、使一个视频中的音频静音, 即只保留视频
ffmpeg -i input.mp4 -an -vcodec copy output.mp4
5、从MP4文件中抽取视频流导出为裸H264数据
ffmpeg -i output.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb output.h264
- 视频数据使用mp4toannexb这个bitstream filter来转换为原始的H264数据,
6、使用AAC音频数据和H264的视频生成MP4文件
ffmpeg -i test.aac -i test.h264 -acodec copy -bsf:a aac_adtstoasc -vcodec copy -f mp4 output.mp4
7、对音频文件的编码格式做转换
ffmpeg -i input.wav -acodec libfdk_aac output.aac
8、从WAV音频文件中导出PCM裸数据
ffmpeg -i input.wav -acodec pcm_s16le -f s16le output.pcm
- 这样就可以导出用16个bit来表示一个sample的PCM数据了,
- 并且每个sample的字节排列顺序都是小尾端表示的格式,
- 声道数和采样率使用的都是原始WAV文件的声道数和采样率的PCM数据。
9、重新编码视频文件, 复制音频流, 同时封装到MP4格式的文件中
ffmpeg -i input.flv -vcodec libx264 -acodec copy output.mp4
10、将一个MP4格式的视频转换成为gif格式的动图
ffmpeg -i input.mp4 -vf scale=100:-1 -t 5 -r 10 image.gif
- 上述代码按照分辨比例不动宽度改为100( 使用VideoFilter的scaleFilter) ,
- 帧率改为10(-r),只处理前5秒钟(-t)的视频,生成gif
11、将一个视频的画面部分生成图片
- 比如要分析一个视频里面的每一帧都是什么内容的时候, 可能就需要用到这个命令了
ffmpeg -i output.mp4 -r 0.25 frames_%04d.png
12、使用一组图片可以组成一个gif
- 如果你连拍了一组照片, 就可以用下面这行命令生成一个gif
ffmpeg -i frames_%04d.png -r 5 output.gif
13、使用音量效果器,可以改变一个音频媒体文件中的音量
ffmpeg -i input.wav -af ‘volume=0.5’ output.wav
- 上述命令是将input.wav中的声音减小一半, 输出到output.wav文件中,
- 可以直接播放来听, 或者放到一些音频编辑软件中直接观看波形幅度的效果
14、淡入效果器的使用
ffmpeg -i input.wav -filter_complex afade=t=in:ss=0:d=5 output.wav
- 上述命令可以将input.wav文件中的前5s做一个淡入效果, 输出到output.wav中,
- 可以将处理之前和处理之后的文件拖到Audacity音频编辑软件中查看波形图
15、淡出效果器的使用
ffmpeg -i input.wav -filter_complex afade=t=out:st=200:d=5 output.wav
- 上述命令可以将input.wav文件从200s开始, 做5s的淡出效果, 并放到output.wav文件中
16、将两路声音进行合并, 比如要给一段声音加上背景音乐
ffmpeg -i vocal.wav -i accompany.wav -filter_complex amix=inputs=2:duration=shortest output.wav
- 上述命令是将vocal.wav和accompany.wav两个文件进行mix,
- 按照时间长度较短的音频文件的时间长度作为最终输出的output.wav的时间长度。
16、对声音进行变速但不变调效果器的使用
ffmpeg -i vocal.wav -filter_complex atempo=0.5 output.wav
- 上述命令是将vocal.wav按照0.5倍的速度进行处理生成output.wav,
- 时间长度将会变为输入的2倍。 但是音高是不变的, 这就是大家常说的变速不变调
17、为视频增加水印效果
ffmpeg -i input.mp4 -i changba_icon.png -filter_complex
'[0:v][1:v]overlay=main_w-overlay_w-10:10:1[out]' -map '[out]' output.mp4
- 上述命令包含了几个内置参数,
- main_w代表主视频宽度,
- overlay_w代表水印宽度,
- main_h代表主视频高度,
- overlay_h代表水印高度
18、视频提亮效果器的使用
ffmpeg -i input.flv -c:v libx264 -b:v 800k -c:a libfdk_aac -vf eq=brightness=0.25
-f mp4 output.mp4
- 提亮参数是brightness,取值范围是从-1.0到1.0,默认值是0
19、为视频增加对比度效果
ffmpeg -i input.flv -c:v libx264 -b:v 800k -c:a libfdk_aac -vf eq=contrast=1.5 -f mp4 output.mp4
- 对比度参数是contrast, 取值范围是从-2.0到2.0, 默认值是1.0
20、视频旋转效果器的使用
ffmpeg -i input.mp4 -vf "transpose=1" -b:v 600k output.mp4
21、视频裁剪效果器的使用
ffmpeg -i input.mp4 -an -vf "crop=240:480:120:0" -vcodec libx264 -b:v 600k output.mp4
22、将一张RGBA格式表示的数据转换为JPEG格式的图片
ffmpeg -f rawvideo -pix_fmt rgba -s 480*480 -i texture.rgb
-f image2 -vcodec mjpeg output.jpg
23、将一个YUV格式表示的数据转换为JPEG格式的图片
ffmpeg -f rawvideo -pix_fmt yuv420p -s 480*480 -i texture.yuv
-f image2 -vcodec mjpeg output.jpg
24、将一段视频推送到流媒体服务器上
ffmpeg -re -i input.mp4 -acodec copy -vcodec copy -f flv rtmp://xxx
- 上述代码中, rtmp: //xxx代表流媒体服务器的地址,
- 加上-re参数代表将实际媒体文件的播放速度作为推流速度进行推送
25、将流媒体服务器上的流dump到本地
ffmpeg -i http://xxx/xxx.flv -acodec copy -vcodec copy -f flv output.flv
26、将两个音频文件以两路流的形式封装到一个文件中,
- 比如在K歌的应用场景中, 原伴唱实时切换的场景下,
- 可以使用一个文件包含两路流, 一路是伴奏流, 另外一路是原唱流
ffmpeg -i 131.mp3 -i 134.mp3 -map 0:a -c:a:0 libfdk_aac -b:a:0 96k -map 1:a -c:a:1
libfdk_aac -b:a:1 64k -vn -f mp4 output.m4a