FFmpeg 是一個完整的跨平台解決方案,用於錄製、轉換和串流音頻和視頻。這是我的 FFmpeg 學習筆記。使用 ffmpeg 作為視頻編輯器和轉換器。更改 fps 並將
.mp4
文件轉換為.gif
和其他格式。
概述#
FFmpeg 是 "Fast Forward Moving Pictures Experts Group" 的縮寫。這是一個龐大的項目,提供以下三個命令行工具:
fmpeg
:視頻和音頻轉換器。ffplay
:媒體播放器。ffprobe
:從多媒體流中收集信息。
這份筆記主要回顧一些最有用的 FFmpeg
用法。ffplay
和 ffprobe
的文檔可以在互聯網上找到,查閱方便。
安裝#
Windows#
進入 FFmpeg 的官方網站,選擇 CODEX FFMPEG @ gyan.dev,找到 "release build" 部分,下載 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
有兩個輸入文件,一個音頻和一個視頻,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