2012年6月4日月曜日

red5 + xuggleでhttpLiveStreamingをやってみた。

最近いろいろやってみた結果。

ソースコードはここ。
https://github.com/taktod/streaming/tree/mediastreaming

とりあえずmpegtsの動作はできたんですが、利用しているsakuraのvpsだとスペック的にたりないのか、リアルタイム視聴がうまくできなかった。再生が追いついてしまい、次のsegmentがダウンロードされるまでとびが発生しました。

いくつか覚え書き:
1:基本的にFlvDataQueueにflvとして成立するデータをいれてやって、FlvDataHandlerがそのデータを適宜正しく応答すれば、ffmpegのどんなコンバートでも実行可能っぽい。
(なので、flazrのダウンロードを入力ベースにすることも可能なはず。まだつくってないけど。)

2:ただしh.263のdisposable innerframeは解釈できないっぽいので、StreamListenerの動作で捨てている。
(無理矢理innerframeに変更したデータを作ってみましたが、やはり解釈できませんでした。最新のxuggleなら対処できるのかもしれない。)

3:変換は次のフローで実行している。
1:inputContainerからパケットを取り出す。
2:デコードする。
3:入力と出力の形式が違う場合はリサンプリングを実行する。
4:エンコードする。
5:outputContainerに渡す。
(1が済んだ時点で、ファイルに付いている拡張命令は取り除かれ、4が済んだ時点では、ファイルの形式になっていない生データが応答される。
映像の場合はデコードがおわったタイミングで画像になる。(BufferedImageとして扱うことが可能なので、このタイミングでモノクロにしたり画像に適当なものを書き込んだりできます。))

4:mpegtsをセグメントに分けるときには、映像のキーフレームを先頭にしてわけてやるといい感じの動作になるようです。
(キーフレームを無視して、フレームだけの解釈で実行すると、場所によっては、なかなか再生がはじまらなかったり、映像が始めに乱れることがありました。なお、以前紹介したcで書かれたsegmenterでは、単純に切り分けただけではないみたいです。)


xuggleのインストールがすこぶる面倒だし、ffmpegの変換パラメーターの吟味がややこしかったのに、いまさらリアルタイムに動作できないなんて・・・ひどすぎる。
まぁ、でも同じサーバーでやろうとしたら、並列処理がうまくいかないだけなので、別のサーバーにアップロードして、そこでユーザーに映像をながす・・・というやり方ならまだ希望があるかも。

ちなみにとびとびではありましたが、最速で7秒程度の遅延(単に動画が追いついただけですが)にすることはできた。

追記:red5の外部ツール対応が微妙っぽいので、FlashMediaLiveEncoderとかXSplitとかつかったら、またいろいろと問題がでるかもしれない。

0 件のコメント:

コメントを投稿