続 Ustream の放送を録画する

以前書いたUstream の放送を録画するでは rtmp サーバから配信される動画を rtmpdump でダンプすることで保存していました。

仕様が変わり、 rtmp を使用しない番組も多くなったみたいです(使用するものもあり、配信者側の設定の問題なのかいまいち不明)。

今回は iPhone 用(モバイル端末全般用?)の配信データを取得したいと思います。そのため画質等も多少低いものとなっています。

基本的な考え方

ffmpeg を用いる方法が書かれています。

しかし私の環境ではうまく取得できない時間帯があったり、ぶつぶつと数秒程度抜け落ちた状態だったりと安定していませんでした。

そこで

http://iphone-streaming.ustream.tv/uhls/#{cid}/streams/live/iphone/playlist.m3u8

をまず取得します。これは配信中であれば存在しますが、配信終了後はファイルは存在しないファイルです。



このファイルの中身は

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=617600,CODECS="avc1.77.13, mp4a.40.2",RESOLUTION=320x240
http://iphone-streaming.ustream.tv/watch/playlist.m3u8?cid=#{cid}&stream=live_3&appType=103&appVersion=3&conn=wifi&group=iphone

のようになっています。

今度はこのファイルを取得して中身を見てみます。

#EXTM3U
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:898
#EXTINF:7,
http://uhs-akamai.ustream.tv/sjc/nrt-uhls13/#{cid}-improved/live_3/chunk_898_59991_1395384407.ts
#EXTINF:7,
http://uhs-akamai.ustream.tv/sjc/nrt-uhls13/#{cid}-improved/live_3/chunk_899_14949_1395384414.ts
#EXTINF:7,
http://uhs-akamai.ustream.tv/sjc/nrt-uhls13/#{cid}-improved/live_3/chunk_900_71676_1395384422.ts

すると Transport Stream(TS) の形式で、いくつものチャンクに分割されたファイルの場所が書かれています。
TS は地デジなどでも使われており、通信途中でデータ欠損があっても検知できるように情報が付加された形式だそうで。

ファイル名は3つの数値で形成されており、1つ目はインデックス。2つ目は謎ですが、3つ目は時刻(unix time)のようです。

あとは playlist.m3u8 を数秒ごとに巡回し、記載されているチャンクを取得し続ければよいのです(遅れるとすぐに削除されます)。

TS ファイルの連結

取得した TS ファイルを ffmpeg で連結します。

$ ffmpeg -i "concat:chunk_100_xxxxx_xxxxxxxxxx.ts|chunk_101_xxxxx_xxxxxxxxxx.ts|chunk_102_xxxxx_xxxxxxxxxx.ts" -c copy -bsf:a aac_adtstoasc output.mp4

(削除済みだったりで)取得漏れしたチャンクがあればそこで分割したり、先頭のファイルの unix time をもとに出力ファイルに時刻を付加するようにもして。



とりあえずチャンク取得は wget を使った簡易なもので、いくつか取得ミスがみられますが、私の環境では現状にくらべてはるかに安定したファイルが得られましたので満足。