ffmpegのvaapi有効化

スポンサーリンク
スポンサーリンク

 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%程度で済んでいます。ほかの録画もちゃんとできていますしインタレ解除もできているようです。自己満足。
 これでしばらく走らせてみます。

コメント

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