Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中将两个视频连接/合并到一个新的视频文件中?_Java_Video_Merge_Concatenation - Fatal编程技术网

如何在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();
    }