録画後のファイル圧縮について

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

自分の環境は

  • CPU Intel core-i5 4460
  • GPU ASUS GTX650-E-1GD5

これにCentOS6.9を入れて使っている。

なぜにグラボ?と思われている方もいるのではないだろうか。

最初はQSV狙いでCentOS7で攻めたかったのだが、PX-W3PEのドライバが6シリーズのカーネルまでしか対応しない。ソースもついてないし何もできなかった。PT3は生産中止だし踏んだり蹴ったり。どなたかPT3譲ってくれませんか?w

QSVも6系ではvaapi経由でアクセスできる。早いんだよ?けどそれだけだった。

フィルター関連の使い方がいまいちわからず、ビットレート上げただけでは思ったようにきれいに仕上げられなかった。

当然時間をかけてCPUぶん回せばきれいな動画はできるよ。けれど録画中だったりすると動画変換にCPU持っていかれてドロップ発生したりするので、なるべく負荷率を減らしたかった。ファンの音もうるさくなるしね。

次に目をつけたのがたまたま残ってたGTX650によるNVEncだった。ffmpegのgit最新だと--enable-nvencするだけで使えるようになるから簡単にできそう。

 

というわけでGeforce-650以上のグラボでやってみました。

最初に引っかかったのがドライバのインストールでした。

ドライバはNVIDIAのLongブランチ版では有効にならない事。

これはhttp://www.nvidia.com/object/unix.htmlからShortブランチ版を落としてインストールすればいい。

次に引っかかったのが既存汎用ドライバとのバッティング。nouveauというのだがこれがなかなか引っ込んでくれない。

私はOS再インストールする必要があったので以下の画面の時にInstall system with basic video driverを選択しておいた。

インストール最初の画面。

あとはここの通りgrubにnouveauを読み込みさせない設定を施します。

nvidiaのドライバはrunファイルを落としてあるはずなのでrootでsh NVIDIA-Linux-x86_64-XXX.XX.runでインストールできるはずです。(当然ですがグラボ刺した状態でないとコマンド等が働かないですからね)

XXX.XXは現執筆時381.22でした。

色々聞かれるけどx関連うんぬん等は適宜応答してね。

インストール後再起動するとlshwコマンドでvideo欄にnvidiaが有効になっていると思います。

ffmpegはnvencを有効にしたものを準備してください。私は初めからビルドしました。

time ./ffmpeg -y -loglevel 0 \
-i "000test.ts" \
-f mp4 \
-c:v h264_nvenc -aspect 16:9 \
-vf yadif=1:-1:0,scale=720:-1 \
-c:a copy \
001test.mp4

こんな感じでgeforceに食わせます。上記だと720p60fpsに小さくします。60fpsにしているのはスポーツ番組とか動きの速い奴対応です。

私の環境で220fps位で変換していきます。

出来上がった物もlibx264にはかないませんが、そん色ない物にはなります。TOPコマンドで見ても180%位でしょうか。これなら負荷にならないかなと。

chinachuにインストールされてるffmpegはそのままにしておきます。取り替えてもいいんだけど現環境はあんまりいじらない方がいいかなって思って。

録画後スクリプトを別に走らせます。

  "recordedCommand": "/home/chinachu/chinachu/usr/bin/encode.sh",

として/home/chinachu/chinachu/usr/bin/encode.shを以下のような感じにします。

#!/bin/sh

log=$1.txt
echo -----start encoding @$(date +%Y/%m/%d/%H:%M:%S)----- >> $log
start=$(date +%s)
echo $1 >> $log

/usr/local/bin/ffmpeg -y -i "$1" \
       -vcodec h264_nvenc -f mp4 \
       -aspect 16:9 \
       -vf yadif=1:-1:0,scale=720:-1 \
       -acodec 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

私の環境では/usr/local/bin/にffmpegをおいてありますので適宜変更してくださいね。

こうしておくと録画ファイルの場所にTXTが作成され動画変換時の情報が入りますので、終わったあたりに確認してエラー等がでていなければTSファイルを削除することができます。

 

コメント

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