ここのLive配信の設定について

構成

IPアドレスはイメージで実際のIPアドレスとは異なります。

水槽の手前にLiveCameraを設置しています。 カメラはMicrosoftのLifeCamです。フルHDには対応していません。 PCとはUSB接続です。

PCでは、FFMPEGでエンコードを行い、NginxHTTP配信を行っています。

家の環境ではマンションがプロバイダ契約を行っており、無料でインターネット接続できます。

有線と無線のLAN環境が用意されていますが無線LANのアカウントはマンション管理者がわかってしまうのでプライバシー保護的な意味も兼ねてルーターを1つ入れています。

プライバシー セパレータとかあったりするので、ネットワーク内でのファイル共用などもちょっと支障をきたすことや、室内機器同士の転送の速さなどの問題も解決できます。

マンションのルーターはDHCPでIPを提供していることと、マンション共有なのでグローバルIPを利用してサービスの提供ができません。

したがって、家のPCにサーバーを立てたところで、外からアクセスできない状態です。

そこで、VPSVPNで接続して、VPS側のNginxのリバースプロキシの機能を使ってグローバルに公開しています。

リバースプロキシをすることで、中のPCにWEB以外のアクセスを防ぐことや、SSL/TSLの導入もできました。

FFMPEGの設定について

現在PCには2枚のグラフィックカードが入っていて、CPUがi7なので、GPUが3つあります。それぞれのGPUをつかってエンコードを行います。

ひとまず、解像度は変更せずにビットレートを3種類にしてHLS形式でファイルを作成しています。

CPU内蔵GPUはh264/128kbps、GTX750tiはh264/2Mbps、GTX1060はh265/10Mbpsに設定しています。

現在h265形式とh264形式で配信しています。CPUのGPUはyoutube liveように使う予定ですが、今はまだうまく行っていないので出力していません。

このとき、ライブ配信ではTSファイルがどんどん生成されていくので、ファイルの削除も行うように設定しています。

HDDやSSDで処理をしてもいいのですが、HDDだと処理速度が気になり、SSDだと寿命が気になるので RamDiskを導入しています。

ffmpeg -rtbufsize 350M ^
 -r 30^
 -f dshow ^
 -s 1920x1080 ^
 -i video="ELECOM 5MP Webcam" ^
 -an ^
 -pix_fmt yuv420p ^
 -c:v nvenc ^
 -tag:v hvc1 ^
 -vf yadif ^
 -gpu 1 ^
 -g 15 ^
 -b:v 8M ^
 -flags +global_header ^
 -f hls  ^
 -segment_format fmp4 ^
 -hls_time 5 ^
 -hls_list_size 8 ^
 -hls_allow_cache 0 ^
 -hls_segment_filename stream.c/stream_%%06d.m4s ^
 -hls_base_url stream.c/ ^
 -hls_flags delete_segments ^
 -vf "smartblur=1:-1:0:-0.9:-1:0,eq=brightness=-0.2:saturation=1.5,drawtext=fontfile='C\://WINDOWS/Fonts/msgothic.ttc':text='%%{localtime}'" ^
 playlist.c.m3u8 ^
 -c:v hevc_nvenc ^
 -tag:v hvc1 ^
 -vf yadif ^
 -gpu 0 ^
 -g 15 ^
 -b:v 8M ^
 -crf 23 ^
 -flags +global_header ^
 -f hls  ^
 -hls_segment_type fmp4 ^
 -s 960x540 ^
 -hls_time 5 ^
 -hls_list_size 8 ^
 -hls_allow_cache 1 ^
 -hls_segment_filename stream/stream_%%06d.m4s ^
 -hls_base_url stream/ ^
 -hls_flags delete_segments ^
 -vf "smartblur=1:-1:0:-0.9:-1:0,eq=brightness=-0.2:saturation=1.5,drawtext=fontfile='C\://WINDOWS/Fonts/msgothic.ttc':text='%%{localtime}'" ^
 playlist.m3u8 ^
 -r 5 -s 192x108 -vf eq=brightness=-0.2:saturation=1.5  -f image2 -update 1 x.jpg



ソース元のカメラの名称は下記のコマンドでわかります。

ffmpeg -list_devices true -f dshow -i dummy

カメラの対応している解像度とフレームレートは下記コマンドでわかります。

ffmpeg -list_options true -f dshow -i video="カメラの名前"

プレイリストについて

現在は環境によって1切り替えているの1ストリームずつ別のプレイリストで運用してます。したがって下記は過去の設定。

プレイリストファイル(m3u8)の内容は下記のような感じで設定しています。

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=128000, NAME=低品質
playlist.low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=2000000, NAME=標準
playlist.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=5000000, NAME=高品質
playlist.h.m3u8

自動的に最適なビットレートで再生されるようですが、いずれ選択できるようにNAMEをつけて置きました。

具体的にはJavascriptで値を取得し、選択するメニューを表示するやり方になります。

lastupdate : 2019/09/09 11:51:35