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

0 件のコメント:

コメントを投稿