2012年11月23日金曜日

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に対応したなにかしらをつくらないとだめですね。

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


0 件のコメント:

コメントを投稿