NVEncは速度が速いしロケフリに使えば最高なのでは?
とりあえず調べた
主に使用するソフトウェアはTvRemoteViewer_VBとTvRemoteFilesとFFmpeg。
この二つの導入方法などについてはここがかなーり詳しく解説しておられるので割愛します。
NVEnc対応のFFmpegを作る
問題となるのがNVEnc対応のFFmpegの入手先。
NVEncはライセンス上、再配布が禁止となっているのでFFmpegを自分でビルドしないと使えないみたいです。
ということで、仮想マシンを使ってビルドしてみる事にします。
仮想マシンを導入
使ったのはVirtualBoxとUbuntu 14.04 LTS。
Ubuntuは仮想ディスクイメージ(.vhd)を利用しました。
FFmpegビルド
利用するのはffmpeg-windows-build-helpers というもの。非常に簡単にビルドできると重宝されてます。
実行方法はGithubに記載されてるので割愛。
詰まった その一
ダウンロードできないパターン。
大体の場合、HTTPエラー500(鯖落ち)なので数分すれば直ると思います。
詰まった その二
FFmpegがlibvo-aacencを取り除いたのでエラーが出るパターン。
これはどうにかすると面倒なので使わない方向で行くことにしました。
ビルドする際に指定した「cross_compile_ffmpeg.sh」ファイルを開き、
その中から「–enable-libvo-aacenc」と記載された部分を消します。
根本的な解決にはなってないけどあとで修正すれば問題ありません。
ビルド終わり
ビルドが完了すると上記のような表示が出ます。
ディレクトリ../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
の二種類を置換してください。
実行してみる
MPEG-2-TSをNVEncを利用してH.264、720pにエンコード中の負荷状況です。
非常に低負荷ですし、30分の映像でも12分ですべてのエンコードが完了してしまいます。
ffmpegの設定をもうちょいいじればさらに最適化できそうですね。
詰まった その三
原因はBASIC認証。どうやらスマートフォンで見る際はうまくこの認証がおこなわれないようです。
基本的にLAN内でしか使わないので認証無しに設定したところ視聴できました。
地上波&BSストリーミング…したくない…?
古いスマートフォン(XperiaZ)でもフルセグ映像が見れれば便利だろうなぁという事で設定してみました。
見れた
こちらの設定方法もこちらの通りに設定。NVEnc特有の設定は上記の分だけです。
映像遅延はどうしても発生しますが、配信側にかかっている負荷が非常に小さいので精神的に安心できますね。
詰まった その四
アンテナのチャンネル切替がおこなわれない。というか見れない問題が発生。
スクランブル解除がうまくいっていないのか、RecTaskがうまく動作していないのか不明でしたが、Spinelを経由させる事で解決しました。
最終的には下記のような流れで配信がおこなわれています。
最後に
面倒っすね。Linux鯖導入しようかなほんと。