FFmpeg

来自Gea-Suan Lin's Wiki
跳到导航 跳到搜索

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. Encode/H.264 – FFmpeg. 2021-03-11 [2021-11-03] (English). 

外部连结