2012年12月20日木曜日

rtmp -> iphoneにストリームを流すでの由無し言。

iPhoneのリアルタイムストリーミングに興味があるし、会社でもやっている僕ですが・・・
Flashが生成するrtmpのストリームはコンバートしようとすると、いろいろとやっかいな事象があります。
で、いくつか書きなぐっておきます。

まずrtmp(flv)の問題点
1:timestampが0から始まるとは限らない。
過去の記事にも書きましたが、Flazrでダウンロードするデータを確認してみると、timestampが0から始まらないことがあります。
timestampが1秒後とかからはじまるならいざ知らず。
たまにtimestampが負の数のときもあります。

負の数の場合、ffmpegに通すと、どうやら4時間時間ちょいの値になるみたいですね。
特に次の前後がいれかわるのと組合わさると最悪です。

2:timestampの順にデータがくるとは限らない。
これは、現在作成しているgithubのプログラムでおもいっきり利用しています。
特に音声と映像のデータが入れ替わることがあります。
それでもちゃんと成立して動作してくれるところがFlashのすごいところなんですが・・・
いじろうとするとこまったことになります。
去年だかにつくった、HttpTakStreamingの始めにつくったバージョンでも内部のバグになっていました。セグメントごとに区切っている切れ目のところで、timestampが入れ子になっていると、動作がおかしくなってました。特にその中途のセグメントから再生する場合(途中から視聴開始した場合)大きな問題になってました。

ちなみに1と2が組み合わさってパケットデータが0映像 -3音声 -1音声 1音声 2映像 2
音声 3音声
みたいな順にデータがならんでいるとffmpegの解釈が
0映像 16777213音声という風に解釈してしまうみたいです。
たとえば-3のタイムスタンプの場合HexにするとFF FF FDになってしまうので、16777213というタイムスタンプとなってしまう。
中途のパケットがないので、コンバートがおかしくなる
という事態に陥ってしまうみたいです。

3:中途でデータが欠如することが許可されている。
rtmpの仕様上、中途で音声や映像データが送られなくなったとしても成立します。

4:扱っているコーデックがffmpegで変換できるとは限らない。
G.711やハードウェア依存の音声コーデックもflvに定義されているのですが、こういうデータが流れてきた場合はコンバートうまくできないみたいです。

5:timestampと映像のデータの長さが一致していなくてもいいっぽい。
現在httpTakStreamingのデモで再生してもらうとわかるかとおもいますが、再生していると特に途切れているわけではないのにデータがたまっていきます。
これは映像データと再生時間が一致せず、微妙に再生速度の方がはやいためです。
rtmpで視聴しても同じようにずれていきます。

rtmpは、だいたいどんなPCでも簡単に使えるし、red5とかもあるし導入も手軽にできるし、flvをベースにしているのでフォーマットもわかりやすいんですが・・・
その分自由度が大きいというか、変な形でも再生できちゃうというか・・・というところが問題ですね。

で、これをffmpegでmpegtsにするわけです。
ffmpegの変換について
1:メディアデータが欠損していると、変換が止まる。
これこまります。flvの3で記述したとおり、rtmpの仕様上メディアデータが欠損することがありえます。
AaBbCcDdEeFf...(大文字は映像、小文字は音声の要素とします。)
こんな風に音声と映像がきれいにそろっていると普通に変換ができますが
AaBCDdEeFf...みたいに中途で音声が途切れているデータをffmpegで変換すると

asyncがない場合
AaB     dCeDfEgFhみたいな感じで音声と映像の同期がこわれます。
この場合dの音声がくるまでコンバートがとまった上に、その後データがずれます。
コンバートは遅れたままになり、実際のライブにおいつくことはありません。

asyncをいれると
AaB     CDdEeFfとCのあとの欠損している音声のかわりに無音を挿入してくれるのでずれはないのですが、やはりコンバートがとまってしまいます。
この場合、コンバートはすごい勢いで実行されライブに追いつきます。
ただし、iPhoneとかで視聴していると再生にかかる時間が短くなるわけではないので、追いつきません。(シークとかすれば話は別ですが・・・)
遅延なしにやろうとすれば、ここをどうするかが重要です。
そこでxuggleをつかった自力の変換処理がでてくるわけですが・・・

2:音声や映像トラックがあるかの指定について
flvのヘッダ部分の13バイトの5バイト目
1と4の組み合わせで音声のみ、映像のみ、音声 + 映像等の指定ができます。
この指定ですが、単にflashで再生するだけの場合は適当に(いっそのこととりあえず5の両方ありに)しておけば動作するのですが、プレーヤーによっては、設定があわないとエラーになります。
ffmpegのエラーになる派のプログラムなので、そのあたりきちんとしておかないと、コンバートがなかなか始まらない等の問題がでることがあります。

3:mediaSequenceHeaderについて
flvでコーデックがavc(h.264のこと)もしくはaacの場合は、mediaSequenceHeaderというものがあります。flvの再生にも必要なデータなんですが、ffmpegもやっぱりこのデータがないと、コンバートはじめてくれません。
一応mediaSequenceHeaderが先頭になくても、それまでのデータをすてて動作してくれるんですが、再生までに時間がかかってしまいます。

4:リアルタイムのコンバート負荷について
通常のffmpegはコンバートを実行するために、CPUをフルに使うわけですが、設定によっては、実際の再生時間より短い時間でコンバートが完了します。
で、リアルタイムデータのコンバート実行時には、データは再生時間どおりに入ってきます。
なのでCPUをフルに使わないコンバートになります。
また、よりお行儀のよいFLVデータとしてinputデータを送ってやると余計な処理がはしらず(音声データ欠損待ちの時間のメモリー保持データとか、timestampの順番が狂っているときに再ソートし直す処理とか)、負荷が減ってきます。
また、詰まったりしなくなるし、そのことによる負荷のムラも減ります。

ただし逆に負荷をかけすぎると、再生時間内にコンバートができなくなってしまいますので、空きがあるんだからと複数のチャンネルをいっきにコンバートしはじめると、出力データがどんどん遅れていくという弊害もあります。

で、できたデータをiPhoneで再生できるように、分割だのするわけですが・・・
iOSでの再生の話。
1:シークができてしまう件について
iOS上で動画再生をしているとライブにもかかわらず、シークができるようになることがあります。
これは仕様上、m3u8に記述しているデータが4つ以上になっているとシークができるようになってしまいます。

2:リアルタイム性について
セグメントという分割したデータを読み込ませて、順次再生していくという形なのでどうがんばってもある程度遅れてしまいます。
で、どの程度おくれるか・・・という話なのですが
 rtmpの転送にかかる時間(1秒以下)
 mpegtsに変換するのにかかる時間(最小で約2秒)
 セグメントができるだけのデータがたまるまでの時間(設定次第)
 デバイスまで転送するのにかかる時間(1秒以下)

 再生に必要な分デバイスにデータがたまるまでかかる時間(*)
これだけ遅延が発生します。
ここをどうするかが腕のみせどころですね。
個人的には、映像を自分で準備するならチューニング次第でセグメントを1秒程度にすることも可能みたいです。一般的なrtmpを変換するなら、2、3秒とった方がよさそうです。
よって上下の転送で1秒、変換に2秒、セグメントデータと必要なデータ量を3つ分とすると必要なデータ取得で6秒から9秒かかることになるので、9秒から12秒遅延するとみつもることができます。セグメントを1秒にした場合は5、6秒といったところです。

1つ注意があって、セグメントがあまりに小さい場合、(*)のついている部分の必要なデータがセグメント3つで間に合わなくなることがあります。
この場合、シーク禁止するためにm3u8に記述するデータを3つに制限してしまうと、うまく再生できなくなってしまうことがあるので、要注意です。

3:音声のみのデータについて
以前つくったjsegmenterにいれてありますが、m3u8のデータでは、mpegtsだけではなくmp3のデータも扱えるみたいです。
もちろん、音声のみのmpegtsをつくってやることも可能です。
ただ両者には挙動の違いがあります。
mpegtsの音声のみバージョンの場合はaacやmp3が対応できます。
ただし、映像と同じくsafariを閉じて別のアプリに移動すると再生が中断します。
BGMとして再び再生すると動作はしますが、アプリをかえたりするととまってしまいます。
mp3をベースにm3u8を作成すると、通常のmp3と同じく、別のアプリに切り替えてもBGMがとまらずに移動できます。
また、audioタグをつかって再生する形にしておくと、音楽をかけたまま別のタブに移動したりできます。便利です。

4:いろんなブラウザでの挙動。
このm3u8ですが、phpやrubyとかで吐いてやるようにすると便利です。
ですが、拡張子が違うと、各ブラウザによってちょっとずつ挙動が違うみたいです。
できたら、content-typeの出力だけでなくhtaccessとかで拡張子もそろえてやった方が吉です。
また内部のtsファイルへのアクセスは相対パスでもかけますが、できれば絶対パスで書く方がいいです。
とりあえず手持ちには、safari、chrome、operamini、あとairでつくるアプリもあるんですが
safari(どっちもOK)、chrome(iphoneならどっちもOK)、operamini(どっちもOK)、air(m3u8拡張子でやるべき)
こんな感じです。
とりあえず面白いのが、chromeの映像高速再生バグとoperaminiの挙動ですね。
chromeの高速再生バグはiphone4Sでしか確認していないのですが、videoタグのあるページのあるchromeに別のアプリからもどってくると、videoタグの中身の映像がなぜか早送りで再生されるというもの。
おもしろいので、そのうち録画してyoutubeにでもあげようと思います。
safariでもよくわからないですが、同じようなバグがでるときがあります。

operaminiの場合、m3u8へのアクセス用のよくわからない中継サーバーをsafariで再生するみたいな挙動します。
この場合、内部のtsデータを相対パスで書いておくと、中継サーバー内のデータにアクセスすることになるので、動作しなくなります。

なお、vlcのコマンドライン版 cvlcをつかうとffmpegではなくvlcをつかってこのhttpLiveStreamingを生成したりできるし、iOS5以降の端末の場合、m3u8のduration指定に小数をつかえるようになったり、1つのmpegtsファイルの部分を指定することでm3u8をつくることができたりと、いろいろネタはあります。

2012年12月11日火曜日

red5のアプリにhttpTakStreamingの動作をいれてみましたが・・・

red5を利用して、rtmpベースのTakStreamingをつくりました。
んで、そのあとhttpベースのTakStreamingもつくってみたのですが・・・

どうも、httpベースの方の動作が芳しくないです。

原因は簡単。
red5では内部にtomcat6がはいっているのですが、このtomcat6。
静的コンテンツはデフォルトで5秒のcacheが効くみたいです。

1秒ごとという単位でflfファイルが更新されていくのに、cacheが効いてしまって変更の適応が遅くなるのが問題だという・・・

で、対処方法ですが、いまのところ2つしか見つかっていません。
1:webapps/tak/WEB-INF/red5-web.xml
こっちで設定しているdurationの値を5秒くらいにする。
セグメントのdurationを大きくしてしまうと遅延が酷くなっていきますが、まぁ動作します。
だいたい5秒〜10秒くらい遅延する感じになりますね。

2:conf/context.xmlにcacheTTL=1をいれる。

<!-- The contents of this file will be loaded for each web application -->
<Context cacheTTL="1">

    <!-- Default set of monitored resources -->

    <WatchedResource>
Contextの属性にcacheTTLをいれれば値を変更することができます。
1秒ごとに内容がかわるようにすれば、とりあえずduration=1でも動作できるようになります。

ただし、webアプリケーションのwarファイルを提供しておしまいとするにはちょっと問題があります。なにせサーバーの設定を変更しなければいけないという・・・

あとは、やっていませんが、flfファイル出力をservletの動的出力にしちゃうとかですかね・・・
いい方法ないもんですねぇ・・・

一応red5のフォーラムでどうにかなんない?って尋ねてみましたが、どうなることやら・・・

2012年12月9日日曜日

red5用のtakStream実装つくりました。

rtmp実装が作りたかったので、red5用のアプリケーション実装を書きました。

https://github.com/taktod/TakStreaming2/tree/red5Code
この中の
tak/ディレクトリの内容をそのままred5のwebappsの中にいれればそれでOKです。

あとはpublisherあたりで適当に放送を開始します。

そして、専用プレーヤーでrtmp://localhost/takにアクセス
放送名をscopeで実行します。

こんな感じにrtmpのストリームが再生されます。

まぁ、rtmpで流しているデータを使うなら、普通にrtmpをつかえばいいんですけどね。
わざわざTakStreamに変更する必要はないか?

red5バージョンはあまり積極的に更新するつもりはないのですが、以下の様な可能性があります。
・servletによるhttpTakStreaming対応。
・servletによるタイムシフト機能。
・rtmfpとの連携。
・チャンク出力をやめることで、よりリアルタイムな動作。

このあたりでしょうかね。

あとついでにブログ用のプレーヤーもつくってみました。
こんな感じで動作します。
一応rtmpTakStreamも対応してますが、デフォルトはhttpTakStreamにしてあります。



ではでは〜

2012年12月8日土曜日

プログラムをgithubに公開しました。

前回作成した、httpTakStreamのプログラム

http://49.212.39.17/player/TakStreamingPlayer.html
このデモのやつ
サーバー側のプログラムも含めてgithubに登録しました。
https://github.com/taktod/TakStreaming2

javaのプログラムはmasterにflashのプログラムはflashCodeのブランチにいれてあります。

自分としては、いろんな人に再生プレーヤーをつくってもらって広まればうれしいので、再生プレーヤーの作成はめちゃくちゃ簡単にできるようにと考えてつくりました。

netStreamとvideoは
var netStream:NetStream = TakStreamingFactory.getStream("アドレス");

var video:Video = TakStreamingFactory.getVideo();
で取得可能。あとは、netStream.play(null);
で適当に再生すればはじまりますので簡単にできたと思っています。

あとは、rtmpやrtmfp対応をつくって、データが取得できなくなったときにシームレスに他のプロトコルに切り替える動作をつくる。
Flvから直接takStreamをつくる動作をつくる。
red5用のアプリケーションをつくって、パッケージ化する。

あたりやりたいですね。

2012年12月6日木曜日

httpTakStreaming再び

iOS用にhttpLiveStreamingというのがあります。

ファイルをセグメントという小さな単位にわけ、それぞれを必要なときにダウンロードして再生させるという動作。
httpでコントロールできるので、非常に使い勝手のよいストリーミングです。

で、そのFlashバージョンにhttpDynamicStreamingというのがあるのですが、少々扱いにくいです。というのもファイルそのものが取り出しにくいというのと、live用のモジュールはタダではつかえないという。

というわけで、自分であらたなセグメントストリームを作ってみました。

こんな感じにファイルをダウンロードしまくります。

以前も一度つくったことがあるんですが、今回はrtmfpやrtmpも視野にいれて開発しています。
rtmfpあたりで安定動作させることができれば、サーバー代や回線代も削減できますからね。

デモはこちら
http://49.212.39.17/player/TakStreamingPlayer.html

仕様上、なにか放送していないと意味がないので、とりあえずlongplays.orgにあったT-0815さんのr-type finalの動画をflazrでループpublishさせてあります。


いまのところ問題かと思っていることは・・・
1:再生が微妙に遅くなる。bufferLengthの項目が微妙にたまっていきます。
2:まれにnetStreamが蒸発する。
3:aac音声の場合音声が再生されない場合がある?

といったところですね。
他にも気になったところとかありましたら、コメントなり、twitterなりで連絡いただけるとうれしいです。

ちなみにrtmfpで通信がおいつくのか?という部分に関してですが、以前のバージョンのhttpTakStreamingのパケットをrtmfpのnetGroupとnetStreamでやり取りさせたことがあるのですが、netGroupでの共有だと間に合いませんでしたが、netStreamなら問題なく動作できました。可能性はまだありますね。

2012年11月25日日曜日

red5コンパクトにしてみようか・・・

red5の1.0.0RC2をダウンロードした・・・
42Mもありますね。サイズでかすぎる。こんなにいらないよ。
というわけでコンパクトにしてみようと思います。
正直必要のないライブラリが入りすぎてると思うんですよね。

というわけで、スリム化させてみたいと思います。
目標
・サイズをちっちゃくする。
・最低配信と視聴はできるようにして、独自アプリケーションも動作するようにする。
・jrubyだのgroovyだのといったいらないライブラリは削除
・rtmp以外のプロトコルもいらないので削除
・デフォルトアプリケーションもいらないものはどんどん削除
・tomcatの動作もいらないので削除

といったところでしょうか。

やったこと1:
tar.gzバージョンをダウンロードして、解凍。
red5.shを起動して動作確認。
→当然OK

やったこと2:
いらないアプリケーション削除
とりあえずliveだけあればよし。
vodとinstallerは削除した。

やったこと3:
docいらね。
削除したら71M→41Mになった。

やったこと4:
red5-highperf
red5-debug
red5-shutdown
はいらないので削除

やったこと5:
Makefile削除build.xmlも削除
makeを実行すると、/usr/lib/red5にインストールするらしい。ちょっと・・・

やったこと6:
webapps/root/の中のhtmlファイル特にdemosを削除
demos/publisher.htmlは便利ですが・・・とりあえず容量を削減したいので、削除
41M→38Mになった。

やったこと7:
conf/red5-core.xmlからrtmp以外の設定を排除

やったこと8:
jrubyとjythonのライブラリを削除
27Mまで落ちた。

やったこと9:
tar.gzに圧縮した
24Mになった。

というわけで24Mまで削減してみた。
http://49.212.39.17/red5-1.0.0-min1.tar.gz

うーん。普通の人に配布するなら、やっぱきついな。

2012年11月23日金曜日

Flazrの配信をいじってみたいと思う。

では、実際に改造していくことにします。

とりあえず、ReadableByteChannelをつかってSystem.inのデータを取得していくというプログラムをつくるのだが、はじめからSystem.inをつかっているとデバッグがしにくいのでとりあえず、FileChannel経由でファイルのデータを取得するプログラムをつくることにします。

もともと、ファイルの時間を指定してデータを抜き出すことができなくなるので心配していたFlvLiveReader.next()の動作も、LInkedBlockingQueue.take()をつかってデータが到達するまで処理を止めることにしました。

https://github.com/taktod/stdinFlazr/commit/a429295bbaf0b01c8f0e1aeeb659849f93989a5c
で、できたのがこちらのコード
いまのところrtmpPublisherをいじったりはしていないので、ClientHandlerEx、ClientPipelineFactoryEx、RtmpPublisherEx等は利用していない形になっています。

実際に放送を流してみたところ、たまーにちょっとwaitが入る感じになりました。
たぶんLinkedBlockingQueueによるwait時間分とrtmpPublisherが管理している再生時間とのずれがおこって、そのデータ待ち分だけ中途でとまるといったことがおこるのでしょう。

んで、FileChannel経由をやめて、System.inから取り出すプログラムも組んでみた。
https://github.com/taktod/stdinFlazr/commit/385ea597bdc7849f02ab8e42258c060fc5c20a3a

実際にflvファイルをcatしてからpipeでつないで放送させてみたところきちんと動作しました。

僕としては、これで一段落したつもりです。
あとやることとしては
・役割ごとに動作を変更していって、クラスの整備をする。
・実際にリアルタイム出力をつかってながせるかやってみる。
・rtmpPublisherをいじって動作を安定させる
ということがあるのですが、とりあえずパイプ接続のデータをrtmpでpublishするという件の調査はできたので、もういいかなと思っています。

Flazrの配信をいじってみたいと思う。

では実際にプログラムをつくっていきます。

まず、com.ttProject.flazrにFlvReader、FileChannelReader、RtmpPublisherに対応したクラスを準備してやる必要があります。
com.ttProject.flazr.io.SydinChannelReader
com.ttProject.flazr.io.flv.FlvLiveReader
を作成しました。
RtmpClientのコネクト前のところで、独自のクラスに組み替えが可能です。
とりあえず-が入力されたときに動作を変更できるように改造
https://github.com/taktod/stdinFlazr/commit/b74bc103de4a43e99337f04cc6fab24e69af11d1


んで、独自クラスも追加ただし中身はからっぽ

つづいて、FlvLiveReaderの中身をFlvReaderの丸コピーにして、こちらのクラスを元に動作させてみたいと思います。

09:59:59,177 [main] INFO [FlvReader] - FlvLiveReader
コンストラクタのところに仕込んでおいたログ出力がきちんとでてきたのを確認した。

ここでRtmpPublisherを書き換えたい場合は、ClientHandlerも変更しなければいかなさそうな感じになってきた・・・やだなぁ
RtmpPublisherはどこで使われている?→ClientHandler
ClientHandlerはどこで使われている?→ClientPipelineFactory
ClientPipelineFactoryはどこで使われている?→RtmpClient
という図式になるので、3つクラスを追加
とりあえず変更を大量に実施して、RtmpPublisherExという独自クラスがつかわれるように改造。

10:24:23,203 [New I/O client worker #1-1] INFO [RtmpPublisherEx] - RtmpPublisherExがよばれたよん。
コンストラクタでログを出力するように変更して、呼ばれていることを確認。
もちろん実際にサーバーにデータをおくって、動作していることも確認。
これで元のFlazrに迷惑をかけずに、独自に動作を改造する下準備はおわり。



Flazrの配信をいじってみたいと思う。

前回に引き続き、Flazrの配信をいじります。
これができれば標準入力をベースにrtmpにpushできるので他のプログラムからpipeでつなぐこともできる上に、xuggle等で変換したデータをそのまま別のサーバーにpushすることもできます。

前回もかきましたがrtmpdumpとか使えばすでにできます。
でもFlazrを使えば内部のデータとかやり取りの方法(放送がとまったときの細かいコントロールとか)ができるようになります。

とりあえず、eclipseにプロジェクトとして取り込みます。
Flazrはこんな感じ。ライブラリのパスもきちんと通しておきました。src/main/javaにある。
com.flazr.rtmp.client.RtmpClientを実行すればプログラムが動作します。
オリジナルプロジェクトはこんな感じ。とりあえず、flazrのlibディレクトリの中身のライブラリを参照として取得し、自分のパッケージをつくりました。
com.ttProject.flazr.RtmpClientを実行すれば動作するというものにします。







ここでいったんgithubにプロジェクトをつくって、登録しておきます。

とりあえずは動作のどういう動作をするか確認していきます。
大本のflazrのプログラムに手をくわえてどういう動作をするか確認していきます。
logger.info("")で適当なメッセージをいれていくと・・・
対象は
com.flazr.io.flv.FlvReader
com.flazr.io.FileChannelReader
com.flazr.rtmp.RtmpPublisher
このあたりです。
というわけでFlvReaderの各関数のあたまにlogger.info("関数名");
のログをはさんでいきます。
んで、実行

09:33:42,584 [Hashed wheel timer #1] INFO [RtmpPublisher] - here...
09:33:42,584 [Hashed wheel timer #1] INFO [FlvReader] - hasNext
09:33:42,584 [Hashed wheel timer #1] INFO [FlvReader] - next
09:33:42,584 [Hashed wheel timer #1] INFO [FlvReader] - setAggregateDuration0
09:33:42,585 [New I/O client worker #1-1] INFO [RtmpPublisher] - fireNext1:100
09:33:42,585 [New I/O client worker #1-1] INFO [RtmpPublisher] - here...
09:33:42,585 [New I/O client worker #1-1] INFO [FlvReader] - hasNext
09:33:42,585 [New I/O client worker #1-1] INFO [FlvReader] - next
09:33:42,585 [New I/O client worker #1-1] INFO [FlvReader] - setAggregateDuration0
09:33:42,585 [New I/O client worker #1-1] INFO [RtmpPublisher] - fireNext77:100
09:33:42,585 [New I/O client worker #1-1] INFO [RtmpPublisher] - here...

こんなログが大量にでてきました。
どうやらタイマーである程度時間をスキップさせて、その間の命令を送信しているという感じですね。

注意しないといけない部分は、FlvReaderの動作の内部にデータのシークまわりの記述があります。
標準入力でうけとったデータをリアルタイムにストリーミングするので、ファイルのシークはできないことになります。
よってこの部分の処理の変更が必要になると予想されます。
また、RtmpPublisherで次の命令の発行を実行しているみたいですが、どうやらFlvReaderからrtmpMessageが取得できない場合は、ファイルが終了したと判定して止まってしまうようになっているようです。
標準入力のデータはなんらかの問題でデータが送られてこなくなるということも想定されますので、そのあたり注意しておかないといけないと思われます。
FileChannelReaderに関してはfileのByteBufferのデータをChannelBufferに変換してFlvReaderの読み込みの補助をやっているみたいなんですが、この部分もSystem.inに対応したなにかしらをつくらないとだめですね。

というわけでだいたいどこを変更すべきかという見当はついたつもりです。


Flazrの配信をいじってみたいと思う。

僕にとって結構ひいきにしているプログラムがあります。
Flazrというrtmpのjava実装です。

rtmp関連の経緯は次のような感じです。
3年前くらい。
会社でストリーミングサービスをやるのに、fms wowza red5の動作検証中にred5のrtmpClientという実装をみつける。
とりあえずred5同士でストリームの中継ができることがわかったんで、apache-mina実装のこのrtmpClientにハマってました。

ところがこのrtmpClient、fms4.5(だったか?)からFlashMediaServerに接続できなくなるという問題点を発見。またストリーミングではなくファイルデータをベースにしてrtmpサーバーにメディア転送を実施するとはやおくりみたいなことが発生することもわかりちょっとへこみました。

そんなときにこのFlazrをみつけましたね。
こちらは早送りも発生せず、FlashMediaServerにも無事に接続可能。jbossのnettyベースだったので乗り換えるのに手間取ったけど、最近ではflazrのデータソースをxuggleに回す動作も問題なくできたし、と、なかなかの動作を見せてくれてます。

で、いままではFlazrをベースにrtmpサーバーからデータをひっぱってきて、コンバートかけてiOS用のストリーミングに変換したり、Flvに落とし込んだりしていたわけですが今回ちょっとrtmpサーバーに映像をpushすることに挑戦したいとおもっています。

Flazr
Flazrは2009年の年末に開発がとまったみたいです。
RC2のアーカイブデータが公開されていますが、僕はソースコードからコンパイルしなおしたデータを利用しています。(ソースコードも同梱されてたと思います。)
理由は、なぜかアーカイブのコンパイル済みデータが古くてちょっとバグがあるためです。

基本的には次のようなコマンドで利用します。
flvにダウンロードするとき
$ ./client.sh -host (サーバー) -app (アプリ名) (ストリーム名) (保存先ファイル名)
flvを放送するとき
$ ./client.sh -host (サーバー) -app (アプリ名) -live (ストリーム名) (配信元のflvファイル)
-liveの記述をわすれると配信元のデータが消えるのでその部分要注意です。

で、ファイルをベースにしたrtmpの配信はできるわけだが、今回やってみたいのはパイプで接続した標準入力をベースにrtmpの配信をするという件。
(ぶっちゃけるとrtmpdumpでも十分できるわけだが・・・)


2012年11月14日水曜日

複数m3u8から成立するHttpLiveStreamingのサンプルつくってみた。

せっかくjsegmenterつくってm3u8がつくれるようになったので、いっぱいつくってみました。

データはすべて以前もつかったことがある、スーパーマリオギャラクシー2のプロモーションビデオです。


高画質29.98fps
http://49.212.39.17/mario/mario.m3u8
中画質29.98fps
http://49.212.39.17/mario/middle.m3u8
低画質29.98fps
http://49.212.39.17/mario/low.m3u8
上記3つのうち最適なデータが選択されるやつ

http://49.212.39.17/mario/low_15.m3u8
上記3つのうち最適なデータが選択されるやつ

mp3の場合だけちょっと挙動が違います。アプリ切り替えてもとまりません。
あとは電車で移動中とか、画質の変化がどうなるか、あたり確認しておきたいところ。
なお、3G回線(AU)でたまに低画質15fpsでもきついときがあるみたいです。
動画はやっぱりしかたないのかな?

2012年11月10日土曜日

nioの実力

jsegmenterというjavaで書いたiOSのHttpLiveStreaming用のメディアデータ分割プログラムを書いていました。
https://github.com/taktod/jsegmenter

その中でffmpegの出力を直接パイプでうけとって処理をするというプログラムもいれていたのですが、どうも動作がダメダメでした。
MarioGalaxy2のプロモーション動画132秒をffmpegで変換してやった場合だいたい30秒強くらいで変換がおわります。

もともとSystem.inからbyte配列にデータを読み込む形でプログラムを書いていたのですが、これで動作するsegmenterをパイプでつないだところ、変換のクオリティーにもよるんですが、処理に150秒ほどかかる結果になりました。
ライブ映像をその場変換していたら、変換が追いつかない状態で遅延が酷くなる一方という悲しい結果になりました。
ソースはこんな感じです。
140行目あたりでSystem.inからbyte配列にデータを渡しています。

調べてみたところどうやらSystem.inから直接byteデータを読み込む形だと動作が遅いみたいです。

で、nio(new io)を使うように変更してみました。
ソースはこんな感じになりました。

130行目あたりで、ReadableByteChannelからByteBufferの形でデータを抜き出してます。


変換させてみたところ、32.5秒・・・
パイプなしでコンバートだけやったときには、31.6秒ほどで同じ変換がおわったので、めちゃくちゃ速くなりましたね・・・

xuggleの内部処理でffmpegとデータをやりとりするところとか、byte配列でやり取りしてるので、こういう部分全部nioに書き換えてやれば、いろいろと動作が良くなるのかな?とおもいました。

nioのファンになりそうw

2012年10月30日火曜日

マルチ変換について

先ほど、マルチ変換について調査してみた。

https://github.com/taktod/streaming/tree/streaming
ソースのベースはこちら。
まぁ、プログラムの更新をすすめながらやって今日の変更分はまだpushしていないのですけど

1:
mpegtsとflv、webmの320x240の出力を実行する動作を走らせていたのですが、はじめの状態ではクオリティが悲惨なものになりました。
どうやら、om.ttProject.xuggle.ConvertManagerのエンコードまわりの動作をマルチスレッドにしているのが、よろしくないみたいです。この辺の処理、マルチスレッドで動作させておくと、ノイズがはしるみたいになるみたいですね。

2:
というわけでエンコードの部分だけ、マルチスレッドはずしてみました。
そうすると、映像のクオリティはなかなかなものになりました。
webmは、そもそもvorbisの動作があやしかったので、変換対象から撤去して、mpegtsとflvだけ出力させていましたが、いい感じでした。

3:
つづいて、640x480で試してみました。
前と同じくmpegtsとflvの出力を実施してみましたが、今度は、mpegtsもflvも遅延するようになりました。
あまり処理が増えると遅延が発生するみたいです。マルチスレッド処理にxuggleが対応していないみたいですね。

4:
では、jvmをわけちゃえということで、flazrのプログラム2つにしてみました。
両方とも動作はまぁ良好だったわけですが、640x480で2つ実施したときと同じように、遅延が酷くなりました。リサンプルとエンコードの部分は共有しているので、コンテナ書き出しだけ重複するはずですが、動作がいまいちでしたね。

5:
では、単体では?ということになりましたので、ためしてみたところ、単体だと問題なく動作しました。
flvのh.264 + mp3の動作640x480でやったところ遅延がほぼなく動作しました。むしろ微妙に追いつきかけてました。
コンテナに書き込むのって微妙に重いのだろうか・・・
コンテナから読み込む部分、自力でやるようにしたので、コンテナに書き込む部分も自力化してしまえばもしかしたらいいかもしれません。

6:
320x240 160x120をh.264 mp3でflvとmpegtsで計4つつくってみました。
すると動作がいい感じになりました。あとがんばれそうな部分はコンテナの書き込みの部分だけ、自力化すると高速になるかも・・・といったところですね。

変換パラメーターとかいじればさらに動作がよくなるかもしれません。
結論としては
・xuggleはマルチスレッドつかわない方がよさそう。
・変換さえおいつくなら複数コンバート可能っぽい。
・jvmを別にしてもxuggleを複数同時にはしらせるのはお勧めしない。
やるならショボいサーバーを並べた方がよさそう。といったところでしょうかね。

ちなみに、ffmpegを複数プロセス同時に走らせるのは実は特に問題ないです。
全く違うコーデックの出力をいくつもつくるなら、xuggleつかうより、processBuilderをつかって、ffmpegを外部プロセス扱いにして動作させちゃった方が楽だと思います。

今日の戯れ言はこんなところで・・・

2012年10月28日日曜日

xuggleのvorbis変換について

なぜだかはわからないけど、そうなるみたい。という話。

webmの動画をつくる場合に、映像コーデックはwebm、音声コーデックはvorbisに限定されます。

で、そのvorbisの変換なんですが、xuggleを利用すると、うまくいかない・・・
18:59:43,796 [pool-2-thread-1] ERROR [ffmpeg] - [libvorbis @ 0x7f938c000d60] Specified sample_fmt is not supported.
こんなエラーがでてきます。
よくよく調べてみたところ、xuggleのffmpegでは、このsample_fmtのデフォルト値をいじっているみたいです。

コードはこちら。
古いgoogle code上のプログラムなので、現行のgithubのバージョンでは違うのかもしれませんが、こちらによると132行目あたりでSAMPLE_FMT_NONEをSAMPLE_FMT_S16で書き換えてるみたいですね。

この辺がおかしいんだろうと目星をつけたところでコードの改造に走りました。
java側でもちょうどIStreamCoderをいじる部分があるので
IStreamCoder.setSampleFormatの関数を追加して実験してみたところ
IAudioSamples.Format.FMT_FLTだけ、動作できることがわかりました。

何なんですかね。NONEでもFMT_S16でもないじゃん。
さらに不可解なことにlibvorbisのコード?こちらでは
.sample_fmts = (const enum SampleFormat[]){SAMPLE_FMT_S16, SAMPLE_FMT_NONE},
という記述が・・・

なんでFLTで動作するのかさっぱりわかりませんね。
これに合わせてリサンプル動作もFormatを書き換えるようにしたところとりあえず動作したので、まぁ不問にしようかなと思っていますが・・・うーん

(まぁいまつくっているプログラムwebmはおまけみたいなもんですから、いいんです。)

追記:vorbis変換ですが、すごくショボいです。音も非常に悪い感じになりました。
マルチコンバートさせてみたところ、(マルチスレッドで互いに干渉したせいかもしれませんが)音飛ぶは、映像とまるわで残念な結果になっちゃったので、へこみました。

2012年10月27日土曜日

FlashMediaServerの吐くデータ つづき

FlashMediaServerが吐くデータについて調べています。

FlazrをつかってFlashMediaServerが出すmediaデータを取得Flv化するとうまいデータになりません。
binaryレベルで確認するとTimestampが0xFF FF FEになっているデータが大量に先頭にでてくるためみたいです。
さらに、vodやFlashMediaLiveEncoderからの配信、FlazrからのFlvファイルの配信をテストしてみたところどうやら次のようになっているらしいということがわかりました。

H.264やAACに関しては先頭にキーデータがくる。
なので、H.264やAACの場合は先頭の映像Flvタグ、音声Flvタグは保持すべき。
映像データに関しては現在配信済みのデータがtimestamp 0xFF FF FE(-2)で送られてくるらしい。(H.264だけかもしれない。)

ということがわかりました。

根拠は次のようになってます。
準備したもの:
・javaでflvファイルを解析するプログラムを書きました。
知る情報は次のとおり。
Flvタグのタイプ:timestampの値 + メディアデータ長
・Flazrのプログラムとaggregateメッセージ用拡張つきFlazr(こちらは以下Flazr改とします。)の2つを準備する。
・H.264 + AACのflvデータ(youtubeからとったマリオのプロモーションの動画)
・普通のflvデータ(FlashMediaServerのsample.flv)

つくったファイル
1:sample.flvオリジナル
464C5601040000000900000000
meta:0 + 224
audio:0 + 418
audio:26 + 418
video:27 + 37
audio:52 + 418
video:69 + 2497
audio:78 + 418
audio:104 + 418
video:110 + 3228
audio:130 + 418
video:152 + 3915
2:sample.flvをFlazrでファイル化したもの。
解析は次みたいな感じ
464C5601050000000900000000
meta:16777214 + 224
audio:16777214 + 418
audio:24 + 418
video:25 + 37
audio:50 + 418
video:67 + 2497
audio:76 + 418
audio:102 + 418
video:108 + 3228
audio:128 + 418
video:150 + 3915
3:sample.flvをFlazr改でファイル化したもの。

464C5601050000000900000000
meta:0 + 224
audio:0 + 418
audio:26 + 418
video:27 + 37
audio:52 + 418
video:69 + 2497
audio:78 + 418
audio:104 + 418
video:110 + 3228
audio:130 + 418
video:152 + 3915

という結果になりました。
Flazr改で実行しているtimestampの修正はどうやら間違ってない感じですね。
VLCプレーヤーできちんと再生できました。
デフォルトではタイムスタンプが-2されている、そんな感じです。

続いてH.264のデータ
FlashMediaServerのvod枠にプロモ映像を設置します。
1:生データ
464C5601050000000900000000
meta:0 + 843
video:0 + 45
audio:0 + 4
audio:0 + 11
video:0 + 773
audio:23 + 11
video:33 + 197
audio:46 + 11
video:67 + 405
audio:70 + 11
audio:93 + 11
video:100 + 809
audio:116 + 11
video:133 + 1745
audio:139 + 11
audio:163 + 11
video:167 + 2142
audio:186 + 11
video:200 + 2895
audio:209 + 11
audio:232 + 11
video:234 + 3407
2:Flazrでつくったデータ
464C5601050000000900000000
meta:16777214 + 843
video:16777214 + 45
audio:16777214 + 4
audio:16777214 + 11
video:16777214 + 773
audio:23 + 11
video:33 + 197
audio:46 + 11
video:67 + 405
audio:70 + 11
audio:93 + 11
video:100 + 809
audio:116 + 11
video:133 + 1745
audio:139 + 11
audio:163 + 11
video:167 + 2142
audio:186 + 11
video:200 + 2895
audio:209 + 11
audio:232 + 11
video:234 + 3407
3:Flazr改によるデータ
464C5601050000000900000000
meta:0 + 843
video:0 + 45
audio:0 + 4
audio:0 + 11
video:0 + 773
audio:23 + 11
video:33 + 197
audio:46 + 11
video:67 + 405
audio:70 + 11
audio:93 + 11
video:100 + 809
audio:116 + 11
video:133 + 1745
audio:139 + 11
audio:163 + 11
video:167 + 2142
audio:186 + 11
video:200 + 2895
audio:209 + 11
audio:232 + 11
video:234 + 3407

こちらの結果もtimestampが-2になっている感じになってます。
よく考えたらflazrの方のプログラムも-2になっているだけで、他はおかしくないので単にflvタグのtimestampを+2してやれば正しいファイルにできそうですね。

次H.264のpublishしているデータを取得した場合。
とりあえずsample.flvから・・・
1:flazrでちょっとまってからダウンロードした場合
464C5601050000000900000000
video:16777214 + 4174
video:16777214 + 3344
video:16777214 + 2835
video:16777214 + 2666
video:16777214 + 2913
video:16777214 + 2985
video:16777214 + 2601
video:16777214 + 2601
video:16777214 + 2677
video:16777214 + 2546
video:16777214 + 2315
video:16777214 + 2030
video:16777214 + 2263
video:16777214 + 3347
video:16777214 + 3439
video:16777214 + 2597
video:16777214 + 3604
video:16777214 + 3516
video:16777214 + 2410
video:16777214 + 3800
video:16777214 + 2681
video:16777214 + 2267
video:16777214 + 3545
video:16777214 + 3448
audio:16777214 + 418
video:20 + 2520
audio:24 + 418
audio:50 + 418
video:62 + 3349
audio:53237 + 418
audio:53263 + 418
video:53265 + 3034
audio:53289 + 418
video:145 + 4991
audio:53315 + 418
audio:53341 + 418
video:53348 + 2497
audio:53368 + 418
video:53390 + 2938

ちょっと長いけどこうなりました。
464C5601040000000900000000
meta:0 + 224
audio:0 + 418
audio:26 + 418
video:27 + 37
audio:52 + 418
video:69 + 2497
audio:78 + 418
audio:104 + 418
video:110 + 3228
audio:130 + 418
video:152 + 3915
audio:156 + 418
audio:182 + 418
video:194 + 3238
audio:208 + 418
audio:235 + 418
video:235 + 3592
audio:261 + 418
video:277 + 3808
audio:287 + 418
audio:313 + 418
video:319 + 3407
audio:339 + 418
video:360 + 2300
audio:365 + 418
audio:391 + 418
video:402 + 3536
audio:417 + 418
audio:444 + 418
video:444 + 2715
audio:470 + 418
video:485 + 3058
audio:496 + 418
audio:522 + 418
video:527 + 2667
audio:548 + 418
video:569 + 2532
audio:574 + 418
audio:600 + 418
video:610 + 3073
audio:626 + 418
video:652 + 2886
audio:653 + 418
audio:679 + 418
video:694 + 3098
audio:705 + 418
audio:731 + 418
video:735 + 2225
audio:757 + 418
video:777 + 2451
audio:783 + 418
audio:809 + 418
video:819 + 2571
audio:835 + 418
video:860 + 2930
audio:862 + 418
audio:888 + 418
video:902 + 2340
audio:914 + 418
audio:940 + 418
video:944 + 2733
audio:966 + 418
video:985 + 3041
audio:992 + 418
audio:1018 + 418
video:1027 + 2627
audio:1044 + 418
video:1069 + 2573
audio:1071 + 418
audio:1097 + 418
video:1110 + 2518
audio:1123 + 418
audio:1149 + 418
video:1152 + 2827
audio:1175 + 418
video:1194 + 2755
audio:1201 + 418
audio:1227 + 418
video:1235 + 2545
audio:1253 + 418
video:1277 + 2620
audio:1280 + 418
audio:1306 + 418
video:1319 + 2721
audio:1332 + 418
audio:1358 + 418
video:1360 + 2823
audio:1384 + 418
video:1402 + 2436
audio:1410 + 418
audio:1436 + 418
video:1444 + 2228
audio:1462 + 418
video:1485 + 2141
audio:1488 + 418
audio:1515 + 418
video:1527 + 2648
audio:1541 + 418
audio:1567 + 418
video:1569 + 2588
audio:1593 + 418
video:1610 + 2331
audio:1619 + 418
audio:1645 + 418
video:1652 + 2593
audio:1671 + 418
video:1694 + 3119
audio:1697 + 418
audio:1724 + 418
video:1735 + 2862
audio:1750 + 418
audio:1776 + 418
video:1777 + 2550
audio:1802 + 418
video:1819 + 2635
audio:1828 + 418
audio:1854 + 418
video:1860 + 2346
audio:1880 + 418
video:1902 + 2493
audio:1906 + 418
audio:1933 + 418
video:1944 + 2265
audio:1959 + 418
audio:1985 + 418
video:1985 + 2994
audio:2011 + 418
video:2027 + 5690
audio:2037 + 418
audio:2063 + 418
video:2069 + 3085
audio:2089 + 418
video:2110 + 3336
audio:2115 + 418
audio:2142 + 418
video:2152 + 2931
audio:2168 + 418
audio:2194 + 418
video:2194 + 3037
audio:2220 + 418
video:2235 + 4174
audio:2246 + 418
audio:2272 + 418
video:2277 + 3344
audio:2298 + 418
video:2319 + 2835
audio:2324 + 418
audio:2351 + 418
video:2360 + 2666
audio:2377 + 418
video:2402 + 2913
audio:2403 + 418
audio:2429 + 418
video:2444 + 2985
audio:2455 + 418
audio:2481 + 418
video:2485 + 2601
audio:2507 + 418
video:2527 + 2601
audio:2533 + 418
audio:2560 + 418
video:2569 + 2677
audio:2586 + 418
video:2610 + 2546
audio:2612 + 418
audio:2638 + 418
video:2652 + 2315
audio:2664 + 418
audio:2690 + 418
video:2694 + 2030
audio:2716 + 418
video:2735 + 2263
audio:2742 + 418
audio:2768 + 418
video:2777 + 3347
audio:2795 + 418
video:2819 + 3439
audio:2821 + 418
audio:2847 + 418
video:2860 + 2597
audio:2873 + 418
audio:2899 + 418
video:2902 + 3604
audio:2925 + 418
video:2944 + 3516
audio:2951 + 418
audio:2977 + 418
video:2985 + 2410
audio:3004 + 418
video:3027 + 3800
audio:3030 + 418
audio:3056 + 418
video:3069 + 2681
audio:3082 + 418
audio:3108 + 418
video:3110 + 2267
audio:3134 + 418
video:3152 + 3545
audio:3160 + 418
audio:3186 + 418
video:3194 + 3448
audio:3213 + 418
video:3235 + 2520
audio:3239 + 418
audio:3265 + 418
video:3277 + 3349
audio:3291 + 418
audio:3317 + 418
video:3319 + 3034
audio:3343 + 418
video:3360 + 4991
audio:3369 + 418
audio:3395 + 418
video:3402 + 2497
audio:3422 + 418
video:3444 + 2938
さて、この2つを比較するといくつかわかることがあります。
1つ目、vodのときとは違い単に-2になっていない。
2つ目、緑のところを見てもらえばわかるかと思いますが、どうやらFlvタグの並び順はそのままみたいです。timestampの差分(時間のずれ)も保持されている感じです。
3つ目、先頭の部分ですが、どうやら動画用のデータだけ過去24個分入っているみたいですね。

では、続いてFlazr改の動作
464C5601050000000900000000
video:0 + 4174
video:0 + 3344
video:0 + 2835
video:0 + 2666
video:0 + 2913
video:0 + 2985
video:0 + 2601
video:0 + 2601
video:0 + 2677
video:0 + 2546
video:0 + 2315
video:0 + 2030
video:0 + 2263
video:0 + 3347
video:0 + 3439
video:0 + 2597
video:0 + 3604
video:0 + 3516
audio:0 + 418
video:8 + 2410
audio:27 + 418
video:50 + 3800
audio:53 + 418
audio:79 + 418
video:92 + 2681
audio:105 + 418
audio:131 + 418
video:133 + 2267
audio:157 + 418
video:175 + 3545
audio:183 + 418
audio:209 + 418
video:217 + 3448
audio:236 + 418
video:258 + 2520
audio:262 + 418
audio:288 + 418
video:300 + 3349
audio:314 + 418
audio:340 + 418
video:342 + 3034
audio:366 + 418
video:383 + 4991
audio:392 + 418
audio:418 + 418
video:425 + 2497
audio:445 + 418
video:467 + 2938

こんな感じになりました。
元データと比較すると、先ほどと同じように
1:先頭に動画データが並んでる(個数は24ではないみたいです。キーフレームから後を保持している感じでしょうか?)
2:Flvタグの並び順も問題なし。
3:一応timestampの差分とデータサイズも確認してみましたが、流れている部分は一致しました。

最後にH.264の動画での確認。
flazrの動作は割愛(もう興味ないんで・・・)
Flazr改の動作一番右の数値はtimestampの差分量です。
464C5601050000000900000000
video:0 + 45 + 0
audio:0 + 4 + 0
video:0 + 773 + 0
video:0 + 197 + 0
video:0 + 405 + 0
video:0 + 809 + 0
video:0 + 1745 + 0
video:0 + 2142 + 0
video:0 + 2895 + 0
video:0 + 3407 + 0
video:0 + 4055 + 0
video:0 + 3630 + 0
video:0 + 3535 + 0
video:0 + 4006 + 0
video:0 + 3567 + 0
video:0 + 5769 + 0
video:0 + 4831 + 0
video:0 + 5449 + 0
video:0 + 5796 + 0
video:0 + 5995 + 0
video:0 + 6284 + 0
video:0 + 6242 + 0
video:0 + 6249 + 0
video:0 + 5144 + 0
video:0 + 4115 + 0
video:0 + 3930 + 0
video:0 + 3935 + 0
video:0 + 3870 + 0
video:0 + 3719 + 0
video:0 + 3515 + 0
video:0 + 3674 + 0
video:0 + 3622 + 0
video:0 + 3226 + 0
video:0 + 3217 + 0
video:0 + 3671 + 0
video:0 + 3540 + 0
video:0 + 4139 + 0
video:0 + 598 + 0
video:0 + 325 + 0
video:0 + 351 + 0
video:0 + 281 + 0
video:0 + 393 + 0
video:0 + 253 + 0
video:0 + 246 + 0
video:0 + 373 + 0
video:0 + 1061 + 0
video:0 + 1625 + 0
video:0 + 2129 + 0
video:0 + 940 + 0
video:0 + 427 + 0
video:0 + 266 + 0
video:0 + 333 + 0
video:0 + 139 + 0
video:0 + 183 + 0
video:0 + 117 + 0
video:0 + 102 + 0
video:0 + 171 + 0
video:0 + 167 + 0
video:0 + 337 + 0
video:0 + 206 + 0
video:0 + 319 + 0
video:0 + 9779 + 0
video:0 + 199 + 0
video:0 + 114 + 0
video:0 + 57 + 0
video:0 + 37 + 0
video:0 + 37 + 0
video:0 + 63 + 0
video:0 + 37 + 0
video:0 + 41 + 0
video:0 + 37 + 0
video:0 + 47 + 0
video:0 + 37 + 0
video:0 + 37 + 0
video:0 + 48 + 0
video:0 + 30 + 0
video:0 + 59 + 0
video:0 + 91 + 0
audio:5 + 11 + 5
audio:28 + 11 + 23
video:33 + 38 + 5
audio:51 + 11 + 18
video:66 + 30 + 15
audio:74 + 11 + 8
audio:98 + 11 + 24
video:100 + 57 + 2
audio:121 + 11 + 21
video:133 + 48 + 12
audio:144 + 11 + 11
video:166 + 49 + 22
audio:167 + 11 + 1
audio:191 + 11 + 24
video:200 + 58 + 9
audio:214 + 11 + 14
video:233 + 52 + 19
audio:237 + 11 + 4
audio:260 + 11 + 23
video:266 + 35 + 6
audio:283 + 11 + 17
video:300 + 35 + 17
audio:307 + 11 + 7
audio:330 + 11 + 23
video:333 + 35 + 3
audio:353 + 11 + 20
video:367 + 35 + 14
audio:376 + 11 + 9
audio:399 + 11 + 23
video:400 + 35 + 1
audio:423 + 11 + 23
video:433 + 35 + 10
audio:446 + 11 + 13
video:467 + 35 + 21
audio:469 + 11 + 2
audio:492 + 11 + 23
video:500 + 229 + 8
audio:516 + 11 + 16
video:533 + 100 + 17
audio:539 + 11 + 6
audio:562 + 11 + 23
video:567 + 25 + 5
audio:585 + 11 + 18
video:600 + 37 + 15
audio:608 + 11 + 8
audio:632 + 11 + 24
video:633 + 33 + 1
audio:655 + 11 + 22
video:667 + 27 + 12
audio:678 + 11 + 11
video:700 + 27 + 22
audio:701 + 11 + 1
audio:725 + 11 + 24
video:734 + 27 + 9
audio:748 + 11 + 14
video:767 + 27 + 19
audio:771 + 11 + 4
audio:794 + 11 + 23
video:800 + 27 + 6
audio:817 + 11 + 17
video:834 + 27 + 17
audio:841 + 11 + 7
audio:864 + 11 + 23
video:867 + 27 + 3
audio:887 + 11 + 20
video:900 + 27 + 13
audio:910 + 11 + 10
audio:934 + 11 + 24
video:934 + 27 + 0
audio:957 + 11 + 23
video:967 + 27 + 10
audio:980 + 11 + 13
video:1001 + 33 + 21
audio:1003 + 11 + 2
audio:1026 + 11 + 23
video:1034 + 33 + 8
audio:1050 + 11 + 16
video:1067 + 29 + 17
audio:1073 + 11 + 6
audio:1096 + 11 + 23
video:1101 + 170 + 5
audio:1119 + 11 + 18
video:1134 + 1058 + 15
audio:1143 + 11 + 9
audio:1166 + 11 + 23
video:1167 + 1477 + 1
audio:1189 + 11 + 22
video:1201 + 1812 + 12
audio:1212 + 11 + 11
video:1234 + 1650 + 22
audio:1235 + 11 + 1
audio:1259 + 11 + 24
video:1267 + 1762 + 8
audio:1282 + 11 + 15
video:1301 + 1677 + 19
audio:1305 + 11 + 4
audio:1328 + 11 + 23
video:1334 + 1948 + 6
audio:1352 + 11 + 18
video:1368 + 1493 + 16
audio:1375 + 11 + 7
audio:1398 + 11 + 23
video:1401 + 1939 + 3
audio:1421 + 11 + 20
video:1434 + 4327 + 13
audio:1444 + 11 + 10
audio:1468 + 11 + 24
video:1468 + 1475 + 0
audio:1491 + 11 + 23
video:1501 + 1785 + 10
audio:1514 + 11 + 13
video:1534 + 1663 + 20
audio:1537 + 11 + 3
audio:1560 + 11 + 23
video:1568 + 320 + 8
audio:1584 + 11 + 16
video:1601 + 382 + 17
audio:1607 + 11 + 6
audio:1630 + 11 + 23
video:1634 + 98 + 4
audio:1653 + 11 + 19
video:1668 + 69 + 15
audio:1677 + 11 + 9
audio:1700 + 11 + 23
video:1701 + 30 + 1
audio:1723 + 11 + 22
video:1735 + 38 + 12
audio:1746 + 11 + 11
video:1768 + 56 + 22
audio:1769 + 11 + 1
audio:1793 + 11 + 24
video:1801 + 70 + 8
audio:1816 + 11 + 15
video:1835 + 39 + 19
audio:1839 + 11 + 4
audio:1862 + 11 + 23
video:1868 + 30 + 6
audio:1886 + 11 + 18
video:1901 + 82 + 15
audio:1909 + 11 + 8
audio:1932 + 11 + 23
video:1935 + 30 + 3
audio:1955 + 11 + 20
video:1968 + 30 + 13
audio:1978 + 11 + 10
audio:2002 + 11 + 24
video:2002 + 341 + 0
audio:2025 + 11 + 23
video:2035 + 167 + 10
audio:2048 + 11 + 13
video:2068 + 69 + 20
audio:2071 + 11 + 3
audio:2095 + 11 + 24
video:2102 + 75 + 7
audio:2118 + 11 + 16
video:2135 + 173 + 17
audio:2141 + 11 + 6
audio:2164 + 11 + 23
video:2168 + 48 + 4
audio:2187 + 11 + 19
video:2202 + 42 + 15
audio:2211 + 11 + 9
audio:2234 + 11 + 23
video:2235 + 33 + 1
audio:2257 + 11 + 22
video:2268 + 38 + 11
audio:2280 + 11 + 12
video:2302 + 33 + 22
audio:2304 + 11 + 2
audio:2327 + 11 + 23
video:2335 + 33 + 8
audio:2350 + 11 + 15
video:2369 + 33 + 19
audio:2373 + 11 + 4
audio:2396 + 11 + 23
video:2402 + 56 + 6
audio:2420 + 11 + 18
video:2435 + 33 + 15
audio:2443 + 11 + 8
audio:2466 + 11 + 23
video:2469 + 33 + 3
audio:2489 + 11 + 20
video:2502 + 111 + 13
audio:2513 + 11 + 11
video:2535 + 61 + 22
audio:2536 + 11 + 1
audio:2559 + 11 + 23
video:2569 + 68 + 10
audio:2582 + 11 + 13
video:2602 + 33 + 20
audio:2605 + 11 + 3
audio:2629 + 11 + 24
video:2635 + 33 + 6
audio:2652 + 11 + 17
video:2669 + 33 + 17
audio:2675 + 11 + 6
audio:2698 + 11 + 23
video:2702 + 33 + 4
audio:2721 + 11 + 19
video:2736 + 33 + 15
audio:2745 + 11 + 9
audio:2768 + 11 + 23
video:2769 + 98 + 1
audio:2791 + 11 + 22
video:2802 + 33 + 11
audio:2814 + 11 + 12
video:2836 + 33 + 22
audio:2838 + 11 + 2
audio:2861 + 11 + 23
video:2869 + 33 + 8
audio:2884 + 11 + 15
video:2902 + 33 + 18
audio:2907 + 11 + 5
audio:2930 + 11 + 23
video:2936 + 33 + 6
audio:2954 + 11 + 18
video:2969 + 33 + 15
audio:2977 + 11 + 8
audio:3000 + 11 + 23
video:3003 + 50 + 3
audio:3023 + 11 + 20
video:3036 + 45 + 13
audio:3047 + 11 + 11
video:3069 + 28 + 22
audio:3070 + 11 + 1
audio:3093 + 11 + 23
video:3103 + 28 + 10
audio:3116 + 11 + 13
video:3136 + 28 + 20
audio:3139 + 11 + 3
audio:3163 + 11 + 24
video:3169 + 28 + 6
audio:3186 + 11 + 17
video:3203 + 28 + 17
audio:3209 + 11 + 6
audio:3232 + 11 + 23
video:3236 + 28 + 4
audio:3256 + 11 + 20
video:3269 + 28 + 13
audio:3279 + 11 + 10
audio:3302 + 11 + 23
video:3303 + 28 + 1
audio:3325 + 11 + 22
video:3336 + 49 + 11
audio:3348 + 11 + 12
video:3370 + 34 + 22
audio:3372 + 11 + 2
audio:3395 + 11 + 23
video:3403 + 4691 + 8
audio:3418 + 11 + 15
video:3436 + 104 + 18
audio:3441 + 11 + 5
audio:3465 + 11 + 24
video:3470 + 65 + 5
audio:3488 + 11 + 18
video:3503 + 89 + 15
audio:3511 + 11 + 8
audio:3534 + 11 + 23
video:3536 + 147 + 2
audio:3557 + 11 + 21
video:3570 + 70 + 13
audio:3581 + 11 + 11
video:3603 + 102 + 22
audio:3604 + 11 + 1
audio:3627 + 11 + 23
video:3636 + 48 + 9
audio:3650 + 11 + 14
video:3670 + 48 + 20
audio:3674 + 11 + 4
audio:3697 + 11 + 23
video:3703 + 48 + 6
audio:3720 + 11 + 17
video:3737 + 48 + 17
audio:3743 + 11 + 6
audio:3766 + 11 + 23
video:3770 + 48 + 4
audio:3790 + 11 + 20
video:3803 + 48 + 13
audio:3813 + 11 + 10
audio:3836 + 11 + 23
video:3837 + 48 + 1
audio:3859 + 11 + 22
video:3870 + 48 + 11
audio:3882 + 11 + 12
video:3903 + 48 + 21
audio:3906 + 11 + 3
audio:3929 + 11 + 23
video:3937 + 48 + 8
audio:3952 + 11 + 15
video:3970 + 48 + 18
audio:3975 + 11 + 5
audio:3999 + 11 + 24
video:4004 + 156 + 5
audio:4022 + 11 + 18
video:4037 + 106 + 15
audio:4045 + 11 + 8
audio:4068 + 11 + 23
video:4070 + 62 + 2
audio:4091 + 11 + 21
video:4104 + 53 + 13
audio:4115 + 11 + 11
video:4137 + 46 + 22
audio:4138 + 11 + 1
audio:4161 + 11 + 23
video:4170 + 46 + 9
audio:4184 + 11 + 14
video:4204 + 46 + 20
audio:4208 + 11 + 4
audio:4231 + 11 + 23
video:4237 + 46 + 6
audio:4254 + 11 + 17
video:4270 + 46 + 16
audio:4277 + 11 + 7
audio:4300 + 11 + 23
video:4304 + 46 + 4
audio:4324 + 11 + 20
video:4337 + 46 + 13
audio:4347 + 11 + 10
audio:4370 + 11 + 23
video:4371 + 46 + 1
audio:4393 + 11 + 22
video:4404 + 46 + 11
audio:4417 + 11 + 13
video:4437 + 46 + 20
audio:4440 + 11 + 3
audio:4463 + 11 + 23
video:4471 + 46 + 8
audio:4486 + 11 + 15
video:4504 + 62 + 18
audio:4509 + 11 + 5
audio:4533 + 11 + 24
video:4537 + 61 + 4
audio:4556 + 11 + 19
video:4571 + 47 + 15
audio:4579 + 11 + 8
audio:4602 + 11 + 23
video:4604 + 46 + 2
audio:4626 + 11 + 22
video:4637 + 46 + 11
audio:4649 + 11 + 12
video:4671 + 46 + 22
audio:4672 + 11 + 1
audio:4695 + 11 + 23
video:4704 + 46 + 9
audio:4718 + 11 + 14
video:4738 + 46 + 20
audio:4742 + 11 + 4
audio:4765 + 11 + 23
video:4771 + 46 + 6
audio:4788 + 11 + 17
video:4804 + 46 + 16
audio:4811 + 11 + 7
audio:4835 + 11 + 24
video:4838 + 46 + 3
audio:4858 + 11 + 20
video:4871 + 46 + 13
audio:4881 + 11 + 10
audio:4904 + 11 + 23
video:4904 + 46 + 0
audio:4927 + 11 + 23
video:4938 + 46 + 11
audio:4951 + 11 + 13
video:4971 + 46 + 20
audio:4974 + 11 + 3
audio:4997 + 11 + 23
video:5005 + 62 + 8
audio:5020 + 11 + 15
video:5038 + 59 + 18
audio:5043 + 11 + 5
audio:5067 + 11 + 24
video:5071 + 47 + 4
audio:5090 + 11 + 19
video:5105 + 46 + 15
audio:5113 + 11 + 8
audio:5136 + 11 + 23
video:5138 + 46 + 2
audio:5160 + 11 + 22
video:5171 + 46 + 11
audio:5183 + 11 + 12
video:5205 + 46 + 22
audio:5206 + 11 + 1
audio:5229 + 11 + 23
video:5238 + 46 + 9
audio:5252 + 11 + 14
video:5271 + 46 + 19
audio:5276 + 11 + 5
audio:5299 + 11 + 23
video:5305 + 46 + 6
audio:5322 + 11 + 17
video:5338 + 46 + 16
audio:5345 + 11 + 7
audio:5369 + 11 + 24
video:5372 + 4239 + 3
audio:5392 + 11 + 20
video:5405 + 63 + 13
audio:5415 + 11 + 10
audio:5438 + 11 + 23
video:5438 + 31 + 0
audio:5461 + 11 + 23
video:5472 + 27 + 11
audio:5485 + 11 + 13
video:5505 + 48 + 20
audio:5508 + 11 + 3
audio:5531 + 11 + 23
video:5538 + 46 + 7
audio:5554 + 11 + 16
video:5572 + 28 + 18
audio:5578 + 11 + 6
audio:5601 + 11 + 23
video:5605 + 27 + 4
audio:5624 + 11 + 19
video:5638 + 27 + 14
audio:5647 + 11 + 9
audio:5670 + 11 + 23
video:5672 + 34 + 2
audio:5694 + 11 + 22
video:5705 + 300 + 11
audio:5717 + 11 + 12
video:5739 + 1094 + 22
audio:5740 + 11 + 1
audio:5763 + 11 + 23
video:5772 + 1525 + 9
audio:5787 + 11 + 15
video:5805 + 1607 + 18
audio:5810 + 11 + 5
audio:5833 + 11 + 23
video:5839 + 1912 + 6
audio:5856 + 11 + 17
video:5872 + 1643 + 16
audio:5879 + 11 + 7
audio:5903 + 11 + 24
video:5905 + 1865 + 2
audio:5926 + 11 + 21
video:5939 + 1839 + 13
audio:5949 + 11 + 10
audio:5972 + 11 + 23
video:5972 + 2087 + 0
audio:5996 + 11 + 24
video:6006 + 1970 + 10
audio:6019 + 11 + 13
video:6039 + 1482 + 20
audio:6042 + 11 + 3
audio:6065 + 11 + 23
video:6072 + 1524 + 7
audio:6088 + 11 + 16
video:6106 + 1058 + 18
audio:6112 + 11 + 6
audio:6135 + 11 + 23
video:6139 + 65 + 4
audio:6158 + 11 + 19
video:6172 + 27 + 14
audio:6181 + 11 + 9
audio:6204 + 11 + 23
video:6206 + 27 + 2
audio:6228 + 11 + 22
video:6239 + 27 + 11
audio:6251 + 11 + 12
video:6272 + 27 + 21
audio:6274 + 11 + 2
audio:6297 + 11 + 23
video:6306 + 27 + 9
audio:6321 + 11 + 15
video:6339 + 27 + 18
audio:6344 + 11 + 5
audio:6367 + 11 + 23
video:6373 + 27 + 6
audio:6390 + 11 + 17
video:6406 + 27 + 16
audio:6413 + 11 + 7
audio:6437 + 11 + 24
video:6439 + 27 + 2
audio:6460 + 11 + 21
video:6473 + 27 + 13
audio:6483 + 11 + 10
audio:6506 + 11 + 23
video:6506 + 34 + 0
audio:6530 + 11 + 24
video:6539 + 34 + 9
audio:6553 + 11 + 14
video:6573 + 106 + 20
audio:6576 + 511 + 3
audio:6599 + 362 + 23
video:6606 + 262 + 7
audio:6622 + 828 + 16
video:6639 + 607 + 17
audio:6646 + 725 + 7
audio:6669 + 786 + 23
video:6673 + 718 + 4
audio:6692 + 759 + 19
video:6706 + 954 + 14
audio:6715 + 762 + 9
audio:6739 + 767 + 24
video:6740 + 1133 + 1
audio:6762 + 747 + 22
video:6773 + 1487 + 11
audio:6785 + 750 + 12
video:6806 + 1585 + 21
audio:6808 + 729 + 2
audio:6831 + 729 + 23
video:6840 + 1804 + 9
audio:6855 + 716 + 15
video:6873 + 2018 + 18
audio:6878 + 704 + 5
audio:6901 + 695 + 23
video:6906 + 2360 + 5
audio:6924 + 686 + 18
video:6940 + 2604 + 16
audio:6948 + 649 + 8
audio:6971 + 674 + 23
video:6973 + 2774 + 2
audio:6994 + 656 + 21
video:7007 + 2942 + 13
audio:7017 + 666 + 10
audio:7040 + 648 + 23
video:7040 + 2742 + 0
audio:7064 + 645 + 24
video:7073 + 2662 + 9
audio:7087 + 620 + 14
video:7107 + 2508 + 20
audio:7110 + 603 + 3
audio:7133 + 613 + 23
video:7140 + 2557 + 7
audio:7157 + 607 + 17
video:7173 + 2520 + 16
audio:7180 + 616 + 7
audio:7203 + 602 + 23
video:7207 + 2896 + 4
audio:7226 + 604 + 19
video:7240 + 2637 + 14
audio:7249 + 625 + 9
audio:7273 + 611 + 24
video:7273 + 2940 + 0
audio:7296 + 608 + 23
video:7307 + 2571 + 11
audio:7319 + 707 + 12
video:7340 + 13566 + 21
audio:7342 + 771 + 2
audio:7365 + 733 + 23
video:7374 + 1390 + 9
audio:7389 + 690 + 15
video:7407 + 1666 + 18
audio:7412 + 667 + 5
audio:7435 + 739 + 23
video:7440 + 1384 + 5
audio:7458 + 721 + 18
video:7474 + 1553 + 16
audio:7482 + 740 + 8
audio:7505 + 723 + 23
video:7507 + 2298 + 2
audio:7528 + 716 + 21
video:7540 + 3478 + 12
audio:7551 + 761 + 11
audio:7574 + 727 + 23
video:7574 + 3227 + 0
audio:7598 + 757 + 24
video:7607 + 3571 + 9
audio:7621 + 730 + 14
video:7640 + 1727 + 19
audio:7644 + 686 + 4
audio:7667 + 722 + 23
なまデータはこちら
464C5601050000000900000000
meta:0 + 843 + 0
video:0 + 45 + 0
audio:0 + 4 + 0
audio:0 + 11 + 0
video:0 + 773 + 0
audio:23 + 11 + 23
video:33 + 197 + 10
audio:46 + 11 + 13
video:67 + 405 + 21
audio:70 + 11 + 3
audio:93 + 11 + 23
video:100 + 809 + 7
audio:116 + 11 + 16
video:133 + 1745 + 17
audio:139 + 11 + 6
audio:163 + 11 + 24
video:167 + 2142 + 4
audio:186 + 11 + 19
video:200 + 2895 + 14
audio:209 + 11 + 9
audio:232 + 11 + 23
video:234 + 3407 + 2
audio:255 + 11 + 21
video:267 + 4055 + 12
audio:279 + 11 + 12
video:300 + 3630 + 21
audio:302 + 11 + 2
audio:325 + 11 + 23
video:334 + 3535 + 9
audio:348 + 11 + 14
video:367 + 4006 + 19
audio:372 + 11 + 5
audio:395 + 11 + 23
video:400 + 3567 + 5
audio:418 + 11 + 18
video:434 + 5769 + 16
audio:441 + 11 + 7
audio:464 + 11 + 23
video:467 + 4831 + 3
audio:488 + 11 + 21
video:501 + 5449 + 13
audio:511 + 11 + 10
audio:534 + 11 + 23
video:534 + 5796 + 0
audio:557 + 11 + 23
video:567 + 5995 + 10
audio:580 + 11 + 13
video:601 + 6284 + 21
audio:604 + 11 + 3
audio:627 + 11 + 23
video:634 + 6242 + 7
audio:650 + 11 + 16
video:667 + 6249 + 17
audio:673 + 11 + 6
audio:697 + 11 + 24
video:701 + 5144 + 4
audio:720 + 11 + 19
video:734 + 4115 + 14
audio:743 + 11 + 9
audio:766 + 11 + 23
video:767 + 3930 + 1
audio:789 + 11 + 22
video:801 + 3935 + 12
audio:813 + 11 + 12
video:834 + 3870 + 21
audio:836 + 11 + 2
audio:859 + 11 + 23
video:868 + 3719 + 9
audio:882 + 11 + 14
video:901 + 3515 + 19
audio:906 + 11 + 5
audio:929 + 11 + 23
video:934 + 3674 + 5
audio:952 + 11 + 18
video:968 + 3622 + 16
audio:975 + 11 + 7
audio:998 + 11 + 23
video:1001 + 3226 + 3
audio:1022 + 11 + 21
video:1034 + 3217 + 12
audio:1045 + 11 + 11
audio:1068 + 11 + 23
video:1068 + 3671 + 0
audio:1091 + 11 + 23
video:1101 + 3540 + 10
audio:1115 + 11 + 14
video:1134 + 4139 + 19
audio:1138 + 11 + 4
audio:1161 + 11 + 23
video:1168 + 598 + 7
audio:1184 + 11 + 16
video:1201 + 325 + 17
audio:1207 + 11 + 6
audio:1231 + 11 + 24
video:1235 + 351 + 4
audio:1254 + 11 + 19
video:1268 + 281 + 14
audio:1277 + 11 + 9
audio:1300 + 11 + 23
video:1301 + 393 + 1
audio:1324 + 11 + 23
video:1335 + 253 + 11
audio:1347 + 11 + 12
video:1368 + 246 + 21
audio:1370 + 11 + 2
audio:1393 + 11 + 23
video:1401 + 373 + 8
audio:1416 + 11 + 15
video:1435 + 1061 + 19
audio:1440 + 11 + 5
audio:1463 + 11 + 23
video:1468 + 1625 + 5
audio:1486 + 11 + 18
video:1502 + 2129 + 16
audio:1509 + 11 + 7
audio:1533 + 11 + 24
video:1535 + 940 + 2
audio:1556 + 11 + 21
video:1568 + 427 + 12
audio:1579 + 11 + 11
audio:1602 + 11 + 23
video:1602 + 266 + 0
audio:1625 + 11 + 23
video:1635 + 333 + 10
audio:1649 + 11 + 14
video:1668 + 139 + 19
audio:1672 + 11 + 4
audio:1695 + 11 + 23
video:1702 + 183 + 7
audio:1718 + 11 + 16
video:1735 + 117 + 17
audio:1741 + 11 + 6
audio:1765 + 11 + 24
video:1768 + 102 + 3
audio:1788 + 11 + 20
video:1802 + 171 + 14
audio:1811 + 11 + 9
audio:1834 + 11 + 23
video:1835 + 167 + 1
audio:1858 + 11 + 23
video:1869 + 337 + 11
audio:1881 + 11 + 12
video:1902 + 206 + 21
audio:1904 + 11 + 2
audio:1927 + 11 + 23
video:1935 + 319 + 8
audio:1950 + 11 + 15
video:1969 + 9779 + 19
audio:1974 + 11 + 5
audio:1997 + 11 + 23
video:2002 + 199 + 5
audio:2020 + 11 + 18
video:2035 + 114 + 15
audio:2043 + 11 + 8
audio:2067 + 11 + 24
video:2069 + 57 + 2
audio:2090 + 11 + 21
video:2102 + 37 + 12
audio:2113 + 11 + 11
video:2135 + 37 + 22
audio:2136 + 11 + 1
audio:2159 + 11 + 23
video:2169 + 63 + 10
audio:2183 + 11 + 14
video:2202 + 37 + 19
audio:2206 + 11 + 4
audio:2229 + 11 + 23
video:2236 + 41 + 7
audio:2252 + 11 + 16
video:2269 + 37 + 17
audio:2276 + 11 + 7
audio:2299 + 11 + 23
video:2302 + 47 + 3
audio:2322 + 11 + 20
video:2336 + 37 + 14
audio:2345 + 11 + 9
audio:2368 + 11 + 23
video:2369 + 37 + 1
audio:2392 + 11 + 23
video:2402 + 48 + 10
audio:2415 + 11 + 13
video:2436 + 30 + 21
audio:2438 + 11 + 2
audio:2461 + 11 + 23
video:2469 + 59 + 8
audio:2485 + 11 + 16
video:2503 + 91 + 18
audio:2508 + 11 + 5
audio:2531 + 11 + 23
video:2536 + 38 + 5
audio:2554 + 11 + 18
video:2569 + 30 + 15
audio:2577 + 11 + 8
audio:2601 + 11 + 24
video:2603 + 57 + 2
audio:2624 + 11 + 21
video:2636 + 48 + 12
audio:2647 + 11 + 11
video:2669 + 49 + 22
audio:2670 + 11 + 1
audio:2694 + 11 + 24
video:2703 + 58 + 9
audio:2717 + 11 + 14
video:2736 + 52 + 19
audio:2740 + 11 + 4
audio:2763 + 11 + 23
video:2769 + 35 + 6
audio:2786 + 11 + 17
video:2803 + 35 + 17
audio:2810 + 11 + 7
audio:2833 + 11 + 23
video:2836 + 35 + 3
audio:2856 + 11 + 20
video:2870 + 35 + 14
audio:2879 + 11 + 9
audio:2902 + 11 + 23
video:2903 + 35 + 1
audio:2926 + 11 + 23
video:2936 + 35 + 10
audio:2949 + 11 + 13
video:2970 + 35 + 21
audio:2972 + 11 + 2
audio:2995 + 11 + 23
video:3003 + 229 + 8
audio:3019 + 11 + 16
video:3036 + 100 + 17
audio:3042 + 11 + 6
audio:3065 + 11 + 23
video:3070 + 25 + 5
audio:3088 + 11 + 18
video:3103 + 37 + 15
audio:3111 + 11 + 8
audio:3135 + 11 + 24
video:3136 + 33 + 1
audio:3158 + 11 + 22
video:3170 + 27 + 12
audio:3181 + 11 + 11
video:3203 + 27 + 22
audio:3204 + 11 + 1
audio:3228 + 11 + 24
video:3237 + 27 + 9
audio:3251 + 11 + 14
video:3270 + 27 + 19
audio:3274 + 11 + 4
audio:3297 + 11 + 23
video:3303 + 27 + 6
audio:3320 + 11 + 17
video:3337 + 27 + 17
audio:3344 + 11 + 7
audio:3367 + 11 + 23
video:3370 + 27 + 3
audio:3390 + 11 + 20
video:3403 + 27 + 13
audio:3413 + 11 + 10
audio:3437 + 11 + 24
video:3437 + 27 + 0
audio:3460 + 11 + 23
video:3470 + 27 + 10
audio:3483 + 11 + 13
video:3504 + 33 + 21
audio:3506 + 11 + 2
audio:3529 + 11 + 23
video:3537 + 33 + 8
audio:3553 + 11 + 16
video:3570 + 29 + 17
audio:3576 + 11 + 6
audio:3599 + 11 + 23
video:3604 + 170 + 5
audio:3622 + 11 + 18
video:3637 + 1058 + 15
audio:3646 + 11 + 9
audio:3669 + 11 + 23
video:3670 + 1477 + 1
audio:3692 + 11 + 22
video:3704 + 1812 + 12
audio:3715 + 11 + 11
video:3737 + 1650 + 22
audio:3738 + 11 + 1
audio:3762 + 11 + 24
video:3770 + 1762 + 8
audio:3785 + 11 + 15
video:3804 + 1677 + 19
audio:3808 + 11 + 4
audio:3831 + 11 + 23
video:3837 + 1948 + 6
audio:3855 + 11 + 18
video:3871 + 1493 + 16
audio:3878 + 11 + 7
audio:3901 + 11 + 23
video:3904 + 1939 + 3
audio:3924 + 11 + 20
video:3937 + 4327 + 13
audio:3947 + 11 + 10
audio:3971 + 11 + 24
video:3971 + 1475 + 0
audio:3994 + 11 + 23
video:4004 + 1785 + 10
audio:4017 + 11 + 13
video:4037 + 1663 + 20
audio:4040 + 11 + 3
audio:4063 + 11 + 23
video:4071 + 320 + 8
audio:4087 + 11 + 16
video:4104 + 382 + 17
audio:4110 + 11 + 6
audio:4133 + 11 + 23
video:4137 + 98 + 4
audio:4156 + 11 + 19
video:4171 + 69 + 15
audio:4180 + 11 + 9
audio:4203 + 11 + 23
video:4204 + 30 + 1
audio:4226 + 11 + 22
video:4238 + 38 + 12
audio:4249 + 11 + 11
video:4271 + 56 + 22
audio:4272 + 11 + 1
audio:4296 + 11 + 24
video:4304 + 70 + 8
audio:4319 + 11 + 15
video:4338 + 39 + 19
audio:4342 + 11 + 4
audio:4365 + 11 + 23
video:4371 + 30 + 6
audio:4389 + 11 + 18
video:4404 + 82 + 15
audio:4412 + 11 + 8
audio:4435 + 11 + 23
video:4438 + 30 + 3
audio:4458 + 11 + 20
video:4471 + 30 + 13
audio:4481 + 11 + 10
audio:4505 + 11 + 24
video:4505 + 341 + 0
audio:4528 + 11 + 23
video:4538 + 167 + 10
audio:4551 + 11 + 13
video:4571 + 69 + 20
audio:4574 + 11 + 3
audio:4598 + 11 + 24
video:4605 + 75 + 7
audio:4621 + 11 + 16
video:4638 + 173 + 17
audio:4644 + 11 + 6
audio:4667 + 11 + 23
video:4671 + 48 + 4
audio:4690 + 11 + 19
video:4705 + 42 + 15
audio:4714 + 11 + 9
audio:4737 + 11 + 23
video:4738 + 33 + 1
audio:4760 + 11 + 22
video:4771 + 38 + 11
audio:4783 + 11 + 12
video:4805 + 33 + 22
audio:4807 + 11 + 2
audio:4830 + 11 + 23
video:4838 + 33 + 8
audio:4853 + 11 + 15
video:4872 + 33 + 19
audio:4876 + 11 + 4
audio:4899 + 11 + 23
video:4905 + 56 + 6
audio:4923 + 11 + 18
video:4938 + 33 + 15
audio:4946 + 11 + 8
audio:4969 + 11 + 23
video:4972 + 33 + 3
audio:4992 + 11 + 20
video:5005 + 111 + 13
audio:5016 + 11 + 11
video:5038 + 61 + 22
audio:5039 + 11 + 1
audio:5062 + 11 + 23
video:5072 + 68 + 10
audio:5085 + 11 + 13
video:5105 + 33 + 20
audio:5108 + 11 + 3
audio:5132 + 11 + 24
video:5138 + 33 + 6
audio:5155 + 11 + 17
video:5172 + 33 + 17
audio:5178 + 11 + 6
audio:5201 + 11 + 23
video:5205 + 33 + 4
audio:5224 + 11 + 19
video:5239 + 33 + 15
audio:5248 + 11 + 9
audio:5271 + 11 + 23
video:5272 + 98 + 1
audio:5294 + 11 + 22
video:5305 + 33 + 11
audio:5317 + 11 + 12
video:5339 + 33 + 22
audio:5341 + 11 + 2
audio:5364 + 11 + 23
video:5372 + 33 + 8
audio:5387 + 11 + 15
video:5405 + 33 + 18
audio:5410 + 11 + 5
audio:5433 + 11 + 23
video:5439 + 33 + 6
audio:5457 + 11 + 18
video:5472 + 33 + 15
audio:5480 + 11 + 8
audio:5503 + 11 + 23
video:5506 + 50 + 3
audio:5526 + 11 + 20
video:5539 + 45 + 13
audio:5550 + 11 + 11
video:5572 + 28 + 22
audio:5573 + 11 + 1
audio:5596 + 11 + 23
video:5606 + 28 + 10
audio:5619 + 11 + 13
video:5639 + 28 + 20
audio:5642 + 11 + 3
audio:5666 + 11 + 24
video:5672 + 28 + 6
audio:5689 + 11 + 17
video:5706 + 28 + 17
audio:5712 + 11 + 6
audio:5735 + 11 + 23
video:5739 + 28 + 4
audio:5759 + 11 + 20
video:5772 + 28 + 13
audio:5782 + 11 + 10
audio:5805 + 11 + 23
video:5806 + 28 + 1
audio:5828 + 11 + 22
video:5839 + 49 + 11
audio:5851 + 11 + 12
video:5873 + 34 + 22
audio:5875 + 11 + 2
audio:5898 + 11 + 23
video:5906 + 4691 + 8
audio:5921 + 11 + 15
video:5939 + 104 + 18
audio:5944 + 11 + 5
audio:5968 + 11 + 24
video:5973 + 65 + 5
audio:5991 + 11 + 18
video:6006 + 89 + 15
audio:6014 + 11 + 8
audio:6037 + 11 + 23
video:6039 + 147 + 2
audio:6060 + 11 + 21
video:6073 + 70 + 13
audio:6084 + 11 + 11
video:6106 + 102 + 22
audio:6107 + 11 + 1
audio:6130 + 11 + 23
video:6139 + 48 + 9
audio:6153 + 11 + 14
video:6173 + 48 + 20
audio:6177 + 11 + 4
audio:6200 + 11 + 23
video:6206 + 48 + 6
audio:6223 + 11 + 17
video:6240 + 48 + 17
audio:6246 + 11 + 6
audio:6269 + 11 + 23
video:6273 + 48 + 4
audio:6293 + 11 + 20
video:6306 + 48 + 13
audio:6316 + 11 + 10
audio:6339 + 11 + 23
video:6340 + 48 + 1
audio:6362 + 11 + 22
video:6373 + 48 + 11
audio:6385 + 11 + 12
video:6406 + 48 + 21
audio:6409 + 11 + 3
audio:6432 + 11 + 23
video:6440 + 48 + 8
audio:6455 + 11 + 15
video:6473 + 48 + 18
audio:6478 + 11 + 5
audio:6502 + 11 + 24
video:6507 + 156 + 5
audio:6525 + 11 + 18
video:6540 + 106 + 15
audio:6548 + 11 + 8
audio:6571 + 11 + 23
video:6573 + 62 + 2
audio:6594 + 11 + 21
video:6607 + 53 + 13
audio:6618 + 11 + 11
video:6640 + 46 + 22
audio:6641 + 11 + 1
audio:6664 + 11 + 23
video:6673 + 46 + 9
audio:6687 + 11 + 14
video:6707 + 46 + 20
audio:6711 + 11 + 4
audio:6734 + 11 + 23
video:6740 + 46 + 6
audio:6757 + 11 + 17
video:6773 + 46 + 16
audio:6780 + 11 + 7
audio:6803 + 11 + 23
video:6807 + 46 + 4
audio:6827 + 11 + 20
video:6840 + 46 + 13
audio:6850 + 11 + 10
audio:6873 + 11 + 23
video:6874 + 46 + 1
audio:6896 + 11 + 22
video:6907 + 46 + 11
audio:6920 + 11 + 13
video:6940 + 46 + 20
audio:6943 + 11 + 3
audio:6966 + 11 + 23
video:6974 + 46 + 8
audio:6989 + 11 + 15
video:7007 + 62 + 18
audio:7012 + 11 + 5
audio:7036 + 11 + 24
video:7040 + 61 + 4
audio:7059 + 11 + 19
video:7074 + 47 + 15
audio:7082 + 11 + 8
audio:7105 + 11 + 23
video:7107 + 46 + 2
audio:7129 + 11 + 22
video:7140 + 46 + 11
audio:7152 + 11 + 12
video:7174 + 46 + 22
audio:7175 + 11 + 1
audio:7198 + 11 + 23
video:7207 + 46 + 9
audio:7221 + 11 + 14
video:7241 + 46 + 20
audio:7245 + 11 + 4
audio:7268 + 11 + 23
video:7274 + 46 + 6
audio:7291 + 11 + 17
video:7307 + 46 + 16
audio:7314 + 11 + 7
audio:7338 + 11 + 24
video:7341 + 46 + 3
audio:7361 + 11 + 20
video:7374 + 46 + 13
audio:7384 + 11 + 10
audio:7407 + 11 + 23
video:7407 + 46 + 0
audio:7430 + 11 + 23
video:7441 + 46 + 11
audio:7454 + 11 + 13
video:7474 + 46 + 20
audio:7477 + 11 + 3
audio:7500 + 11 + 23
video:7508 + 62 + 8
audio:7523 + 11 + 15
video:7541 + 59 + 18
audio:7546 + 11 + 5
audio:7570 + 11 + 24
video:7574 + 47 + 4
audio:7593 + 11 + 19
video:7608 + 46 + 15
audio:7616 + 11 + 8
audio:7639 + 11 + 23
video:7641 + 46 + 2
audio:7663 + 11 + 22
video:7674 + 46 + 11
audio:7686 + 11 + 12
video:7708 + 46 + 22
audio:7709 + 11 + 1
audio:7732 + 11 + 23
video:7741 + 46 + 9
audio:7755 + 11 + 14
video:7774 + 46 + 19
audio:7779 + 11 + 5
audio:7802 + 11 + 23
video:7808 + 46 + 6
audio:7825 + 11 + 17
video:7841 + 46 + 16
audio:7848 + 11 + 7
audio:7872 + 11 + 24
video:7875 + 4239 + 3
audio:7895 + 11 + 20
video:7908 + 63 + 13
audio:7918 + 11 + 10
audio:7941 + 11 + 23
video:7941 + 31 + 0
audio:7964 + 11 + 23
video:7975 + 27 + 11
audio:7988 + 11 + 13
video:8008 + 48 + 20
audio:8011 + 11 + 3
audio:8034 + 11 + 23
video:8041 + 46 + 7
audio:8057 + 11 + 16
video:8075 + 28 + 18
audio:8081 + 11 + 6
audio:8104 + 11 + 23
video:8108 + 27 + 4
audio:8127 + 11 + 19
video:8141 + 27 + 14
audio:8150 + 11 + 9
audio:8173 + 11 + 23
video:8175 + 34 + 2
audio:8197 + 11 + 22
video:8208 + 300 + 11
audio:8220 + 11 + 12
video:8242 + 1094 + 22
audio:8243 + 11 + 1
audio:8266 + 11 + 23
video:8275 + 1525 + 9
audio:8290 + 11 + 15
video:8308 + 1607 + 18
audio:8313 + 11 + 5
audio:8336 + 11 + 23
video:8342 + 1912 + 6
audio:8359 + 11 + 17
video:8375 + 1643 + 16
audio:8382 + 11 + 7
audio:8406 + 11 + 24
video:8408 + 1865 + 2
audio:8429 + 11 + 21
video:8442 + 1839 + 13
audio:8452 + 11 + 10
audio:8475 + 11 + 23
video:8475 + 2087 + 0
audio:8499 + 11 + 24
video:8509 + 1970 + 10
audio:8522 + 11 + 13
video:8542 + 1482 + 20
audio:8545 + 11 + 3
audio:8568 + 11 + 23
video:8575 + 1524 + 7
audio:8591 + 11 + 16
video:8609 + 1058 + 18
audio:8615 + 11 + 6
audio:8638 + 11 + 23
video:8642 + 65 + 4
audio:8661 + 11 + 19
video:8675 + 27 + 14
audio:8684 + 11 + 9
audio:8707 + 11 + 23
video:8709 + 27 + 2
audio:8731 + 11 + 22
video:8742 + 27 + 11
audio:8754 + 11 + 12
video:8775 + 27 + 21
audio:8777 + 11 + 2
audio:8800 + 11 + 23
video:8809 + 27 + 9
audio:8824 + 11 + 15
video:8842 + 27 + 18
audio:8847 + 11 + 5
audio:8870 + 11 + 23
video:8876 + 27 + 6
audio:8893 + 11 + 17
video:8909 + 27 + 16
audio:8916 + 11 + 7
audio:8940 + 11 + 24
video:8942 + 27 + 2
audio:8963 + 11 + 21
video:8976 + 27 + 13
audio:8986 + 11 + 10
audio:9009 + 11 + 23
video:9009 + 34 + 0
audio:9033 + 11 + 24
video:9042 + 34 + 9
audio:9056 + 11 + 14
video:9076 + 106 + 20
audio:9079 + 511 + 3
audio:9102 + 362 + 23
video:9109 + 262 + 7
audio:9125 + 828 + 16
video:9142 + 607 + 17
audio:9149 + 725 + 7
audio:9172 + 786 + 23
video:9176 + 718 + 4
audio:9195 + 759 + 19
video:9209 + 954 + 14
audio:9218 + 762 + 9
audio:9242 + 767 + 24
video:9243 + 1133 + 1
audio:9265 + 747 + 22
video:9276 + 1487 + 11
audio:9288 + 750 + 12
video:9309 + 1585 + 21
audio:9311 + 729 + 2
audio:9334 + 729 + 23
video:9343 + 1804 + 9
audio:9358 + 716 + 15
video:9376 + 2018 + 18
audio:9381 + 704 + 5
audio:9404 + 695 + 23
video:9409 + 2360 + 5
audio:9427 + 686 + 18
video:9443 + 2604 + 16
audio:9451 + 649 + 8
audio:9474 + 674 + 23
video:9476 + 2774 + 2
audio:9497 + 656 + 21
video:9510 + 2942 + 13
audio:9520 + 666 + 10
audio:9543 + 648 + 23
video:9543 + 2742 + 0
audio:9567 + 645 + 24
video:9576 + 2662 + 9
audio:9590 + 620 + 14
video:9610 + 2508 + 20
audio:9613 + 603 + 3
audio:9636 + 613 + 23
video:9643 + 2557 + 7
audio:9660 + 607 + 17
video:9676 + 2520 + 16
audio:9683 + 616 + 7
audio:9706 + 602 + 23
video:9710 + 2896 + 4
audio:9729 + 604 + 19
video:9743 + 2637 + 14
audio:9752 + 625 + 9
audio:9776 + 611 + 24
video:9776 + 2940 + 0
audio:9799 + 608 + 23
video:9810 + 2571 + 11
audio:9822 + 707 + 12
video:9843 + 13566 + 21
audio:9845 + 771 + 2
audio:9868 + 733 + 23
video:9877 + 1390 + 9
audio:9892 + 690 + 15
video:9910 + 1666 + 18
audio:9915 + 667 + 5
audio:9938 + 739 + 23
video:9943 + 1384 + 5
audio:9961 + 721 + 18
video:9977 + 1553 + 16
audio:9985 + 740 + 8
audio:10008 + 723 + 23
video:10010 + 2298 + 2
audio:10031 + 716 + 21
video:10043 + 3478 + 12
audio:10054 + 761 + 11
audio:10077 + 727 + 23
video:10077 + 3227 + 0
audio:10101 + 757 + 24
video:10110 + 3571 + 9
audio:10124 + 730 + 14
video:10143 + 1727 + 19
audio:10147 + 686 + 4
audio:10170 + 722 + 23

こちらもsampleのデータと同じ感じになってるみたいですね。

とりあえずFlazr改のデータをいままでxuggleにまわしていたんですが冒頭のtimestampが0の映像Flvタグデータが大量に流れ込む部分でIContainer.readNextPacketの動作が腐るっぽいですね。実際動作ログでは、Video decode errorがはじめに大量にきてから、変換がはじまりますから・・・

ということは僕が次にやるべきことは、Flazr改の動作で変換がFMSからデータを落とす形になったとしてもH.264、AACの先頭のメディアFlvタグは保持しておいて、次の動画のキーフレームが来るまでFlvタグを捨てる。開始時のtimestampを保持しておいて、0秒からきちんとはじまるようにする。
この2点やっとけばうまく動作するようにできるかもしれない・・・

以上ながながとした記事になりましたが、将来の僕がどうだったっけ?と思ったときの役にたたせるために記録しておきます。