録画サーバ構築 epgrec UNA リアルタイム エンコーディング

epgrec UNAをmirakurunと連携させて動かすようにした。細部で仕様が合わないところもあるが、番組更新や予約録画など主要処理が動作するようになったのでよしとする。続いて何とかしたかったのが、トランスコーディング処理。現在のepgrec UNAの作りだと時刻通りにTS録画を行い、その後にトランスコード処理としてmp4へのエンコードとcomskipを使ったチャプター追加を行っている。この録画後の処理が長くてうんざりする。ちょうど番組が終わるから見ようと思ってもしばらく見ることが出来ない。

アースソフト★地デジチューナーカード PT3 Rev.A★
価格 : 31,800円(税込、送料無料)
by Yahoo! ショッピング

エンコードはskylakeのQSVを使ってハードウェア・エンコーディングしているものの、それでも1時間番組に対して15分くらいは費やす。comskipの処理も数分はかかるので、正味20分は待たされることになる。そんなにすぐ見たいなら生で見ればいいじゃんと思うかもしれないし、もちろんそれでもいいんだけど、何というか1時間もかけてだらだら録画してるくせに、録画が終わってから急いで仕事するという非効率さが目に付いてしまう。つまり録画中の1時間に並行して時間のかかる処理をやっておけよ、という思い。

技術的なイメージで言うと、放送波を2系統に分けて片方はdiskに直接記録し、もう一方は圧縮してからdiskへ記録する、という流れにすればよい。簡単に思い付くのはrivarunの出力をteeに渡して、ファイル出力と標準出力に吐かせる。ファイル出力の方はそのままTS録画になるのでよし。標準出力の方をffmpegにpipeして、それをmp4としてdiskに出力する。ffmpegはQSVに対応させているので、それほどCPUは使わずに済む。4並列録画を試してみたがCore i3のCPUが張り付くようなことはなかった。

epgrec UNAの録画処理はrecpt1からrivarunに変更する時点で好き勝手に書き換えているので、更に書き換えていくことにためらいはない。今回も録画処理用のatコマンドを生成してくれるResavation.class.phpを直接変更していく。まず、ffmpegをQSVで動かすには幾つか環境変数が必要なのでセットされるようにする。1472行辺りにある$envに以下の環境変数を追加しておく。

$env = array( 'CHANNEL'    => $crec_->channel,
    :
    'LIBVA_DRIVERS_PATH' => '/opt/intel/mediasdk/lib64',
    'LIBVA_DRIVER_NAME'  => 'iHD',
    'MFX_HOME'           => '/opt/intel/mediasdk',
    'PKG_CONFIG_PATH'    => '/opt/intel/opencl',
);

そして本題となるrivarunでの録画処理を以下のようなコマンドに置き換える。

$cmd_ts = '/usr/bin/rivarun '.$slc_cmd['b25'].$device.$sid.' --ch '.$smf_type.'/'.$crec_->channel.' '.$duration.' - | tee \''.$add_dir.$filename.'\' | ffmpeg -y -v error -nostdin -i pipe:0 -f mp4 -preset medium -tune film -vcodec h264_qsv -s 1280x720 -vf yadif -vb 4500k -acodec aac -strict -2 -ac 2 -ar 48000 -ab 128k -threads 0 \''.$add_dir.$tmp_name.'.mp4\''.$falldely;

これでTSファイルと同時にmp4ファイルが書き込まれるようになった。トランスコード処理はこのmp4をcomskipするだけでよくなったので、後処理にかかる時間は数分まで短縮することが出来た。mariadbの問題で、たまにトランスコードに失敗することがあったのだが、再処理にかかる時間が長く、この対応も億劫だった。しかし、録画と同時にエンコードしておくこの方法であればトランスコードに失敗しても残る処理はcomskipだけなので非常に早い。というか、チャプターが入っていないだけで、そのまま見ても問題ないしね。

という訳で、度重なる魔改造で徐々に既存レコーダー並の使い勝手を手に入れつつある録画サーバ。かなり自分好みに作り変えてきたので、ほとんど手をかけることはなくなってきた。あとは面倒な録画予約処理を自動化できないかなあw むしろそういう部分を自作したくて録画サーバ化したと言ってもいいほど。ほとんど安定して処理できている一方で、ごく稀に録画失敗が起きる。もう見なかったことにしておきたいくらいだが、録画処理においてはわずかな失敗も許容できない。次回はこの問題を追及していく。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)