2015-08-15 49 views
0

我試圖用IMediaWriter將mp4轉換爲ts。視頻編碼成功,但節奏非常高。xuggler中編碼視頻的速度很高

IContainer container = IContainer.make(); 
container.open(input, IContainer.Type.READ,null); 
mediaReader = ToolFactory.makeReader(container); 
mediaReader.setBufferedImageTypeToGenerate(BufferedImage.TYPE_3BYTE_BGR); 
mediaReader.addListener(new MediaListener()); 
for(int i=0; i< container.getNumStreams();i++){ 
    if(container.getStream(i).getStreamCoder().getCodecType() == Type.CODEC_TYPE_VIDEO){ 
     FRAME_RATE = container.getStream(i).getFrameRate(); 

    } 
    else if(container.getStream(i).getStreamCoder().getCodecType() == Type.CODEC_TYPE_AUDIO){ 
     sampleRate = container.getStream(i).getStreamCoder().getSampleRate(); 
    } 
} 
mediaWriter = ToolFactory.makeWriter(output); 
mediaWriter.addVideoStream(0, 0, 
      FRAME_RATE, 
      640,480); 

startTime = System.nanoTime(); 
while (mediaReader.readPacket() == null) ; 
mediaWriter.close(); 
mediaReader.close(); 

監聽

public void onVideoPicture(IVideoPictureEvent event) { 
    mediaWriter.encodeVideo(0,event.getImage(),System.nanoTime()-startTime, TimeUnit.NANOSECONDS); 

} 

注:我知道這一點:mediaReader.addListener(mediaWriter)。但我想像我的代碼手動轉換它。

回答

0

我已經解決了這個問題,併爲將來的參考寫回答。問題在於視頻編碼的時間戳。我們需要從IVideoPictureEvent中讀取時間戳。

public void onVideoPicture(IVideoPictureEvent event) { 
    mediaWriter.encodeVideo(0,event.getImage(),event.getTimeStamp(TimeUnit.MICROSECONDS).longValue(), TimeUnit.NANOSECONDS); 

}