如何在Java中将两个视频连接/合并到一个新的视频文件中?
我正在使用的创建一个视频 我现在想合并两个视频,第一个是录制的视频,第二个是在我的如何在Java中将两个视频连接/合并到一个新的视频文件中?,java,video,merge,concatenation,Java,Video,Merge,Concatenation,我正在使用的创建一个视频 我现在想合并两个视频,第一个是录制的视频,第二个是在我的系统上以相同帧速率和分辨率预先存储的视频。由于限制,我想通过在java中使用简陋的视频API来实现这一点。如果有人用过,请指导我怎么做 以下是我尝试的代码: public static void combineVideo() throws InterruptedException, IOException { final Demuxer demuxer = Demuxer.make(); dem
系统上以相同帧速率和分辨率预先存储的视频。由于限制,我想通过在java中使用简陋的视频API来实现这一点。如果有人用过,请指导我怎么做
以下是我尝试的代码:
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就是其中之一。您可以将视频复制到传输流中而无需重新编码,然后使用正常的文件操作连接传输流。我无法为现有文件打开muxer并附加到该文件,但可以创建新的muxer并将多个解复用器中的数据写入其中。还有一件事要做,就是移动数据包的dts/PT,使它们在生成的文件中递增
下面是将多个avi连接为一个的工作代码段(假设所有源文件中的编解码器、时基等相同):
private static void merge(文件聚合、集合段)引发InterruptedException、IOException{
Muxer Muxer=Muxer.make(aggregate.toString(),null,“avi”);
final mediapack packet=mediapack.make();
长dts_偏移=0;
长pts_偏移=0;
用于(文件段:段){
Demuxer Demuxer=Demuxer.make();
open(segment.toString(),null,false,true,null,null);
if(muxer.getState()==State.State\u INITED){
int numStreams=demuxer.getNumStreams();
对于(int s=0;s=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(数据包,false);
}
}
dts_偏移量=dts_最大值;
pts_偏移=pts_最大值;
demuxer.close();
}
muxer.close();
}
对视频数据的任何操作通常已经在ffmpeg及其库中实现。虽然这不是Java代码库,但它为您提供了一个关于如何进行常见视频数据转换(也包括连接视频数据)的开源参考
您可能想看看ffmpeg实现了什么
也就是说,您可能想考虑不实现已经在ffmpeg中得到验证和测试的东西。如果Java代码库在体系结构中的可移植性不是一个主要问题,那么最好从Java代码库中调用ffmpeg的库,以执行您需要执行的复杂视频任务。到目前为止,您做了哪些尝试?我怀疑有人会愿意为你做这个项目。他们可能会帮你完成你目前为止的尝试。@Jimenemex请看问题,我已经更新了它?你有没有其他库可以将两个视频一个接一个地用Java组合成一个视频,将其转换为传输流,然后将传输流连接在一起。@ANUJSINGH请参考ffmpeg检查我下面的答案。
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();
}