vaapiが正常に動いている環境でffmpegをソースからコンパイルすると自動的に有効化された物が出来上がります。
ここではffmpegにfdk_aacとlibx264を有効化したffmpegを準備しましょう。
コンパイルの手順は本家にあります。
https://trac.ffmpeg.org/wiki/CompilationGuide/Centos
本当はstatic buildしたかったのですがvaapi関連を組み込んだ物を作成するとvaapi関連が動かない事が判明したため上記手順でコンパイルした物を利用します。
まずは1分程度の実写物のtsファイルを用意しましょう。可能であれば動きが激しい物が比較しやすいですね。
テストしましょう。ユーザーffmpegで作られた方はその中の~/binにffmpegがあるはずです。
うまく出来上がっているか確認します。
$~/bin/ffmpeg -hwaccels : Hardware acceleration methods: vaapi cuvid
とvaapiが表示されている事を確認します。
次にエンコードしてみます。テスト用ファイル名を/home/samba/video/001test.tsとした時/home/samba/video/001test.mp4を作成してみます。
~/bin/ffmpeg -y \ -vaapi_device /dev/dri/renderD128 \ -hwaccel vaapi -hwaccel_output_format vaapi \ -i /home/samba/video/001test.ts \ -vf 'format=nv12|vaapi,hwupload,deinterlace_vaapi,scale_vaapi=w=1280:h=720' \ -qp 18 \ -c:v h264_vaapi \ -aspect 16:9 \ -vsync 1 \ -c:a libfdk_aac \ -b:a 128k -afterburner 1 \ /home/samba/video/001test.mp4
これでうまく動作すれば/home/samba/video/001test.mp4が作成されているはずです。
これをWindows機なりなんなりで再生してみてください。
どうでしょうか。libx264の60pBOBにはかないませんがそれなりにエンコードできたと思います。
私はこれで満足しました。
このffmpegをどのユーザーでも使えるように設定します。
私は/usr/local/binに配置しました。
sudo cp ~/bin/ffmpeg /usr/local/bin sudo chmod a+x /usr/local/bin/ffmpeg
次にchinachuで録画が終わった後にエンコードさせるためのスクリプトを変更します。
私は/home/chinachu/chinachu/usr/bin/encode.shに設定しています。
その中身を以下のように書き換えます。
#!/bin/sh
until [ ! `pidof -s ffmpeg` ]
do
sleep 60
done
log=$1.txt
echo $2 | /home/chinachu/chinachu/usr/bin/jq '.' > $log
echo -----start encoding @$(date +%Y/%m/%d/%H:%M:%S)----- >> $log
start=$(date +%s)
echo $1 >> $log
/usr/local/bin/ffmpeg -y \
-vaapi_device /dev/dri/renderD128 \
-hwaccel vaapi -hwaccel_output_format vaapi \
-i "$1" \
-vf 'format=nv12|vaapi,hwupload,deinterlace_vaapi,scale_vaapi=w=1280:h=720' \
-qp 18 \
-c:v h264_vaapi \
-aspect 16:9 \
-vsync 1 \
-c:a libfdk_aac \
-b:a 128k -afterburner 1 \
"$1.mp4" 2>&1 | grep "^[^f]" >> $log
end=$(date +%s)
diff=$(expr $end - $start)
echo about $(expr $diff / 60) min. >> $log
echo ---finish encoding @$(date +%Y/%m/%d/%H:%M:%S)--- >> $log
echo >> $log
exit 0
更新内容としては他のffmpegが走っていたらsleepで待つ。次にffmpegをh264_vaapiでエンコードする設定です。
iGPUで走るので負荷が20%程度で済んでいます。ほかの録画もちゃんとできていますしインタレ解除もできているようです。自己満足。
これでしばらく走らせてみます。

コメント