FFmpeg 是一个完整的跨平台解决方案,用于录制、转换和流式传输音频和视频。这是我的 FFmpeg 学习笔记。使用 ffmpeg 作为视频编辑器和转换器。更改 fps 并将
.mp4
文件转换为.gif
和其他格式。
概述#
FFmpeg 是 “快速转发动态图像专家组” 的缩写。它是一个庞大的项目,提供以下 3 个命令行工具:
fmpeg
:视频和音频转换器。ffplay
:媒体播放器。ffprobe
:从多媒体流中收集信息。
本笔记主要回顾一些最有用的 FFmpeg
用法。ffplay
和 ffprobe
的文档可以在互联网上找到,方便查阅。
安装#
Windows#
进入 FFmpeg 的官方网站,选择 CODEX FFMPEG @ gyan.dev,找到 “发布构建” 部分,下载 ffmpeg-release-full.7z
文件,然后在本地解压缩压缩包,最后将 ffmpeg
添加到系统路径中,然后在你的 powershell
中输入并获取如下日志:
$ ffmpeg -version
ffmpeg version 5.0-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 11.2.0 (Rev5, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
libavutil 57. 17.100 / 57. 17.100
libavcodec 59. 18.100 / 59. 18.100
libavformat 59. 16.100 / 59. 16.100
libavdevice 59. 4.100 / 59. 4.100
libavfilter 8. 24.100 / 8. 24.100
libswscale 6. 4.100 / 6. 4.100
libswresample 4. 3.100 / 4. 3.100
libpostproc 56. 3.100 / 56. 3.100
这意味着你已经完全安装了 FFmpeg
。
如果之前有 FFmpeg
的旧版本,我们需要将其删除。
Ubuntu#
在 Ubuntu 上安装 FFmpeg
比在 Windows 上简单得多,只需使用 apt
进行安装:
sudo apt install ffmpeg
用法#
使用简单的命令,使用 ffmpeg
编辑视频非常方便。
信息#
我们可以使用以下命令打印视频的基本信息:
ffmpeg -i <input file>
如果你想隐藏冗余1 信息,可以添加 -hide_banner
:
ffmpeg -i <input file> -hide_banner
转码#
转码是指将视频文件从一种编码转换为另一种编码,例如从 H.264
编码转换为 H.265
,通常我们使用编码器 libx265
,命令如下:
ffmpeg -i <input file> -c:v libx265 <output file>
如果你想从 H.265 反转到 H.264,只需将编码器更改为 libx264
。
转封装#
转封装是指将视频文件从一个容器转移到另一个容器。请注意,转移容器不会更改编码,因此速度非常快。以下是从 .mp4
到 .webm
的示例:
ffmpeg -i <input file>.mp4 -c copy <output file>.webm
在上述命令中,-c copy
意味着直接复制,而不进行转码。
转码率#
转码率是指调整比特率,通常用于减小文件大小。我们可以设置最大速率、最小速率和缓冲区,例如 3856K 为最大速率,964K 为最小速率,2000K 为缓冲区大小。命令如下:
ffmpeg -i <input file> -minrate <minimum rate> -maxrate <maximum rate> -bufsize <buffer> <output file>
转尺寸#
如果视频是高清文件,并且我们想将其缩小以减小大小,则可以使用缩放控制命令。
ffmpeg -i <input file> -vf scale=<width>:<height>:flags=lanczos <output file>
lanczos
是缩放算法,如果我们想将输出文件的宽度设置为源视频宽度的一半,并且高度按比例缩放4,我们将这样设置缩放:
ffmpeg -i <input file> -vf scale=iw/2:-1 :flags=lanczos <output file>
iw
意味着视频宽度,显然 ih
意味着视频高度,-1
意味着按比例缩放。我们还可以设置宽度和高度的像素。如果我们想获得 480p 视频,只需将宽度设置为 480。
ffmpeg -i <input file> -vf scale=480:-1 <output file>
解封装#
解封装是指从视频中提取音频。命令如下:
ffmpeg -i <input file>.mp4 -vn -c:a copy <output file>.aac
在上述命令中,-vn
意味着去除视频,-c:a copy
表示音频编码不变,直接复制。
封装#
封装是指将外部音频添加到视频中,例如添加背景音乐或旁白5。
ffmpeg -i <input file>.aac -i <input file>.mp4 <output file>.mp4
有 2 个输入文件,一个音频和一个视频,FFmpeg
将它们合并为一个。
截图#
截图需要开始时间和结束时间,这意味着从开始时间开始,连续获取截图直到结束时间。
ffmpeg -y -i <input file> -ss <start time> -t <last time> <output file>_%3d.png
如果你只需要一帧截图,也可以:
ffmpeg -ss <cut time> -i <input file> -vframes 1 -q:v 2 <output>.png
在上述命令中,-vframes 1
指定只捕获一帧,-q:v 2
表示输出图像质量,通常在 1
和 5
之间(1
是最高质量)。
剪切#
通常我们只需要视频的一部分,因此我们可以通过开始时间和结束时间或结束时间来剪切它:
ffmpeg -ss <start time> -i <input file> -t <last time> -c copy <output file>
ffmpeg -ss <start time> -i <input file> -to <end time> -c copy <output file>
时间单位是秒,我们还可以使用格式如 00:00:00.000
,表示 小时:分钟:秒.点
。-c copy
意味着不更改音频和视频的编码格式,直接复制,这将更快。
循环#
如果我们转换为 .gif
文件或其他动画图片,可以设置循环次数,基本上 1
为一次,0
为无限。
ffmpeg -i <input file> -loop <loop times> <output file>
调整#
FFmpeg 允许你调整视频播放速度。要加快视频播放速度,只需运行:
ffmpeg -i <input file> -vf "setpts=0.5*PTS" <output file>
此命令将使视频速度加倍。要减慢视频速度,你需要使用大于 1
的参数,例如:
ffmpeg -i <input file> -vf "setpts=4.0*PTS" <output file>
压缩#
GIF#
将视频如 .mp4
文件直接转换为 .gif
动画,只需使用以下命令:
ffmpeg -i <input>.mp4 <output>.gif
默认转换为中等质量模式,要转换为高质量 gif,可以修改比特率:
ffmpeg -i <input>.mp4 -b 2048k <output>.gif
ffmpeg -i <input>.mp4 -lossless 1 <output>.gi
我们还可以将 gif
文件转换为其他格式:
ffmpeg -f gif -i <input>.gif <output file
WEBP#
以下命令行可以将名为 <input.mp4>
的文件转换为无损、循环播放的文件,命名为 <output.webp>
,大小为 800:600
,并使用默认呈现。
ffmpeg -i <input>.mp4 -vcodec libwebp -filter:v fps=fps=20 -lossless 1 -loop 0 -preset default -an -vsync 0 -s 800:600 <output>.webp
如果你希望导出的 output.webp 动画只播放一次,它是有损的,压缩级别为 3(0-6,默认是 4,越高效果越好),质量为 70(0-100,默认是 75,越高效果越好),渲染6 为一张图片。
ffmpeg -i <input>.mp4 -vcodec libwebp -filter:v fps=fps=20 -lossless 0 -compression_level 3 -q:v 70 -loop 1 -preset picture -an -vsync 0 -s 800:600 <output>.webp