Java Android将2个Mp4字节数组附加在一起,然后输出1个Mp4文件(其中最终视频是第一个视频加上第二个视频)

Java Android将2个Mp4字节数组附加在一起,然后输出1个Mp4文件(其中最终视频是第一个视频加上第二个视频),java,android,Java,Android,嗨,我在这方面遇到了很多麻烦,我有两个文件,都是Mp4格式,读入FileInputStreams,然后读入ByteArrayOutputStreams。然后,我尝试使用另一个ByteArrayOutputStream[finalOutputStream]和write()来追加两个字节数组。最后,我使用FileOutputStream进行写入(finalOutputStream.toByteArray()),刷新,关闭。当我在手机上查找视频时,会出现一个“最终”视频,该视频应该包含两个组合视频,其

嗨,我在这方面遇到了很多麻烦,我有两个文件,都是Mp4格式,读入FileInputStreams,然后读入ByteArrayOutputStreams。然后,我尝试使用另一个ByteArrayOutputStream[finalOutputStream]和write()来追加两个字节数组。最后,我使用FileOutputStream进行写入(finalOutputStream.toByteArray()),刷新,关闭。当我在手机上查找视频时,会出现一个“最终”视频,该视频应该包含两个组合视频,其大小看起来就像两个部分的大小加在一起。。但当我看视频时,它只是第二部分-u-。。。这就像第二部分覆盖了第一部分,但不知何故,大小增加了?。。。这里有一些代码

    File fileOne = new File(fileLongName);
    File fileTwo = new File(mediaStorageDir.getPath() + File.separator +"VID_TUTPART_"+ (foo-1) + ".mp4");
    FileInputStream fisOne = new FileInputStream(fileOne);
    FileInputStream fisTwo = new FileInputStream(fileTwo);

    int bufferSize = 1024;
    //FileOne
    byte[] buffer = new byte[bufferSize];
    ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();

    //FileTwo
    byte[] bufferTwo = new byte[bufferSize];
    ByteArrayOutputStream byteBufferTwo = new ByteArrayOutputStream();

    int len = 0;
    //FileOne to bytebuffer
    while ((len = fisOne.read(buffer)) != -1) {
      byteBuffer.write(buffer, 0, len);
    }
    //FileTwo to bytebuffer
    while ((len = fisTwo.read(bufferTwo)) != -1) {
      byteBufferTwo.write(buffer, 0, len);
    }
    byte[] byteArrayOne = byteBuffer.toByteArray();
    byte[] byteArrayTwo = byteBuffer.toByteArray();

    ByteArrayOutputStream finalOutputStream = new ByteArrayOutputStream( );
    finalOutputStream.write( byteArrayOne );
    finalOutputStream.write( byteArrayTwo );

    int counterFileNumber = 0;
    while(new File(mediaStorageDir.getPath() + File.separator +"VID_TO_TUTFIN_"+ counterFileNumber + ".mp4").exists()){
        counterFileNumber++;
    }

    String outputFileNameString = mediaStorageDir.getPath() + File.separator +"VID_TO_TUTFIN_"+ counterFileNumber + ".mp4";
    File outputFile = new File(outputFileNameString);
    FileOutputStream fos = new FileOutputStream(outputFile);
    fos.write(finalOutputStream.toByteArray());
    fos.flush();
    fos.close();

如果您只是简单地制作一个附加视频,它将不起作用,您还需要重写标题

我最近通过使用

然后你可以按照

MovieCreator mc=新的MovieCreator();
Movie video=mc.build(Channels.newChannel(AppendExample.class.getResourceAsStream(“/count video.mp4”));
Movie audio=mc.build(Channels.newChannel(AppendExample.class.getResourceAsStream(“/count english audio.mp4”));
List videoTracks=video.getTracks();
setTracks(新LinkedList());
List audioTracks=audio.getTracks();
用于(跟踪视频跟踪:视频跟踪){
addTrack(新的AppendTrack(videoTrack,videoTrack));
}
用于(音轨音轨:音轨){
video.addTrack(新的AppendTrack(audioTrack,audioTrack));
}
IsoFile out=新建默认MP4Builder().build(视频);
FileOutputStream fos=新的FileOutputStream(新文件(String.format(“output.mp4”));
out.getBox(fos.getChannel());
fos.close();

@Benoit在你的帮助下想出了这个。。希望它能帮助别人

    File fileOne = new File(mediaStorageDir.getPath() + File.separator +"theNameOfMyFirstVideo.mp4");
    File fileTwo = new File(mediaStorageDir.getPath() + File.separator +"theNameOfMySecondVideo.mp4");
    FileInputStream fisOne = new FileInputStream(fileOne);
    FileInputStream fisTwo = new FileInputStream(fileTwo);      

    Movie video = MovieCreator.build(Channels.newChannel(fisOne));
    Movie videoTwo = MovieCreator.build(Channels.newChannel(fisTwo));

    List<Track> videoTracks = video.getTracks();
    Track testOneVideoTrack = videoTracks.get(0);
    video.setTracks(new LinkedList<Track>());

    List<Track> videoTwoTracks = videoTwo.getTracks();
    Track testTwoVideoTrack = videoTwoTracks.get(0);

    video.addTrack(new AppendTrack(testTwoVideoTrack,testOneVideoTrack));

    int counterFileNumber = 0;
    while(new File(mediaStorageDir.getPath() + File.separator +"VID_TO_TUTFIN_"+ counterFileNumber + ".mp4").exists()){
        counterFileNumber++;
    }

    IsoFile out = new DefaultMp4Builder().build(video);
    String outputFileNameString = mediaStorageDir.getPath() + File.separator +"VID_TO_TUTFIN_"+ counterFileNumber + ".mp4";
    FileOutputStream fos = new FileOutputStream(new File(String.format(outputFileNameString)));
    out.getBox(fos.getChannel());
    fos.close();
File fileOne=新文件(mediaStorageDir.getPath()+File.separator+“theNameOfMyFirstVideo.mp4”);
File fileTwo=新文件(mediaStorageDir.getPath()+File.separator+“theNameOfMySecondVideo.mp4”);
FileInputStream fisOne=新的FileInputStream(fileOne);
FileInputStream fisTwo=新的FileInputStream(fileTwo);
Movie video=MovieCreator.build(Channels.newChannel(fisOne));
Movie videoTwo=MovieCreator.build(Channels.newChannel(fistow));
List videoTracks=video.getTracks();
Track testOneVideoTrack=videoTracks.get(0);
setTracks(新LinkedList());
列出videoTwoTracks=videoTwo.getTracks();
Track testTwoVideoTrack=videoTwoTracks.get(0);
addTrack(新的AppendTrack(testTwoVideoTrack,testOneVideoTrack));
int反卷数=0;
while(新文件(mediaStorageDir.getPath()+File.separator+“VID_TO_TUTFIN”+counterFileNumber+“.mp4”).exists()){
反卷数++;
}
IsoFile out=新建默认MP4Builder().build(视频);
字符串outputFileNameString=mediaStorageDir.getPath()+File.separator+“VID_TO_TUTFIN”+counterFileNumber+”.mp4”;
FileOutputStream fos=新的FileOutputStream(新文件(String.format(outputFileNameString));
out.getBox(fos.getChannel());
fos.close();

调试时,我查看了videoTracks列表,发现第一个元素[0]与“vide”有关,元素[1]带有“soun”,因此开始使用它。

感谢您的快速响应!我以前试过,但可能把它搞砸了,这对安卓来说还是个新鲜事。1.)我需要该网站上的所有.jar文件吗?2.)在.apk的打包过程中,这些库是否会被修剪?3.)我有一个同时包含视频和音频的文件(mp4),然后是另一个同时包含视频和音频的文件。。是否必须将每个文件拆分为每个文件?。。再试一次。。当我尝试你的代码时(得到isoviewer-2.0-RC-23.jar和smooth-streaming-fragmenter-1.0-RC-23.jar)[遇到另一个问题[2013-04-28 23:56:09-Dex Loader]无法执行Dex:Multiple Dex file define Lcom/coremedia/iso/AbstractBoxParser$1;]并在这里解决了这个问题:我的答案是:)]为视频更改了音频2..等..等。。现在我的最后一个视频是第二个视频,附加了。。第二段视频。。这是连续两次播放的第二个视频。。将更新更多-我只使用了这个:com.googlecode.mp4parser isoparser 1.0-RC-22顺便说一句,我有一些内存问题,这个大视频库也可以将视频与ffmpeg合并,但是你需要创建自己的本地库,这是第二个挑战。你对输出文件的旋转有任何问题吗?我的在风景中旋转出来,我需要它留在里面portrait@EdmundRojas您是否找到了问题的解决方案,我面临着相同的问题。@rb16我认为不同设备的旋转方式不同,我看到一些设备上的照片/视频旋转出来,在其他设备上也能完美地表现出来。但我录制的视频具有相同的旋转,播放时看起来不错。合并后,输出视频旋转到90度。我在5台以上的设备上尝试过,但都面临相同的问题。@rb16我有一段时间没有做过这方面的工作,但我相信当我做了这件事时,我有两个景观视频,它出来的景观。如果我是你,我会记录一系列不同的场景,找出问题所在。景观+景观=?|景观+门户=?|肖像+肖像=?
    File fileOne = new File(mediaStorageDir.getPath() + File.separator +"theNameOfMyFirstVideo.mp4");
    File fileTwo = new File(mediaStorageDir.getPath() + File.separator +"theNameOfMySecondVideo.mp4");
    FileInputStream fisOne = new FileInputStream(fileOne);
    FileInputStream fisTwo = new FileInputStream(fileTwo);      

    Movie video = MovieCreator.build(Channels.newChannel(fisOne));
    Movie videoTwo = MovieCreator.build(Channels.newChannel(fisTwo));

    List<Track> videoTracks = video.getTracks();
    Track testOneVideoTrack = videoTracks.get(0);
    video.setTracks(new LinkedList<Track>());

    List<Track> videoTwoTracks = videoTwo.getTracks();
    Track testTwoVideoTrack = videoTwoTracks.get(0);

    video.addTrack(new AppendTrack(testTwoVideoTrack,testOneVideoTrack));

    int counterFileNumber = 0;
    while(new File(mediaStorageDir.getPath() + File.separator +"VID_TO_TUTFIN_"+ counterFileNumber + ".mp4").exists()){
        counterFileNumber++;
    }

    IsoFile out = new DefaultMp4Builder().build(video);
    String outputFileNameString = mediaStorageDir.getPath() + File.separator +"VID_TO_TUTFIN_"+ counterFileNumber + ".mp4";
    FileOutputStream fos = new FileOutputStream(new File(String.format(outputFileNameString)));
    out.getBox(fos.getChannel());
    fos.close();