nginx rtmp-module flvファイルをRTMPでオンデマンド配信する

nginx rtmp-module はオンデマンド映像配信できる。
単にファイルをHTML5形式のvideo タグ再生するという意味ではなくmp4,flvをrtmpで配信する事ができる。これができると、セキュリティ的にちょっとだけ向上する。HTML5のvideoタグだと右クリック映像ダウンロードなんて簡単だが、rtmpで配信できれば、通常の方法だとダウンロードできない。(ただ、巷にはrtmpをダウンロードするファイルは出回ってるし、画面キャプチャされちゃえばどんなに頑張ってもデータ化されちゃうけどね。)

んで、いざflvをオンデマンド配信してみたら、

あら、画面が小さい。おかしい。それにseekできない。なんじゃこりゃ。

https://rarut.wordpress.com/page/12/

FLVs recorded with the module are NOT indexed. You can use FLV metadata indexer (like Yamdi: http://yamdi.sourceforge.net/) to index it.

nginx rtmp-module のrecode機能で作成したflvファイルにはindex(metadata)がつかないため、これを再生するとaspect retioもおかしいし、seekingもできない。

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

If you play FLVs recorded with the record directive please do not forget to index them before playing. They are created unindexed.

record機能を使うとunindexedになる。

なので、FLV metadata indexerを利用してindexをつける必要がる。rarutさんが推奨してるのはYamdiで、Yamdiは少ないメモリでも早く動く。大きなファイルを扱う事もできる。このほかにもflvmetaを使ってみたがaspect retioは思い通りになったものの、seekできないファイルが大きくなると扱えないのだと思う。

Screenshot of yamdi.sourceforge.net
w3m https://sourceforge.net/projects/yamdi/files/yamdi/1.9/

yamdi-1.9.tar.gz をダウンロード

tar xzf yamdi-1.9.tar.gz
cd yamdi-1.9
gcc yamdi.c -o yamdi -O2 -Wall

して、できたyamdiを/usr/sbinに入れて、

sudo /usr/sbin/yamdi -i test.flv -o test_meta.flv

としたら、見事seekもできるし、解像度もちゃんと表示できるようになった。

これを録画終了と同時に自動的に行う事ができる。

https://github.com/arut/nginx-rtmp-module/wiki/FAQ

こんな感じで

application multi {
live on;
record all;
record_path /tmp/rec;
exec_record_done yamdi -i $path -o /tmp/rec2/$basename;
allow publish 127.0.0.1;
on_play http://localhost:8080/on_play;
}

大きいファイルになると、
flvtools2もだめだった
flvmetaもだめだった。

ちなみに、Ubuntu 5.4.0-6ubuntu1~16.04.2 でインストールできる

apt-cache show yamdi
Package: yamdi
Priority: extra
Section: universe/utils
Installed-Size: 84
Maintainer: Ubuntu MOTU Developers
Original-Maintainer: Todd Troxell
Architecture: amd64
Version: 1.4-2

では、seekはできるようになったものの、aspect ratioが4:3になってしまい使えなかった。