2012年5月24日木曜日

xuggleにh.264変換させた。

あってるかはわからない。でも、一応それっぽいHexはDumpできた。


http://code.google.com/p/xuggle/source/browse/#svn%2Ftrunk%2Fjava%2Fxuggle-xuggler-red5
ベースはここのコードですが、変更点を羅列しておきます。
自分用メモ
VideoTranscoderDemo
220行目あたり動画コーデック指定を次のようにする。

outputStreamInfo.setVideoWidth(320);
outputStreamInfo.setVideoHeight(240);
outputStreamInfo.setVideoBitRate(300000);
outputStreamInfo.setVideoFrameRate(IRational.make(1, 25));
outputStreamInfo.setVideoCodec(ICodec.ID.CODEC_ID_H264);
outputStreamInfo.setVideoGlobalQuality(0);

560行目あたり動画コーダーの指定の部分。
outCoder.setCodec(outCodec);
outCoder.setWidth(mOutputInfo.getVideoWidth());
outCoder.setHeight(mOutputInfo.getVideoHeight());
outCoder.setPixelType(mOutputInfo.getVideoPixelFormat());
outCoder.setGlobalQuality(mOutputInfo.getVideoGlobalQuality());
outCoder.setBitRate(mOutputInfo.getVideoBitRate());
outCoder.setFrameRate(mOutputInfo.getVideoFrameRate());
outCoder.setNumPicturesInGroupOfPictures(mOutputInfo.getVideoNumPicturesInGroupOfPictures());
outCoder.setProperty("coder", "1");
// outCoder.setProperty("flags", "+loop");
outCoder.setProperty("cmp", "+chroma");
outCoder.setProperty("partitions", "+parti8x8+parti4x4+partp8x8+partb8x8");
outCoder.setProperty("me_method", "hex");
outCoder.setProperty("subq", "7");
outCoder.setProperty("me_range", "16");
outCoder.setProperty("g", "250");
outCoder.setProperty("keyint_min", "25");
outCoder.setProperty("sc_threshold", "40");
outCoder.setProperty("i_qfactor", "0.71");
outCoder.setProperty("b_strategy", "1");
outCoder.setProperty("qcomp", "0.6");
outCoder.setProperty("qmin", "10");
outCoder.setProperty("qmax", "21");
outCoder.setProperty("qdiff", "4");
outCoder.setProperty("bf", "3");
outCoder.setProperty("refs", "3");
outCoder.setProperty("directpred", "1");
outCoder.setProperty("trellis", "1");
// outCoder.setProperty("flags2", "+mixed_refs+wpred+dct8x8+fastpskip+mbtree");
outCoder.setProperty("wpredp", "2");
outCoder.setFlag(IStreamCoder.Flags.FLAG_LOOP_FILTER, true);
outCoder.setFlag(IStreamCoder.Flags.FLAG2_MIXED_REFS, true);
outCoder.setFlag(IStreamCoder.Flags.FLAG2_WPRED, true);
outCoder.setFlag(IStreamCoder.Flags.FLAG2_8X8DCT, true);
outCoder.setFlag(IStreamCoder.Flags.FLAG2_FASTPSKIP, true);
// outCoder.setFlag(IStreamCoder.Flags.FLAG, true);

こんな感じにする。
ffpresetが適応できなかったので、要は設定データをすべてsetPropertyで記述。ただしsetFlagだけは、別途記述があるみたいなので、そっちを利用する。
mbtreeだけ設定方法がみつからなかったので削除。

で、上図のようにpictureエンコードが走りデータが出力されるようになった。
あー厳しい戦いだった・・・これでmpegtsのコンテナ方式さえ解読できれば、自力でtsパケットつくれそう。


0 件のコメント:

コメントを投稿