Closed15

「nginx + nginx-rtmp-module で RTMP(S) to HLS 配信」を理解する

モチベーション

nginx + nginx-rtmp-module で RTMP(S) to HLS 配信

https://notes.yh1224.com/tech/nginx-rtmp-hls

を理解して、RTMP配信をHLS配信に変換してWeb上から編集制御をしたい

nginxの読み方がよくわからないので一文一文解釈する感じになる

本スクラップのソースコードは上記記事の引用になります。

rtmp {
    server {
        listen 1935;
        chunk_size 4000;

        application app {
            live on;
            record off;
            allow publish all;          # RTMP push 許可
            deny play all;              # RTMP pull 無効

            # HLS 配信用ファイルを保存する
            hls on;
            hls_type event;
            hls_path /var/local/www/hls/;
            hls_fragment 3;
            hls_playlist_length 60;
        }
    }
}

rtmp-moduleのドキュメントはここを参照

https://github.com/arut/nginx-rtmp-module/wiki/Directives
  • server: サーバーインスタンスの宣言
    • サーバーインスタンスとは?
  • listen: IP・ポートを指定する。ポートだけでもok
  • chunk_size: データの分割サイズ、デフォルトは4096
  • application: アプリケーション名
    • HTTPとは異なり、パターン名にすることはできない
  • live: ライブモード(1対多)かどうか
  • record: オンにするとストリームをflvファイルに記録できる

HLS関連のオプションはここにまとまっている

https://github.com/arut/nginx-rtmp-module/wiki/Directives#hls

1935ポートで受け取ったRTMPストリームからHLSファイルを/var/local/www/hls/に保存する、ということっぽい

chunk_sizeを4000にする意図は特に書かれていないから消していいかも

ところで、今のRTMP配信は

https://www.xlsoft.com/jp/blog/blog/2019/11/02/post-7858/

を参考にしてconfファイルが書かれているんだけど、origin_ffmpeg_1でlive_ffmpeg_1に配信を変換しているのもよくわからない

nginxを開いていないときはrtmp://localhost:1935/live_ffmpeg_1/streamが開かれていないと怒られるからnginxはサーバーを建てているんだなみたいな雑な理解をしていたけど、confの意味はよくわからない

試してみたところ、rtmp://localhost:1935/登録していないパスだとIOContextが開けなくて怒られたけど、rtmp://localhost:1935/origin_ffmpeg_1/streamは開けて配信できたから普通に転送してるだけっぽい

HTTP

こっちが全然分からない。以下のドキュメントを参考にしながら調べていく。

http://nginx.org/en/docs/http/ngx_http_core_module.html

https://qiita.com/yuse/items/fe05cec1a331306eac19#sendfileをどうするか決める

クライアントへのレスポンス処理をsendfileシステムコールというAPIを使って行うかどうかで、カーネル側でコンテンツの複写をもつことで、レスポンスの改善をはかる設定。
ただし、動作が不安定になったり、静的ファイルが更新されなかったり、芳しくない評判もある。
デフォルトでは、offになっているので、悩ましければそのままで良いかと。

sendfileはこういうことらしいです。ドキュメント読んでもよく分からなかった(sendfile分からない人はsendfile()が何かわからなくない?)ので調べた。

RTMP, HTTPモジュールの設定だけでRTMP経由で送った配信をtsファイルに変換することはできたんだけど、これをHTTPで配信する方法がわからない

m3u8がどこで生成されてるのかよくわからない

もしやと思ったらStreamKeyを設定していないので.m3u8として隠しファイルになっていた。設定する方法は?

HLSを使って配信することができた。ただ、.m3u8固定になってしまうことと、新しくプレビュー要求を送るとm3u8が上書きされてしまいどんどん動画が長くなってしまうのが問題

exec rm ..;でディレクトリをクリアしてみたが、m3u8にこれまでの.ts情報が残ってしまうのでnginx側の情報をクリアする必要がある。
hls_cleanupがそれを担っていると思っていたけど違うんだろうか

hls_playlist_length 3;
がプレイリストの長さを決めている。なので、3秒未満の動画なら3に設定することで新しいtsファイルが生成されても独立にプレビューすることができそう。
mock-upの場合は、動画の長さの情報を一緒にパスなどを使って渡してあげるのが良さそう

このスクラップは2ヶ月前にクローズされました
作成者以外のコメントは許可されていません