nginx rtmp-moduleで長時間配信を目指す

うううむぅ。
一度キーフレームのタイミング調整で解決したと思っていた長時間配信。最近はやはり切断する。切断時間はまちまち。3時間で切れる時もあるし、6〜9時間って事もある。インターネットだから仕方ないのか?と思うけど、さくらのクラウド、クラウドn、youtubeそれぞれ別々の時間にストリーミングが停止する。つまり、こちらの回線には問題がないのかと思える。厄介なのは、それぞれのサーバにpingを打ち続けていると、特にロスしない。Packetロスがない状態。じゃなんで切れちゃうのってなる。ログ上では、送出側は、クライアントが切断って出るし、受信側は、パケットが来ないから切断ってなる。はぁ。

エンコーダ|⇒LAN⇒|nginx rtmp1| ⇒Internet⇒ |nginx rtmp2| ⇒|クライアント

という構成で、Pushで試験する。
注視しているのはrtmp1サーバ。切断されるか?

rtmp1はエンコーダからのデータを3つのサーバへpushするだけ
rtmp {
server {
listen 1935;

access_log logs/rtmp_access.log;

application live {
live on;
push rtmp://sakura.hoge.jp/live/test?user=live&pass=********;
push rtmp://video. hoge.jp/live/test?user=live&pass=********;
push rtmp://a.rtmp.youtube.com/live2/********;
}
}
}

rtmp2サーバは以下2つ
さくらのクラウドvmで、chunk_size最小128を設定
rtmp {
server {
listen 1935;
chunk_size 128;
buflen 30s;
drop_idle_publisher 5s;
publish_notify on;
notify_method get;

access_log logs/rtmp_access.log combined;

application live {
live on;
}
}

Cloudnでは、ack_windowを小さくしてみる。デフォルト5000000のところ1/1000に設定。
rtmp {
server {
listen 1935;
buflen 30s;
publish_notify on;
drop_idle_publisher 5s;
ack_window 5000;

access_log logs/rtmp_access.log combined;

application live {
live on;
on_publish http://localhost/publishauth/auth.php;
notify_method get;

on_play http://localhost:8080/on_play;
}
}

エンコーダ設定
ビットレート512kbps
キーフレーム2秒間隔
640×360
FPS20

結果 24時間試験
youtube 3回切断
sakura 6回切断 chunk_sizeの変更は悪影響を及ぼすか、変化なし
Cloudn 3回切断 ack_window の変更は多少効果あるのか?

root@StreamRouter:/usr/local/nginx/logs# egrep ‘disconnect’ error.log
2017/01/18 12:23:12 [info] 2023#0: *2 disconnect, client: sakura.hoge.jp/live/test?user=live&pass=*********, server: ngx-relay
2017/01/18 12:23:12 [debug] 2023#0: *2 relay: play disconnect app=’live’ name=’test’
2017/01/18 12:23:12 [debug] 2023#0: *2 relay: play left after disconnect app=’live’ name=’test’: 2
2017/01/18 14:10:02 [info] 2023#0: *4 disconnect, client: a.rtmp.youtube.com/live2/********, server: ngx-relay
2017/01/18 14:10:02 [debug] 2023#0: *4 relay: play disconnect app=’live2′ name=’test’
2017/01/18 14:10:02 [debug] 2023#0: *4 relay: play left after disconnect app=’live2′ name=’test’: 2
2017/01/18 14:59:10 [info] 2023#0: *5 disconnect, client: sakura.hoge.jp/live/test?user=live&pass=*********, server: ngx-relay
2017/01/18 14:59:10 [debug] 2023#0: *5 relay: play disconnect app=’live’ name=’test’
2017/01/18 14:59:10 [debug] 2023#0: *5 relay: play left after disconnect app=’live’ name=’test’: 2
2017/01/18 15:00:13 [info] 2023#0: *7 disconnect, client: sakura.hoge.jp/live/test?user=live&pass=*********, server: ngx-relay
2017/01/18 15:00:13 [debug] 2023#0: *7 relay: play disconnect app=’live’ name=’test’
2017/01/18 15:00:13 [debug] 2023#0: *7 relay: play left after disconnect app=’live’ name=’test’: 2
2017/01/18 15:45:49 [info] 2023#0: *3 disconnect, client: video.hoge.jp/live/test?user=live&pass=*********, server: ngx-relay
2017/01/18 15:45:49 [debug] 2023#0: *3 relay: play disconnect app=’live’ name=’test’
2017/01/18 15:45:49 [debug] 2023#0: *3 relay: play left after disconnect app=’live’ name=’test’: 2
2017/01/18 16:21:29 [info] 2023#0: *9 disconnect, client: video.hoge.jp/live/test?user=live&pass=*********, server: ngx-relay
2017/01/18 16:21:29 [debug] 2023#0: *9 relay: play disconnect app=’live’ name=’test’
2017/01/18 16:21:29 [debug] 2023#0: *9 relay: play left after disconnect app=’live’ name=’test’: 2
2017/01/18 19:49:52 [info] 2023#0: *8 disconnect, client: sakura.hoge.jp/live/test?user=live&pass=*********, server: ngx-relay
2017/01/18 19:49:52 [debug] 2023#0: *8 relay: play disconnect app=’live’ name=’test’
2017/01/18 19:49:52 [debug] 2023#0: *8 relay: play left after disconnect app=’live’ name=’test’: 2
2017/01/18 22:30:38 [info] 2023#0: *11 disconnect, client: sakura.hoge.jp/live/test?user=live&pass=*********, server: ngx-relay
2017/01/18 22:30:38 [debug] 2023#0: *11 relay: play disconnect app=’live’ name=’test’
2017/01/18 22:30:38 [debug] 2023#0: *11 relay: play left after disconnect app=’live’ name=’test’: 2
2017/01/19 00:18:10 [info] 2023#0: *6 disconnect, client: a.rtmp.youtube.com/live2/********, server: ngx-relay
2017/01/19 00:18:10 [debug] 2023#0: *6 relay: play disconnect app=’live2′ name=’test’
2017/01/19 00:18:10 [debug] 2023#0: *6 relay: play left after disconnect app=’live2′ name=’test’: 2
2017/01/19 01:45:04 [info] 2023#0: *13 disconnect, client: a.rtmp.youtube.com/live2/********, server: ngx-relay
2017/01/19 01:45:04 [debug] 2023#0: *13 relay: play disconnect app=’live2′ name=’test’
2017/01/19 01:45:04 [debug] 2023#0: *13 relay: play left after disconnect app=’live2′ name=’test’: 2
2017/01/19 05:56:16 [info] 2023#0: *10 disconnect, client: video.hoge.jp/live/test?user=live&pass=*********, server: ngx-relay
2017/01/19 05:56:16 [debug] 2023#0: *10 relay: play disconnect app=’live’ name=’test’
2017/01/19 05:56:16 [debug] 2023#0: *10 relay: play left after disconnect app=’live’ name=’test’: 2
2017/01/19 06:04:29 [info] 2023#0: *12 disconnect, client: sakura.hoge.jp/live/test?user=live&pass=*********, server: ngx-relay
2017/01/19 06:04:29 [debug] 2023#0: *12 relay: play disconnect app=’live’ name=’test’
2017/01/19 06:04:29 [debug] 2023#0: *12 relay: play left after disconnect app=’live’ name=’test’: 2