FFmpeg使用小记

介绍

ffmpeg是一款非常快速的视频和音频转换器工具,它也能够从视频/音频源抓取。它也可以通过高质量多相滤波器转换任意频率视频,调整视频大小。一些开源视频编辑软件,如Kdenlive内置ffmpeg转码工具。

主要使用参数

  • -c[:stream_specifier] codec (input/output,per-stream)
    为一个或多个流选择编码器(在输出文件之前使用)或解码器(在输入文件之前使用)。codec是解码器/编码器或特殊值copy(仅输出)的名称,用于指示流不需要重新编码。例如:ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT,采用libx264编码所有视频流,并复制所有音频流(v–video,a–audio);ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT,除了第二个视频(将用libx264编码)和第138个音频(将用libvorbis编码)之外,其它的流会直接复制并输出。
  • -y
    无需询问就覆盖输出文件。
  • -t duration
    当用作输入选项(在-i之前)时,限制从输入文件读取数据的时间;当作为输出选项使用时(在输出url之前),在输出持续时间达到持续时间之后停止写入输出。
  • -ss position
    当用作输出选项时(在输出url之前),解码但丢弃输入,直到时间戳到达位置。
  • -vframes number
    设置输出的视频帧数。这是-frames:v的一个过时别名,您应该使用它。
  • -r[:stream_specifier] fps
    设置帧速率(Hz值、分数或缩写)
  • -s[:stream_specifier] size
    设置帧大小,作为一个输入选项,这是video_size私有选项的一个快捷方式,被一些解码器识别,这些解码器的帧大小不是存储在文件中,就是可配置的——例如原始视频或视频抓取器。

使用方式

ffmpeg通过i选项读取任意数量的输入文件(可以是常规文件,片段,网络流,抓取设备,等等)。

  • 设置输出比特率为64 kbit/s的视频
    ffmpeg -i input.mp4 -b:v 64k -bufsize 64 output.mp4
  • 强制输出帧率为24 fps的视频
    ffmpeg -i input.mp4 -r 24 output.mp4
  • 强制输入文件帧数为1 fps(仅对原格式有效),输出文件帧数为24 fps
    ffmpeg -r 1 -i input.m2v -r 24 output.mp4
  • 自动流选择
    ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov
    这里指定了三个输出文件,前两个没用-map选项,因此ffmpeg将自动选择这两个文件的流。out1.mkv是一个接受视频,音频和字幕流的Matroska容器文件,因此ffmpeg将选择每种类型中的一种。
    • 对于视频,选择B.mp4的视频流,它拥有所有输入视频中的最高分辨率。
    • 对于音频,选择B.mp4的音频流,因为它有最大数量的通道
    • 对于字幕,选择B.mp4的字幕,因为它是所有输入视频中的第一个字幕
      out2.wav仅仅接受音频流,因此它选择B.mp4中的音频流。对于out3.mov,因为设定了-map选项,所以不会自动选择流。-map 1:a表示它只会选择来自第二个输入文件B.mp4的所有音频流。
      对于第三个输出,音频流的codec选项会通过copy设置,因此不会发生解码-过滤-编码操作。所选流包应从输入文件中传送,并在输出文件中进行复合。
  • 自动字幕选择
    ffmpeg -i C.mkv out1.mkv -c:s dvdsuub -an out2.mkv
    输出out1.mkv文件接收字幕流,但是仅仅选择视频和音频流。输入文件C.mkv的字幕流是基于图片的,而ffmpeg默认选择的是基于文本的,因此字幕选择会失败。然而out2.mkv指定了字幕编码器(-c:s dvdsuub-DVD字幕解析),因此会被选中。-an选项会关闭out2.mkv的音频输出。

实战

  • 下载m3u8流媒体
    • 不带key
      ffmpeg -i http://www.xxx.com/xxx.m3u8 -c copy out.mp4
    • 带key
      以文本方式打开.m3u8文件,会看到URL后面有个http://XXX.key 原地址,将此复制下来,改为.m3u8后缀,再使用上面的命令即可。倘若已经下载好了ts片段文件,想要本地合并为一个文件,可以通过下面命令:ffmpeg -allowed_extensions ALL -protocol_whitelist "file,http,crypto,tcp" -i index.m3u8 -c copy out.mp4
  • 制作gif动图
    • ffmpeg -i inmpt.mp4 output.gif
      整个视频作为动图,此时得到的gif文件特别大。
    • ffmpeg -i input.mp4 -s 200*300 -r 15 output.gif
      改变输出gif的辨率为200*300,设置帧数为15。
    • ffmpeg -ss 00:00:05 -t 30 -i input.mp4 -vf scale=100:50 -r 15 output.gif
      截取输入视频从第5 s开始,直到30 s后的片段,指定100:50的宽和高。
  • 视频调整输出
    • ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4
      加倍速播放视频
    • ffmpeg -i input.mp4 -filter:v "setpts=2.0*PTS" output.mp4
      慢倍速播放视频
    • ffmpeg -i input.mp4 -an output.mp4
      输出静音视频
    • ffmpeg -ss 00:00:05 -t 1 -i input.mp4 -r 10 -q:v 2 %03d.jpg
      提取输入视频的第5 s到第6 s片段,每秒提取图片的帧数为10,-q:v 2设置输出图片质量,例如10帧/s的视频,你可以提取出10张图片。
    • ffmpeg -r 15 -i untitled.%05d.bmp movie.gif
      合并一系列图片为gif动图。例如通过vmd导出的一系列静态图untitled.00000.bmp,...,untitled.00201.bmp,可以通过上面的命令合并成完整的gif动图。%05d表示左边补0的等宽格式,有5位数,-r 15指定帧数为15。