NVEncを使って快適なロケフリ環境を目指す。

NVEncは速度が速いしロケフリに使えば最高なのでは?

とりあえず調べた

主に使用するソフトウェアはTvRemoteViewer_VBTvRemoteFilesとFFmpeg。
この二つの導入方法などについてはここがかなーり詳しく解説しておられるので割愛します。

NVEnc対応のFFmpegを作る

問題となるのがNVEnc対応のFFmpegの入手先。
NVEncはライセンス上、再配布が禁止となっているのでFFmpegを自分でビルドしないと使えないみたいです。
ということで、仮想マシンを使ってビルドしてみる事にします。

仮想マシンを導入

eghsehjjd
使ったのはVirtualBoxUbuntu 14.04 LTS
Ubuntuは仮想ディスクイメージ(.vhd)を利用しました。

FFmpegビルド

利用するのはffmpeg-windows-build-helpers というもの。非常に簡単にビルドできると重宝されてます。
実行方法はGithubに記載されてるので割愛。

詰まった その一

hdfjdkkkg
ダウンロードできないパターン。
大体の場合、HTTPエラー500(鯖落ち)なので数分すれば直ると思います。

詰まった その二

gdshsfhjj
FFmpegがlibvo-aacencを取り除いたのでエラーが出るパターン。
これはどうにかすると面倒なので使わない方向で行くことにしました。
ビルドする際に指定した「cross_compile_ffmpeg.sh」ファイルを開き、
その中から「–enable-libvo-aacenc」と記載された部分を消します
根本的な解決にはなってないけどあとで修正すれば問題ありません。

ビルド終わり

fnxdfmm,c,
ビルドが完了すると上記のような表示が出ます。
ディレクトリ../sandbox/x86_64/ffmpeg_git_with_aac/ffmpeg.exeにあるので、それを何らかの方法でWindowsへ持ってくればビルド完了です。

TvRemoteViewer_VBでNVEncが動くようにする

NVEncが可能なFFmpegができたとはいえ、そのFFmpegはx264なども内蔵しています(デフォルト)
TvRemoteViewer_VBに変更を加えなくても動きますが、NVEncではないです(libvo-aacencが無いのでどのみちエラーでますけど)

ffpresetの書き換え

vcodec=nvenc
vprofile=main
#level=30
maxrate=10000000
bufsize=10000000
flags=+loop-global_header

../TvRemoteViewer_VB/ffmpeg/presets/libx264-ipod640.ffpresetのディレクトリにあります。
赤文字の場所を書き換えてください。
vprofileはbaselineでも問題ありませんが、互換性重視の保険です(意味なかった)

HLSオプションファイルの書き換え

  • HLS_option
  • HLS_option_ffmpeg.txt
  • HLS_option_ffmpeg_file.txt
  • HLS_option_ffmpeg_http.txt

のファイルを書き換える必要があります。
書き換えには置換を利用すると非常に便利です。

-vcodec libx264

-vcodec nvenc

-acodec libvo_aacenc

-acodec aac

二種類を置換してください。

実行してみる

shdk
MPEG-2-TSをNVEncを利用してH.264、720pにエンコード中の負荷状況です。
非常に低負荷ですし、30分の映像でも12分ですべてのエンコードが完了してしまいます。
ffmpegの設定をもうちょいいじればさらに最適化できそうですね。

詰まった その三

hdtrj
原因はBASIC認証。どうやらスマートフォンで見る際はうまくこの認証がおこなわれないようです。
基本的にLAN内でしか使わないので認証無しに設定したところ視聴できました。

地上波&BSストリーミング…したくない…?

古いスマートフォン(XperiaZ)でもフルセグ映像が見れれば便利だろうなぁという事で設定してみました。

見れた

rjdrkk
こちらの設定方法もこちらの通りに設定。NVEnc特有の設定は上記の分だけです。
映像遅延はどうしても発生しますが、配信側にかかっている負荷が非常に小さいので精神的に安心できますね。

詰まった その四

アンテナのチャンネル切替がおこなわれない。というか見れない問題が発生。
スクランブル解除がうまくいっていないのか、RecTaskがうまく動作していないのか不明でしたが、Spinelを経由させる事で解決しました。
最終的には下記のような流れで配信がおこなわれています。
90ioj9ik

最後に

面倒っすね。Linux鯖導入しようかなほんと。