rtmp配信 on_play でセキュリティをかけ、さらにffmpeg – i で再エンコしたい時の認証について

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;
}

}
}