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

0 件のコメント:

コメントを投稿