インストール
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
コメント