我想使用java库剪切和合并一些avi视频(相同的编解码器,相同的分辨率,相同的fps)。
现在我正在尝试使用基于ffmpeg的Humble视频(https://github.com/artclarke/humble-video)。
我想先使用搜索功能剪切输入视频,但结果不正确。
这是我的代码。
public void cutjob(String input, String output, int starttime) {
final Demuxer demuxer = Demuxer.make();
final Muxer muxer = Muxer.make(output, null, "avi");
try {
demuxer.open(input, null, false, true, null, null);
final MuxerFormat format = MuxerFormat.guessFormat("avi", null, null);
int n = demuxer.getNumStreams();
final Decoder[] decoders = new Decoder[n];
for (int i = 0; i < n; i++) {
final DemuxerStream ds = demuxer.getStream(i);
decoders[i] = ds.getDecoder();
final Decoder d = decoders[i];
if (d != null) {
if (format.getFlag(MuxerFormat.Flag.GLOBAL_HEADER))
d.setFlag(Coder.Flag.FLAG_GLOBAL_HEADER, true);
d.open(null, null);
muxer.addNewStream(d);
}
}
muxer.open(null, null);
demuxer.seek(-1, Long.MIN_VALUE, (long)starttime* Global.getDefaultTimeBase().getDenominator(), Long.MAX_VALUE, Demuxer.SeekFlag.SEEK_ANY.swigValue());
final MediaPacket packet = MediaPacket.make();
long dts = -1;
while (demuxer.read(packet) >= 0) {
System.out.println("dts:"+packet.getDts() + ",pts:"+packet.getPts());
final Decoder d = decoders[packet.getStreamIndex()];
if (packet.isComplete() && d != null) {
dts = dts == -1 ? packet.getDts() : dts;
packet.setDts(packet.getDts() - dts);
packet.setPosition(-1);
muxer.write(packet, false);
}
}
muxer.close();
demuxer.close();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
视频源长约190秒,我将“starttime”设置为180, 想要减少最后10秒并写入新的avi文件。
输出avi文件长10秒,但只有视频的最后5s是正确的,前5s似乎没有数据。
我的代码有什么问题。 谢谢。