FFmpegエンコードメモ H.264 H.265 ハードウェアエンコード m2ts

自宅サーバ
自宅サーバ

インストール

FFmpeg

Debianの場合、非公式のマルチメディアパッケージを提供するサイトからインストールするの楽。

apt 公開鍵登録用

sudo apt install -y gnupg dirmngr

マルチメディアパッケージのソースリスト追加

sudo gpg --keyserver keyring.debian.org --recv-keys 5C808C2B65558117
sudo gpg --armor --export 5C808C2B65558117 | sudo apt-key add -
echo 'deb http://www.deb-multimedia.org bullseye main non-free' | sudo tee /etc/apt/sources.list.d/multimedia.list

更新・アップグレード

sudo apt update
sudo apt -y upgrade

インストール

sudo apt install -y ffmpeg

ハードウェアエンコード

sudo apt install -y firmware-amd-graphics i965-va-driver-shaders mesa-va-drivers vainfo
  • firmware-amd-graphics
    AMD/ATI グラフィックス チップ用のバイナリファームウェア

  • i965-va-driver-shaders
    Intel CPU用 VA-APIドライバ

  • mesa-va-drivers
    AMD CPU用 VA-APIドライバ

  • vainfo
    VA-APIのサポートをチェック

再起動します。

sudo reboot

VA-APIで使用するデバイスの確認。

ls /dev/dri

renderD128 が表示されれば問題ありません。

by-path  card0  renderD128

vainfo コマンドは、システムがハードウェアアクセラレーションに対応しているかどうか、そしてどのような機能が利用可能かを確認するのに役立ちます。

vainfo

以下のように表示され、サポート状況が確認できます。

error: can't connect to X server!
libva info: VA-API version 1.10.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: va_openDriver() returns -1
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_1_8
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.10 (libva 2.10.0)
vainfo: Driver version: Intel i965 driver for Intel(R) Gemini Lake - 2.4.1
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointEncSliceLP
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointEncSliceLP
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointEncPicture
      VAProfileVP8Version0_3          : VAEntrypointVLD
      VAProfileVP8Version0_3          : VAEntrypointEncSlice
      VAProfileHEVCMain               : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointEncSlice
      VAProfileHEVCMain10             : VAEntrypointVLD
      VAProfileHEVCMain10             : VAEntrypointEncSlice
      VAProfileVP9Profile0            : VAEntrypointVLD
      VAProfileVP9Profile0            : VAEntrypointEncSlice
      VAProfileVP9Profile2            : VAEntrypointVLD

デバイスファイルのアクセス権限を設定します。

echo 'KERNEL=="render*" GROUP="render", MODE="0666"' | sudo tee /etc/udev/rules.d/99-render.rules
sudo udevadm control --reload-rules && sudo udevadm trigger

エンコード

H.264

ソフトウェアエンコード

# H.264
cat 001.m2ts | ffmpeg -y -i pipe:0 -c:v libx264 -c:a aac 001.mp4
# H.264 -crf 20 (品質固定モード)
cat 001.m2ts | ffmpeg -y -i pipe:0 -c:v libx264 -crf 20 -c:a aac 001.mp4
# H.264 -vf yadif (ビデオフィルタ インターレース解除)
cat 001.m2ts | ffmpeg -y -i pipe:0 -vf yadif -c:v libx264 -crf 20 -c:a aac 001.mp4
# H.264 -preset veryfast (プリセット)
cat 001.m2ts | ffmpeg -y -i pipe:0 -vf yadif -preset veryfast -c:v libx264 -crf 20 -c:a aac 001.mp4

ハードウェアエンコード

# H.264 HW 
cat 001.m2ts | ffmpeg -y -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -i pipe:0 -c:v h264_vaapi -c:a aac 001.mp4
# H.264 HW -qp 27 (品質)
cat 001.m2ts | ffmpeg -y -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -i pipe:0 -c:v h264_vaapi -qp 27 -c:a aac 001.mp4
# H.264 HW -vf 'format=vaapi,deinterlace_vaapi' (ビデオフィルタ インターレース解除)
cat 001.m2ts | ffmpeg -y -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -i pipe:0 -vf 'format=vaapi,deinterlace_vaapi' -c:v h264_vaapi -qp 27 -c:a aac 001.mp4

H.265

ソフトウェアエンコード

# H.265
cat 001.m2ts | ffmpeg -y -i pipe:0 -c:v libx265 -c:a aac 001.mp4
# H.265 -crf 20 (品質固定モード)
cat 001.m2ts | ffmpeg -y -i pipe:0 -c:v libx265 -crf 20 -c:a aac 001.mp4
# H.265 -vf yadif (ビデオフィルタ インターレース解除)
cat 001.m2ts | ffmpeg -y -i pipe:0 -vf yadif -c:v libx265 -crf 20 -c:a aac 001.mp4
# H.265 -preset veryfast (プリセット)
cat 001.m2ts | ffmpeg -y -i pipe:0 -vf yadif -preset veryfast -c:v libx265 -crf 20 -c:a aac 001.mp4
# H.265 -tag:v hvc1
cat 001.m2ts | ffmpeg -y -i pipe:0 -vf yadif -preset veryfast -c:v libx265 -crf 20 -tag:v hvc1 -c:a aac 001.mp4

ハードウェアエンコード

# H.265 HW
cat 001.m2ts | ffmpeg -y -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -i pipe:0 -c:v hevc_vaapi -c:a aac 001.mp4
# H.265 HW -qp 27 (品質)
cat 001.m2ts | ffmpeg -y -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -i pipe:0 -c:v hevc_vaapi -qp 27 -c:a aac 001.mp4
# H.265 HW -vf 'format=vaapi,deinterlace_vaapi' (ビデオフィルタ インターレース解除)
cat 001.m2ts | ffmpeg -y -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -i pipe:0 -vf 'format=vaapi,deinterlace_vaapi' -c:v hevc_vaapi -qp 27 -c:a aac 001.mp4
# H.265 HW -tag:v hvc1
cat 001.m2ts | ffmpeg -y -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -i pipe:0 -vf 'format=vaapi,deinterlace_vaapi' -c:v hevc_vaapi -qp 27 -tag:v hvc1 -c:a aac 001.mp4

オプション

# H.265 -fix_sub_duration  -map 0:s? -c:s mov_text (字幕)
cat 001.m2ts | ffmpeg -y -fix_sub_duration -i pipe:0 -vf yadif -preset veryfast -c:v libx265 -crf 20 -tag:v hvc1 -c:a aac -map 0:s? -c:s mov_text 001.mp4
# H.265 -movflags +faststart
cat 001.m2ts | ffmpeg -y -fix_sub_duration -i pipe:0 -movflags +faststart -vf yadif -preset veryfast -c:v libx265 -crf 20 -tag:v hvc1 -c:a aac -map 0:s? -c:s mov_text 001.mp4
# H.265 -ignore_unknown
cat 001.m2ts | ffmpeg -y -fix_sub_duration -i pipe:0 -movflags +faststart -ignore_unknown -vf yadif -preset veryfast -c:v libx265 -crf 20 -tag:v hvc1 -c:a aac -map 0:s? -c:s mov_text 001.mp4
# H.265 -analyzeduration 10M
cat 001.m2ts | ffmpeg -y -fix_sub_duration -analyzeduration 10M -i pipe:0 -movflags +faststart -ignore_unknown -vf yadif -preset veryfast -c:v libx265 -crf 20 -tag:v hvc1 -c:a aac -map 0:s? -c:s mov_text 001.mp4
# H.265 -probesize 32M
cat 001.m2ts | ffmpeg -y -fix_sub_duration -analyzeduration 10M -probesize 32M -i pipe:0 -movflags +faststart -ignore_unknown -vf yadif -preset veryfast -c:v libx265 -crf 20 -tag:v hvc1 -c:a aac -map 0:s? -c:s mov_text 001.mp4
# H.265 -max_muxing_queue_size 1024
cat 001.m2ts | ffmpeg -y -fix_sub_duration -analyzeduration 10M -probesize 32M -i pipe:0 -movflags +faststart -ignore_unknown -vf yadif -preset veryfast -c:v libx265 -crf 20 -tag:v hvc1 -c:a aac -map 0:s? -c:s mov_text -max_muxing_queue_size 1024 001.mp4
# H.265 -map 0:v
cat 001.m2ts | ffmpeg -y -fix_sub_duration -analyzeduration 10M -probesize 32M -i pipe:0 -movflags +faststart -ignore_unknown -map 0:v -vf yadif -preset veryfast -c:v libx265 -crf 20 -tag:v hvc1 -c:a aac -map 0:s? -c:s mov_text -max_muxing_queue_size 1024 001.mp4
# H.265 -map 0:a
cat 001.m2ts | ffmpeg -y -fix_sub_duration -analyzeduration 10M -probesize 32M -i pipe:0 -movflags +faststart -ignore_unknown -map 0:v -vf yadif -preset veryfast -c:v libx265 -crf 20 -tag:v hvc1 -map 0:a -c:a aac -map 0:s? -c:s mov_text -max_muxing_queue_size 1024 001.mp4
# H.265 -map -0:13? -map -0:10?
cat 001.m2ts | ffmpeg -y -fix_sub_duration -analyzeduration 10M -probesize 32M -i pipe:0 -movflags +faststart -ignore_unknown -map -0:13? -map -0:10? -map 0:v -vf yadif -preset veryfast -c:v libx265 -crf 20 -tag:v hvc1 -map 0:a -c:a aac -map 0:s? -c:s mov_text -max_muxing_queue_size 1024 001.mp4

デュアル モノラル

# H.265 -filter_complex channelsplit -metadata:s:a:0 title=main -metadata:s:a:1 title=sub  -ac 2
cat 001.m2ts | ffmpeg -y -fix_sub_duration -analyzeduration 10M -probesize 32M -i pipe:0 -movflags +faststart -ignore_unknown -map -0:13? -map -0:10? -map 0:v -vf yadif -preset veryfast -c:v libx265 -crf 20 -tag:v hvc1 -filter_complex channelsplit -metadata:s:a:0 title=main -metadata:s:a:1 title=sub -map 0:a -c:a aac -ac 2 -map 0:s? -c:s mov_text -max_muxing_queue_size 1024 001.mp4

その他

# カット
cat 001.m2ts | ffmpeg -y -i pipe:0 -c copy -ss 5 -t 120 002.m2ts
# クロップ
ffmpeg -y -i 001.m2ts -vf crop=w=960:h=480:x=0:y=0 002.m2ts

昔の設定メモ

STREAM=`wakasacat "$INPUT" | ffprobe -i pipe:0 -hide_banner -show_programs -of compact 2>&1 | grep "codec_type=video\|codec_type=audio" | grep -o -e "index=[0-9]\+" | sed -e "s/index=/-map 0:/" |  tr '\n' ' '`

if [ "$MODE" = "high" ]; then

    wakasacat "$INPUT" | $FFMPEG -dual_mono_mode main -vaapi_device /dev/dri/renderD128 -i pipe:0 $STREAM -vf 'format=nv12|vaapi,hwupload,deinterlace_vaapi=rate=field:auto=1,scale_vaapi=w=1980:h=1080' -c:v h264_vaapi -level 40 -qp 23 -aspect 16:9 -acodec aac -ar 48000 -ab 192k -ac 2 -max_muxing_queue_size 9999 "$OUTPUT"

else

    wakasacat "$INPUT" | $FFMPEG -dual_mono_mode main -vaapi_device /dev/dri/renderD128 -i pipe:0 $STREAM -vf 'format=nv12|vaapi,hwupload,deinterlace_vaapi,scale_vaapi=w=1280:h=720' -c:v h264_vaapi -level 40 -qp 23 -aspect 16:9 -acodec aac -ar 48000 -ab 192k -ac 2 -max_muxing_queue_size 9999 "$OUTPUT"
fi

コメント

タイトルとURLをコピーしました