なぜだかはわからないけど、そうなるみたい。という話。
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 件のコメント:
コメントを投稿