FFmpeg命令详解

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,等等。
  • 类似地,文件内的流被它们的索引引用。
    • 例如: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(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
  • 上述代码中, http://xxx/xxx.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
posted @ 2020-05-09 15:12  瞎搞的富哥  阅读(1739)  评论(0编辑  收藏  举报