我正在尝试使用IMediaWriter将mp4转换为ts。视频编码成功,但节奏非常高。
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 :(得分:0)
我已经解决了这个问题并编写了答案供将来参考。问题是视频编码的时间戳。我们需要从IVideoPictureEvent
读取时间戳。
public void onVideoPicture(IVideoPictureEvent event) {
mediaWriter.encodeVideo(0,event.getImage(),event.getTimeStamp(TimeUnit.MICROSECONDS).longValue(), TimeUnit.NANOSECONDS);
}