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参数:
- 逆时针旋转90度并垂直翻转
- 顺时针旋转90度
- 逆时针旋转90度
- 顺时针旋转90度并垂直翻转
- transpose参数:
- 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的负担,提高整体的性能。但是硬件码在不同的平台上支持的程度不一样,所得到的效果也不一样,所以需要根据自己的实际情况来选择。