ffmpeg使用指南

我最早接触ffmpeg的时候,还是想要把一个m3u8的视频地址下载下来,当时我看到m3u8里面是一堆ts文件列表,还想着自己写个脚本来下载,后来发现ffmpeg可以直接下载整个m3u8的视频,而且还可以合并成一个mp4文件。这个时候我才知道ffmpeg的强大之处。

我当时真的是很好奇,为啥ffmpeg连网络流都能支持呢?后来我发现,原来ffmpeg是一个开源的跨平台的音视频处理工具,它可以用来录制、转换视频和音频,还可以进行流媒体的处理。ffmpeg是一个非常强大的工具,它支持几乎所有的音视频格式,而且还可以进行音视频的编解码、转码、封装、解封装等操作。

安装

macOS

brew install ffmpeg

Ubuntu

sudo apt-get install ffmpeg

Windows

下载地址

使用

ffmpeg虽然是一个命令行,但是api设计的非常简单易懂。举个例子,我需要把一个avi文件转换成mp4文件,只需要这样:

ffmpeg -i input.avi output.mp4

这里面只需要记住一个参数-i,就是输入文件,后面的output.mp4就是输出文件。如果想要知道更多的参数,可以通过ffmpeg -h来查看。

再举一个例子,把mp4转换成mp3文件

ffmpeg -i input.mp4 output.mp3

非常简单明了,ffmpeg自己根据输入文件的格式来选择合适的编解码器,然后进行转换。

我不是很建议使用一些封装的GUI客户端来操作,客户端有个明显的缺点就是不够灵活,而且很多时候还不如命令行来的直接,享受简便的同时就意味着放弃了一些自定义的操作,显卡既然都买了,总不能让它天天摸鱼吧。

常用的操作

分辨率调整

ffmpeg -i input.mp4 -vf "scale=1280:720" output.mp4

更改分辨率: 调整视频的分辨率为720p。

视频转码

ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4

解释一下:

  • ffmpeg: 这是调用 FFmpeg 程序的命令,一个强大且广泛使用的跨平台的视频和音频处理工具。
  • -i input.mp4: -i 选项后跟着的是输入文件的名称,这里是 input.mp4。这告诉 FFmpeg 你想要处理的视频文件是哪个。
  • -c:v libx264: 这一部分指定了视频编码器。-c:v 是 codec:video 的缩写,表示要使用的视频编码器,这里是 libx264,它是一个非常流行的开源编码器,用于编码 H.264/MPEG-4 AVC 视频流。H.264 是一种广泛使用的高压缩率视频编码标准,能够在保持良好视频质量的同时提供较小的文件大小。
  • -c:a aac: 这一部分指定了音频编码器。-c:a 是 codec:audio 的缩写,表示要使用的音频编码器,这里是 aac,它是一种常用的音频编码标准,能够提供良好的音质和压缩率。
  • output.mp4: 这是转码后的输出文件名。

如果只是需要转换视频格式,可以使用-c copy来进行快速转换,不需要重新编码。

视频剪切

ffmpeg -i input.mp4 -ss 00:00:10 -t 00:00:05 -c copy output.mp4

解释一下:

  • -ss 00:00:10: 这是指定了剪切的开始时间,这里是从视频的第 10 秒开始。
  • -t 00:00:05: 这是指定了剪切的时长,这里是 5 秒。
  • -c copy: 这是指定了使用 copy 模式,这样就不需要重新编码,可以快速剪切。
  • output.mp4: 这是剪切后的输出文件名。

视频合并

ffmpeg -i input1.mp4 -i input2.mp4 -c copy output.mp4

解释一下:

  • -i input1.mp4 -i input2.mp4: 这是指定了要合并的两个视频文件。
  • -c copy: 这是指定了使用 copy 模式,这样就不需要重新编码,可以快速合并。
  • output.mp4: 这是合并后的输出文件名。

视频截图

ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 output.jpg

解释一下:

  • -ss 00:00:10: 这是指定了截图的时间,这里是从视频的第 10 秒开始。
  • -vframes 1: 这是指定了截图的帧数,这里是 1 帧。

高级进阶技巧

多线程处理

ffmpeg -i input.mp4 -c:v libx264 -c:a aac -threads 0 output.mp4

如果你设置 -threads 为 0,FFmpeg 将自动选择最优的线程数,通常是根据你的 CPU 核心数来决定。同时,你也可以手动指定线程数,比如 -threads 4。

视频加速和慢放

ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4
ffmpeg -i input.mp4 -filter:v "setpts=2.0*PTS" output.mp4

解释一下:

  • -filter:v “setpts=0.5*PTS”: 这是指定了视频加速的滤镜,这里是将视频加速 2 倍。
  • -filter:v “setpts=2.0*PTS”: 这是指定了视频慢放的滤镜,这里是将视频慢放 2 倍。

视频旋转

ffmpeg -i input.mp4 -vf "transpose=1" output.mp4

解释一下:

  • -vf “transpose=1”: 这是指定了视频旋转的滤镜,这里是将视频顺时针旋转 90 度。
    • transpose参数:
      1. 逆时针旋转90度并垂直翻转
      2. 顺时针旋转90度
      3. 逆时针旋转90度
      4. 顺时针旋转90度并垂直翻转
  • output.mp4: 这是旋转后的输出文件名。

视频水印

将图片watermark.png作为水印添加到视频的右上角:

ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=W-w-10:H-h-10" output.mp4

这里W和H分别代表视频的宽度和高度,w和h代表水印的宽度和高度。-10:-10将水印向左和向上移动了10个像素,以便留出一些边距。

视频字幕

ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt" output.mp4

解释一下:

  • -vf “subtitles=subtitle.srt”: 这是指定了视频字幕的文件名。
  • output.mp4: 这是加字幕后的输出文件名。

使用GPU硬件加速

  • macOS上可以使用-hwaccel来使用硬件加速,比如使用-hwaccel videotoolbox来使用videotoolbox硬件加速。
  • Windows上可以使用-hwaccel来使用硬件加速,比如使用-hwaccel cuda来使用NVIDIA的硬件加速。
  • Linux上可以使用-hwaccel来使用硬件加速,比如使用-hwaccel vaapi来使用vaapi硬件加速。

总结

关于软解码和硬解码的区别:

  • 硬解码的缺点在于对硬件的要求高,需要支持硬解码的GPU,而且需要安装相应的驱动程序。
  • 软解码的缺点在于解码速度慢,解码效率低,对CPU的要求高。

如果能够使用硬解码,那么就可以大大提高解码速度,得益于是硬件芯片的加速,而且还能够减少CPU的负担,提高整体的性能。但是硬件码在不同的平台上支持的程度不一样,所得到的效果也不一样,所以需要根据自己的实际情况来选择。