CUDA

NVENC実戦配備

昨日、NVENCに対応したUbuntuでのハードウェアエンコード環境ができたので、溜まったtsファイルをエンコードしていくことに。

PT2とPT3の複数実装で録画は並列でできるものの、GPUエンコードは並列処理できないと思われるので予約録画の流れでエンコードさせる仕組みは見直し、録画スクリプトはtsファイルを/mnt/ts_pool/10_recordedに移動させたところで終了とする。

yano@GT110b:~$ ll /mnt/ts_pool/
total 76
drwxr-xr-x  6 yano family    97 Feb  3 22:00 ./
drwxr-xr-x 14 root root    4096 Dec  9 17:23 ../
drwxrwxrwx  2 yano family 49152 Feb  4 22:45 10_recorded/
drwxrwxrwx  2 yano family  4096 Feb  4 09:39 19_encode_failed/
drwxrwxrwx  2 yano family 12288 Feb  4 22:45 20_encoded/
drwxrwxrwx  2 yano family 16384 Feb  4 08:02 30_ts_files/
yano@GT110b:~$

10分ごとにcronで起動する周期タスク~/etc/cron.sh/encode_mp4.cron/mnt/ts_pool/10_recordedから古い順に数本ずつピックアップして、エンコードできたのは/mnt/ts_pool/20_encodedに、エラーになったものは/mnt/ts_pool/19_encode_failedに移動させていく仕組みに。PIDFILEを使って重複起動しないようにするのを忘れずに。

yano@GT110b:~$ cat ~/etc/cron.sh/encode_mp4.cron
#!/bin/bash
PATH=/bin:/usr/bin:/sbin:/usr/sbin
NUM_FILES=5
EXT_TS=".ts"
PIDFILE=/home/yano/run/`basename $0`.pid
UUID=`id | sed 's/uid=\([0-9]*\)(.*/\1/'`;
[ $UUID -eq 0 ] && PIDFILE=/var/run/`basename $0`.pid;
if [ -e ${PIDFILE} ];
then
    exit;
fi
echo $$ > ${PIDFILE}
trap "/bin/rm -f ${PIDFILE}; exit" 1 2 3 15
CONFIGFILE=/etc/default/epgrec
# source config info
[ -r ${CONFIGFILE} ] && . ${CONFIGFILE}
TS_FILES=`ls -1 ${TS_RECORDED}/*${EXT_TS} | head -${NUM_FILES}`
for f in ${TS_FILES};
do
    /home/yano/bin/ts2mp4_nvidia.sh $f 2>&1 > /dev/null
    if [ $? -eq 0 ];
    then
        chown ${OWNER} ${MP4DIR}/`basename $f ${EXT_TS}`.mp4;
        mv $f ${TS_ENCODED};
    else
        mv $f ${TS_ENCODE_FAILED};
    fi;
done
if [ -e ${PIDFILE} ];
then
    rm -f ${PIDFILE};
fi
yano@GT110b:~$

参照

www.nodoka.org http://www.nodoka.org/

UbuntuとNVENC

Ubuntuでのハードウェアエンコード環境構築作業は先月18日24日とGStreamer+VAAPIにトライしたもののまだ先が長そうだ。

とはいえGT110bにもひと月分の録画済みファイルが溜まってしまったので、気分転換も兼ねてCUDA改めNVENCを試してみることに。

まずはGT710なMSI GT710 1GD3H LPを突っ込んで、libcudaとnvidiaドライバをインストール。

yano@haswell:~$ sudo apt-get install libcuda1-367 nvidia-367 nvidia-367-dev

nvidiaドライバと喧嘩するらしいnouveauをblacklistに登録して再起動。 続いてCompilationGuide/Ubuntuを読みながら、ffmpegのインストール。と思ったが、気まぐれに"ffmpeg -encoders"を見たところ、“NVIDIA NVENC H.264 encoder"が有効になっている事に気付いた。

yano@haswell:~$ ~/bin/ffmpeg -encoders 2>&1 | grep NVIDIA
 V..... h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc                NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc_h264           NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc_hevc           NVIDIA NVENC hevc encoder (codec hevc)
 V..... hevc_nvenc           NVIDIA NVENC hevc encoder (codec hevc)
yano@haswell:~$

ダメ元で

yano@haswell:~$ ~/bin/ffmpeg -i input.ts -vcodec h264_nvenc ouput.mkv
yano@haswell:~$

てな感じで動かしたところ、あっさりエンコードできたっぽい。まだチューニングの余地はあるものの