1

こんにちは、私はこれで多くの問題を抱えています.2つのファイルがあり、どちらもMp4形式で、それらをFileInputStreamsに読み込み、次にByteArrayOutputStreamsに読み込みます。次に、別の ByteArrayOutputStream [finalOutputStream] を使用して 2 つのバイト配列を追加し、2 つを write() しようとします。最後に、FileOutputStream を使用して write(finalOutputStream.toByteArray())、フラッシュ、クローズします。携帯電話でビデオを探すと、2 つのビデオを結合した「最終」ビデオがあり、2 つの部分のサイズを合わせたようなサイズになっています..しかし、ビデオを見ると、 2 番目の部分 --- ... 2 番目の部分が最初の部分を上書きするようなものですが、どういうわけかサイズが大きくなりますか?... いくつかのコードがあります..

    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();
4

2 に答える 2

2

@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();

私がデバッグしていたとき、私はList videoTracksを見て、最初の要素[0]で「ビデオ」について何かがあり、要素[1]には「サウンド」があったので、それで作業を始めました..

于 2013-04-29T05:09:18.610 に答える
1

ビデオを一緒に追加するだけでは機能しません。ヘッダーも書き直す必要があります。

最近mp4parserを使用してこれを行いました

次に、サンプルに従うことができます

MovieCreator mc = new 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<Track> videoTracks = video.getTracks();
video.setTracks(new LinkedList<Track>());

List<Track> audioTracks = audio.getTracks();


for (Track videoTrack : videoTracks) {
   video.addTrack(new AppendTrack(videoTrack, videoTrack));
}
for (Track audioTrack : audioTracks) {
   video.addTrack(new AppendTrack(audioTrack, audioTrack));
}

IsoFile out = new DefaultMp4Builder().build(video);
FileOutputStream fos = new FileOutputStream(new File(String.format("output.mp4")));
out.getBox(fos.getChannel());
fos.close();
于 2013-04-28T21:01:58.350 に答える