情報セキュリティワークショップ in 越後湯沢のRTMPローカル配信について

今回ローカル配信にあたって、以下の環境を構築した

物理図

論理図


環境説明

  • LiveShell(無印)にビデオカメラ(HDMI)を接続しMacMiniにローカル配信
    • LiveShellはH.263での配信なので要注意
  • HLS(HTTP Live Streaming)
    • iPad用にHLSもテストで配信
    • nginx+rtmpのHLSモジュールは、H.264しか受けられないので、ffmpegでcodec変換を実施
    • 結局遅延が激しく(数分遅れ)使い物にはならなかった
  • ローカル配信サーバ
  • Mac Miniにnginx+rtmpを入れることで、LiveShellのRTMPを受ける
  • パソコンは、FlowPlayerを使ってRTMPFlashで再生

設定

nginx.conf

#user  nobody;
worker_processes  1;

error_log  logs/error.log  debug;

pid        logs/nginx.pid;


events {
    worker_connections  2048;
}

http {
        #access_log off;
        include mime.types;
        default_type application/octet-stream;
        sendfile on;
        keepalive_timeout 65;

        server {
                listen 80;

                location / {
                        root html;
                        autoindex on;
                        index index.html index.htm;
                }
                location /hls {
                        root live;
                        autoindex on;
                        index index.html index.htm;
                        add_header Cache-Control no-cache;
                        types {
                                application/vnd.apple.mpegurl m3u8;
                                video/mp2t ts;
                        }
                }
        }
}

rtmp {
        server {
                listen 1935;
                access_log logs/rtmp_access.log;

                ping 30s;
                #ping_timeout 10s;
                #chunk_size 8192;
                #max_streams 10;
                #drop_idle_publisher 15s;

                application live {
                        live on;

                        wait_video on;
                        #wait_key on;
                        meta copy;
                        #idle_streams off;
                        #publish_notify on;
                        #play_restart on;
                        #record all;

                        allow publish 127.0.0.1;
                        allow publish 192.168.0.0/16;
                        allow publish 172.16.0.0/12;
                        allow publish 10.0.0.0/8;

                        deny publish all;

                        allow play 127.0.0.1;
                        allow play 192.168.0.0/16;
                        allow play 172.16.0.0/12;
                        allow play 10.0.0.0/8;

                        deny play all;

                        #HLS配信のためのcodec変換用
                        exec /usr/local/sbin/ffmpeg -re -i rtmp://localhost/live/yuzawaws -vcodec libx264 -acodec libmp3lame -f flv rtmp://localhost/hls/live ;

                }
                application hls {
                        live on;
                        hls on;
                        hls_path /usr/local/live/hls;
                        hls_continuous on;
                        hls_playlist_length 30s;
                        hls_fragment 5s;
                }
        }
}

ffmpegの説明

exec /usr/local/sbin/ffmpeg -re # インプットからそのまま読み込む
-i rtmp://localhost/live/yuzawaws # LiveShellから配信しているRTMPを読み込み
-vcodec libx264 #HLS送付先のcodecに変換(映像)
-acodec libmp3lame #同様に音声のcodec
-f flv #入力のフォーマット(LiveShellはFLV)
rtmp://localhost/hls/live ; #HLS配信用RTMPサービスに出力

今回、HLSファイル保存用にtmpfs(メモリファイルシステムを準備)

以下のスクリプトを起動時に実行するように設定
tmpfs.sh

#!/bin/sh
mkdir -p /tmp/mnt/
hdid -nomount ram://4096000
newfs_hfs -v "tmpdisk1" /dev/disk1
sleep 10
mount -t hfs /dev/disk1 /tmp/mnt/
mkdir -p /tmp/mnt/live

/usr/local/sbin/nginx -c /usr/local/conf/nginx.conf

nginx+nginx-rtmp-moduleは手作業でコンパイル AppStoreでXcodeをインストールしコンパイラの設定等を実施

nginx version: nginx/1.7.6
NGINX_RTMP_VERSION "1.1.4"

    • -

nginx version: nginx/1.7.6
built by clang 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
TLS SNI support enabled
configure arguments: --prefix=/usr/local --with-cc-opt=-Wno-deprecated-declarations --with-http_ssl_module --with-pcre=../pcre-8.36 --with-http_ssl_module --add-module=../nginx-rtmp-module-master

HTML

netagent-no-Mac-mini:html root# cat index.html
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="flowplayer-3.2.13.min.js"></script>
<title>情報セキュリティワークショップ越後湯沢ダダ漏れ君</title>
</head>
<body>
<CENTER><H2>情報セキュリティワークショップ越後湯沢ダダ漏れ君</H2>
このサービスは、主にスタッフを対象に配信しているローカル配信サービスです。<BR>
外部へは配信しておりません。<BR>
</CENTER>
<div id="player" style="margin:0 auto;text-align:center">
<img src="clip.jpg"/>
</a>
<script>
$f("player", "flowplayer-3.2.18.swf", {
        clip: {
                live: true,
                url: 'yuzawaws',
                provider: 'rtmp'
        },
        plugins: {
          rtmp: {
                url: "flowplayer.rtmp-3.2.13.swf",
                netConnectionUrl: 'rtmp://192.168.0.100/live/'
          }
        }
});
</script>
<A HREF="http://192.168.0.100/hls/live.m3u8">iOSデバイスはこちら</A>
</body>
</html>

Mac Miniの環境(Mac Mini Late 2012)

Hardware:
Hardware Overview:
Model Name: Mac mini
Model Identifier: Macmini6,1
Processor Name: Intel Core i5
Processor Speed: 2.5 GHz
Number of Processors: 1
Total Number of Cores: 2
L2 Cache (per Core): 256 KB
L3 Cache: 3 MB
Memory: 16 GB
Boot ROM Version: MM61.0106.B03
SMC Version (system): 2.7f1

ProductName: Mac OS X
ProductVersion: 10.9.5
BuildVersion: 13F34

今回は5台程度のPCで閲覧したが全く問題なし。

KEEP

  • LiveShellとローカル配信サーバで問題なく動作

Probrem

  • 画質が悪いと指摘される(480pであり、カメラの解像度も悪かった)
  • 初日に音声が全くでなくなった(ホワイトノイズっぽい音声)
    結局は、LiveShellの暴走で再起動することで復旧(この追求に4時間・・・)
  • iPadで閲覧しようとしたが、会場Wi-Fi環境の為、閲覧ができなかった

Try

  • もっと早いiPadでも見れる環境を構築(LiveShell Proにすれば、H.264配信なのでHLS変換が早くなる)
  • カメラをもっと良いものにw

APPLE Mac mini/ 2.5GHz Dual Core i5 /4G/500G/USB3/Thunderbolt MD387J/A

APPLE Mac mini/ 2.5GHz Dual Core i5 /4G/500G/USB3/Thunderbolt MD387J/A