banner
Sereinme

Sereinme

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

📽️FFmpeg

ffmepg

FFmpeg 是一個完整的跨平台解決方案,用於錄製、轉換和串流音頻和視頻。這是我的 FFmpeg 學習筆記。使用 ffmpeg 作為視頻編輯器和轉換器。更改 fps 並將 .mp4 文件轉換為 .gif 和其他格式。

概述#

FFmpeg 是 "Fast Forward Moving Pictures Experts Group" 的縮寫。這是一個龐大的項目,提供以下三個命令行工具:

  • fmpeg:視頻和音頻轉換器。
  • ffplay:媒體播放器。
  • ffprobe:從多媒體流中收集信息。

這份筆記主要回顧一些最有用的 FFmpeg 用法。ffplayffprobe 的文檔可以在互聯網上找到,查閱方便。

安裝#

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>

轉尺寸#

轉尺寸意味著改變視頻解析度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

有兩個輸入文件,一個音頻和一個視頻,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. 渲染

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。