banner
Sereinme

Sereinme

无聊中的夏日闲话
github
zhihu
email
jike
steam_profiles

📽️FFmpeg

ffmepg

FFmpeg 是一个完整的跨平台解决方案,用于录制、转换和流式传输音频和视频。这是我的 FFmpeg 学习笔记。使用 ffmpeg 作为视频编辑器和转换器。更改 fps 并将 .mp4 文件转换为 .gif 和其他格式。

概述#

FFmpeg 是 “快速转发动态图像专家组” 的缩写。它是一个庞大的项目,提供以下 3 个命令行工具:

  • fmpeg:视频和音频转换器。
  • ffplay:媒体播放器。
  • ffprobe:从多媒体流中收集信息。

本笔记主要回顾一些最有用的 FFmpeg 用法。ffplayffprobe 的文档可以在互联网上找到,方便查阅。

安装#

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>

转尺寸#

转尺寸是指更改视频分辨率2,也称为缩放3 控制。

如果视频是高清文件,并且我们想将其缩小以减小大小,则可以使用缩放控制命令。

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 表示输出图像质量,通常在 15 之间(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

参考#

参考#

Footnotes#

  1. adi. 冗余的;多余的

  2. n. 分辨率

  3. n. 规模;范围;程度;等级;级别;vt. 攀登;改变... 的大小

  4. adv. 按比例的

  5. n. 旁白

  6. v. 渲染

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。