本ページは広告が含まれています。気になる広告をクリック頂けますと、サーバ運営費になります(^^
Nginx rtmp-module で rtmp配信を行う際に
on_play にてsecure linkを使ってっていると、ffmpegで再エンコする際にも処理が必要になる。
成功例
1.エンコーダから受信する時のセキュリティ
エンコーダから映像を受け取る時は
on_publish http://localhost/publishauth/auth.php;
notify_method get;
を通してストリーム名の中にユーザ名とパスワードが通るようにしている。
2.application live で再生されないようにするためのセキュリティ
allow play 127.0.0.1;
deny play all;
他のクライアントから再生されないようローカルのみ再生可とした
※この2つはセットにする事
3.application multi に渡すときのセキュリティ
allow publish 127.0.0.1;
deny publish all;
他のエンコーダからストリームを受け付けないようローカルから回ってきたものだけを許可
※この2つはセットにする事
4.直リンクを避けるためのsecurelinkを有効にする
on_play http://localhost:8080/on_play;
notify_method get;
securelinkのキーに従って、再生を許可するか判断する
rtmp { server { listen 1935; buflen 30s; publish_notify on; drop_idle_publisher 5s; access_log logs/rtmp_access.log combined; application live { live on; hls on; hls_path /usr/local/nginx/html/live/hls; on_publish http://localhost/publishauth/auth.php; notify_method get; allow play 127.0.0.1; deny play all; exec ffmpeg -i rtmp://localhost/live/$name -c:a copy -c:v copy -preset veryfast -f flv rtmp://localhost/multi/$name -c:a aac -strict -2 -b:a 64k -c:v libx264 -x264opts bitrate=256:vbv-maxrate=256:vbv-bufsize=512 -rtbufsize 100M -bufsize 1024k -preset veryfast -f flv rtmp://localhost/multi/$name_md -c:a aac -strict -2 -b:a 128k -c:v libx264 -x264opts bitrate=512:vbv-maxrate=512:vbv-bufsize=1024 -rtbufsize 100M -bufsize 2048k -preset veryfast -f flv rtmp://localhost/multi/$name_hi 2>>/tmp/log; hls_type live; } application multi { live on; allow publish 127.0.0.1; on_play http://localhost:8080/on_play; notify_method get; } } }
○ダメな例
ダメダメ1
以下の設定だと、application multi に行かない。exec ffmpeg -i rtmp://localhost/live/$nameもon_playを通るようで、on_play側で認証を通すようにしなきゃいけない
rtmp { server { listen 1935; buflen 30s; publish_notify on; drop_idle_publisher 5s; access_log logs/rtmp_access.log combined; application live { live on; hls on; hls_path /usr/local/nginx/html/live/hls; on_publish http://localhost/publishauth/auth.php; on_play http://localhost:8080/on_play; notify_method get; exec ffmpeg -i rtmp://localhost/live/$name -c:a aac -strict -2 -b:a 64k -c:v libx264 -x264opts bitrate=256:vbv-maxrate=256:vbv-bufsize=512 -rtbufsize 100M -bufsize 1024k -preset veryfast -f flv rtmp://localhost/multi/$name_md -c:a aac -strict -2 -b:a 128k -c:v libx264 -x264opts bitrate=512:vbv-maxrate=512:vbv-bufsize=1024 -rtbufsize 100M -bufsize 2048k -preset veryfast -f flv rtmp://localhost/multi/$name_hi 2>>/tmp/log; hls_type live; } application multi { live on; } } }
ダメダメ2
ローカルからのエンコは許可を書いてみた。
on_playで回ってくるときは全部127.0.0.1で来るらしくすべて許可になってしまう。
server { listen 8080; server_name localhost; location /on_play { # set connection secure link secure_link $arg_st,$arg_e; secure_link_md5 mysecretkey$arg_app/$arg_name$arg_e; #access from local ffmpeg 許可する if ($remote_addr = "127.0.0.1") { return 200; } # bad hash if ($secure_link = "") { return 501; } # link expired if ($secure_link = "0") { return 502; } return 200; } }
ダメダメ3
ffmpeg -i がダメならpush ならいいだろうと思ったら甘かった。pushしてもon_playを通るらしい。
rtmp { server { listen 1935; buflen 30s; publish_notify on; drop_idle_publisher 5s; access_log logs/rtmp_access.log combined; application live { live on; hls on; hls_path /usr/local/nginx/html/live/hls; on_publish http://localhost/publishauth/auth.php; on_play http://localhost:8080/on_play; notify_method get; push rtmp://localhost/live/$name -c:a aac -strict -2 -b:a 64k -c:v libx264 -x264opts bitrate=256:vbv-maxrate=256:vbv-bufsize=512 -rtbufsize 100M -bufsize 1024k -preset veryfast -f flv rtmp://localhost/multi/$name_md -c:a aac -strict -2 -b:a 128k -c:v libx264 -x264opts bitrate=512:vbv-maxrate=512:vbv-bufsize=1024 -rtbufsize 100M -bufsize 2048k -preset veryfast -f flv rtmp://localhost/multi/$name_hi 2>>/tmp/log; hls_type live; } application multi { live on; } } }