FFmpeg
跳至導覽
跳至搜尋
FFmpeg是一個多媒體(影像與聲音)的處理軟件。
安裝
一般性的安裝可以直接裝Ubuntu系統的FFmpeg套件:
sudo apt install -y ffmpeg; sudo apt clean
但我們這邊建議裝SergeyD的PPA,主要是我會用到svt-av1與fdk-aac:
sudo add-apt-repository -y ppa:sergey-dryabzhinsky/ffmpeg; sudo apt update; sudo apt install -y ffmpeg; sudo apt clean
不過要注意SergeyD的PPA有包一些其他的軟件,可能會與現有的軟件衝突(尤其是自己的桌機),需要取捨。
自己編
這邊是自己嘗試在Docker裏面編一個x86-64的靜態版本出來用(我這邊是用ubuntu:jammy
的系統環境,也就是Ubuntu 22.04的版本):
docker run -it ubuntu:jammy /bin/bash
接着在container裏面開始建立編譯環境並且編東西:
renice 20 $$
sed -i -e 's/archive/tw.archive/g' /etc/apt/sources.list
apt update
apt dist-upgrade -y
ln -s /usr/share/zoneinfo/Etc/UTC /etc/localtime
apt install -y build-essential cmake curl git libfdk-aac-dev libgmp-dev libmp3lame-dev libopus-dev libssl-dev libswscale-dev libtwolame-dev libvo-amrwbenc-dev libvorbis-dev libwebp-dev libx264-dev libz-dev meson nasm pkg-config yasm
apt clean
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source ~/.profile
(
cd /tmp
git clone https://aomedia.googlesource.com/aom
cd aom
git checkout v3.5.0
cd /tmp
mkdir aom_build
cd aom_build
cmake ../aom -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DENABLE_TESTS=0
make -j install
) &
(
cd /tmp
git clone https://code.videolan.org/videolan/dav1d.git
cd dav1d
git checkout 1.0.0
mkdir build
cd build
meson .. --default-library=static --prefix=/usr
ninja install
) &
(
cd /tmp
git clone https://github.com/xiph/rav1e.git
cd rav1e
git checkout v0.5.1
RUSTFLAGS="-C target-feature=+avx2,+fma" cargo build --release
cargo install cargo-c
cargo cinstall --release --libdir=/usr/lib64 --prefix=/usr
sed -i -e 's/ -lgcc_s/ /' target/x86_64-unknown-linux-gnu/release/rav1e.pc
cargo cinstall --release --libdir=/usr/lib64 --prefix=/usr
) &
(
cd /tmp
git clone https://gitlab.com/AOMediaCodec/SVT-AV1.git
cd SVT-AV1
git checkout v1.3.0
cd Build
cmake .. -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_DEC=OFF -DBUILD_SHARED_LIBS=OFF
make -j install
) &
(
cd /tmp
git clone https://github.com/Netflix/vmaf.git
cd vmaf
git checkout v2.3.1
cd libvmaf
meson build --buildtype release --default-library=static --prefix=/usr
ninja -vC build install
) &
(
cd /tmp
git clone https://chromium.googlesource.com/webm/libvpx
cd libvpx
git checkout v1.12.0
mkdir build
cd build
../configure --prefix=/usr
make -j install
) &
cd /tmp
git clone https://github.com/FFmpeg/FFmpeg.git
cd FFmpeg
git checkout n5.0.2
wait
PKG_CONFIG_PATH=/usr/lib64/pkgconfig ./configure \
--extra-version=gslin.$(date +%Y%m%d) \
--enable-gpl --enable-nonfree --enable-version3 \
--disable-shared --enable-static --extra-ldflags="-static" --ld="g++" --pkg-config-flags="--static" \
--enable-decoder=png \
--enable-demuxer=concat,image2,matroska,mov,mp3,mpegts,ogg,wav \
--enable-gmp \
--enable-libaom \
--enable-libdav1d \
--enable-libfdk-aac \
--enable-libmp3lame \
--enable-libopus \
--enable-librav1e \
--enable-libsvtav1 \
--enable-libtwolame \
--enable-libvmaf \
--enable-libvo-amrwbenc \
--enable-libvorbis \
--enable-libvpx \
--enable-libwebp \
--enable-libx264 \
--enable-openssl
make -j
最後可以用docker ps
看一下container的編號,然後用docker cp a1234567890a:/tmp/FFmpeg/ffmpeg .
把編好的檔案複製出來。
使用
- 大多數的情況下可以加上
-nostdin
,避免FFmpeg吃到stdin的資料。
範例
這邊是一般性的用法,把來源檔案(讓FFmpeg自己去讀)轉成H.264格式,使用CRF模式,參數設為18(依照官方的說明應該是肉眼看不太出來[1]):
ffmpeg -nostdin -i "${filename}.mp4" -c:v libx264 -crf 18 -c:a libfdk_aac -b:a 128k -ac 2 -y "${filename}-transcoded.mp4"
2pass
要注意每個codec的2pass參數都不太一樣,這邊用的是VP9:
ffmpeg -nostdin -i "${filename}.mp4" -c:v vp9 -c:a opus -crf 12 -pass 1 -an -f null -passlogfile "${filename}.mp4.log" -y /dev/null
ffmpeg -nostdin -i "${filename}.mp4" -c:v vp9 -c:a opus -crf 12 -pass 2 -passlogfile "${filename}.mp4.log" -b:a 96k -ac 2 -y "${filename}-transcoded.mp4"
YUV444轉H.264
把YUV444格式的檔案轉成接近無損的H.264,其中需要指定:
-s 1920x1080
(來源影片的解像度)-r 30
(來源影片的畫面播放速率)
像是這樣:
ffmpeg -nostdin -f rawvideo -s 1920x1080 -r 30 -pix_fmt yuv420p -i BirdsInCage_30fps.yuv -c:v libx264 -preset veryslow -crf 1 -y BirdsInCage.mp4
要注意的是-crf 0
會強制產生4:4:4的格式,最少需要-crf 1
才能轉成4:2:0
。
切割
切1:23:45到2:34:56 的部分:
ffmpeg -nostdin -i source.mp4 -ss 1:23:45 -to 2:34:56 -c:v copy -c:a copy -y clip.mp4
合併
這邊只處理音檔:
ffmpeg -nostdin -i source1.wav -i source2.wav -filter_complex '[0:0][1:0]concat=n=2:v=0:a=1[out]' -map '[out]' -c:a copy -y concated.wav
參考資料
- ↑ Encode/H.264 – FFmpeg. 2021-03-11 [2021-11-03] (English).
外部連結
- 官方網站 (英文)
- FFmpeg builds : SergeyD (英文)