我正在使用humble-video的RecordAndEncodeVideo.java制作视频。
我现在想要结合两个视频首先是录制的视频,第二个是在我的system
上预先存储的相同帧速率和分辨率的视频。由于限制,我想通过在java中使用简单视频apis来做到这一点。如果有人使用它,请指导我如何做到这一点。
这是我试过的代码:
public static void combineVideo() throws InterruptedException, IOException {
final Demuxer demuxer = Demuxer.make();
demuxer.open("a.mp4", null, false, true, null, null);
final Muxer muxer = Muxer.make("b.mp4", null, null);
final MuxerFormat format = muxer.getFormat();
final MediaPacket packet = MediaPacket.make();
muxer.open(null, null);
while (demuxer.read(packet) >= 0) {
muxer.write(packet, false);
}
muxer.close();
demuxer.close();
}
更新
我想连接两个视频文件并保存为新的视频文件。我知道在之前的问题中已经提到过,例如
但大多数答案链接到不可用的资源或库。任何人都可以指导我一些资源。任何代码段都可能有所帮助。
大多数编解码器也不支持连接 - 它不会帮助您将比特流连接在一起。
但是,如果您确定编解码器具有相同的属性,则某些容器格式支持串联。 MPEG-TS就是其中之一。您可以将视频复制到传输流中而无需重新编码,然后使用普通文件操作连接传输流。
我无法打开现有文件的复用器并附加到它,但是可以创建一个新的复用器并将多个解复用器中的数据写入其中。还有一件事要做的是移动数据包的dts / pts,使它们在结果文件中递增。
下面是一个工作代码片段,用于将多个avi连接成一个(假设所有源文件中的编解码器,时基等相同):
private static void merge(File aggregate, Collection<File> segments) throws InterruptedException, IOException {
Muxer muxer = Muxer.make(aggregate.toString(), null, "avi");
final MediaPacket packet = MediaPacket.make();
long dts_offset = 0;
long pts_offset = 0;
for (File segment : segments) {
Demuxer demuxer = Demuxer.make();
demuxer.open(segment.toString(), null, false, true, null, null);
if (muxer.getState() == State.STATE_INITED) {
int numStreams = demuxer.getNumStreams();
for (int s = 0; s < numStreams; s++) {
DemuxerStream demuxerStream = demuxer.getStream(s);
Decoder decoder = demuxerStream.getDecoder();
muxer.addNewStream(decoder);
}
muxer.open(null, null);
}
long dts_max = 0;
long pts_max = 0;
while (demuxer.read(packet) >= 0) {
if (packet.isComplete()) {
packet.setDts(packet.getDts() + dts_offset);
packet.setPts(packet.getPts() + pts_offset);
dts_max = packet.getDts() + 1;
pts_max = packet.getPts() + 1;
muxer.write(packet, false);
}
}
dts_offset = dts_max;
pts_offset = pts_max;
demuxer.close();
}
muxer.close();
}