1

xugglerを使用して一連の画像をMP4ビデオにエンコードしようとしています。ただし、タイムベース/フレームレートの問題に頭を悩ませようとすると、頭がおかしくなります。私はまともなビデオをエンコードすることができないようです。例を使用してConverter.java、私は持っています

IRational num = IRational.make(24, 1);
outStreamCoder.setFrameRate(num);
outStreamCoder.setTimeBase(IRational.make(num.getDenominator(),  num.getNumerator()));

...

long tsOffset = 0;
if (outStream.getStartTime() != Global.NO_PTS && outStream.getStartTime() > 0
            && outStream.getTimeBase() != null)
{
        IRational defTimeBase = IRational.make(1, (int) Global.DEFAULT_PTS_PER_SECOND);
        tsOffset = defTimeBase.rescale(outStream.getStartTime(), outStream.getTimeBase());
}

....

long timeStamp = (3600 * count); // experimenting
IVideoPicture outFrame = converter.toPicture(worksWithXugglerBufferedImage, timeStamp);
if (outFrame.getTimeStamp() != Global.NO_PTS)
    outFrame.setTimeStamp(outFrame.getTimeStamp() - tsOffset);

30枚の画像の場合、エンコードされた期間は1秒よりはるかに短くなります。1秒強になると思います。誰かが私を助けてくれますか、これは私をしばらくの間当惑させました!

4

1 に答える 1

0

だから私はばかだったことがわかりました!H.264でエンコードされたファイルにtimeStamp基づいてフレームを割り当てていました。私は本当に最初のフレームからマイクロ秒単位の時間を割り当てられるべきでした。(例:の倍数)。したがって、私のコードは次のようになっているはずです。timebase(1/90,000)(1e6/fps)

IRational fps = IRational.make(24, 1);
outStreamCoder.setFrameRate(fps);
outStreamCoder.setTimeBase(IRational.make(fps.getDenominator(),  fps.getNumerator()));

...

long timeStamp = (1e6/fps.getNumerator() * count);
于 2011-11-23T08:45:56.290 に答える