2011-11-21 4 views
1

일련의 이미지를 xuggler가있는 MP4 비디오로 인코딩하려고합니다. 그러나, timebase/framerate 문제에 대한 내 머리를 감싸려고하면 미친 듯이 날 뛰게됩니다! 괜찮은 비디오를 인코딩 한 것처럼 보이지 않습니다. Converter.java 예를 사용하여, 나는 30 개 이미지의 경우Xuggler H264 FPS 인코딩 문제

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); 

이, 인코딩 시간은 1 초보다 훨씬 적습니다. 나는 그것이 단지 1 초가 넘을 것으로 기대한다. 아무도 나를 도와주세요,이 나를 당분간 당황하게 했어!

답변

0

그래서 나는 바보 인 것을 알게되었습니다! H.264로 인코딩 된 파일의 timebase을 기반으로 프레임 timeStamp을 지정했습니다. (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);