создать mp4 из картинок и mp3 java с помощью xuggler

Я пытаюсь объединить список изображений в фильм mp4 с добавлением файла mp3. Длину фильма пользователь может выбрать либо из длины mp3 файла, либо выбрать ее вручную. И если пользователь выбирает ручной (длина!=длина mp3-файла), mp3-файл должен быть обрезан или зациклен.

Нет, работает с картинками, но без звука :(

private void convertImageToVideo() {

    IMediaWriter writer = ToolFactory.makeWriter(outputFilename);

    long delay = videotime / PicPathList.size();

    long milliseconds = 0;

    //adds Pictures to the mp4 stream
    for (int i = 0; i < PicPathList.size(); i++) {



        BufferedImage bi;
        try {
            bi = ImageIO.read(new File(PicPathList.get(i)));
            bi = Tools.prepareForEncoding(bi);

            int width=bi.getWidth();
            int height=bi.getHeight();

            if(width%2==1){
                width++;
            }

            if(height%2==1){
                height++;
            }

            if (i == 0) {
                writer.addVideoStream(0, 0, ID.CODEC_ID_H264, width, height);
            }
        //debug
            //  System.out.println(PicPathList.get(i) + ", bi:" + bi.getWidth() + "x"
            //        + bi.getHeight() + ", ms:" + milliseconds);
            writer.encodeVideo(0, bi, milliseconds, TimeUnit.MILLISECONDS);
            milliseconds += delay;
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Error");
        }





    }

    writer.close();

//at this part Im trying to combine the further generated mp4 file with the mp3 file

     String inputVideoFilePath = outputFilename;
        String inputAudioFilePath = this.musicFile.getAbsolutePath();
        String outputVideoFilePath = "outputFilename";

        IMediaWriter mWriter = ToolFactory.makeWriter(outputVideoFilePath);

        IContainer containerVideo = IContainer.make();
        IContainer containerAudio = IContainer.make();

        // check files are readable
        containerVideo.open(inputVideoFilePath, IContainer.Type.READ, null);

       containerAudio.open(inputAudioFilePath, IContainer.Type.READ, null);

        // read video file and create stream
        IStreamCoder coderVideo = containerVideo.getStream(0).getStreamCoder();

        IPacket packetvideo = IPacket.make();
        int width = coderVideo.getWidth();
        int height = coderVideo.getHeight();

        // read audio file and create stream
        IStreamCoder coderAudio = containerAudio.getStream(0).getStreamCoder();

        IPacket packetaudio = IPacket.make();


        mWriter.addAudioStream(1, 0,coderAudio.getCodecID(), coderAudio.getChannels(), coderAudio.getSampleRate());
        mWriter.addVideoStream(0, 0, width, height);

        while (containerVideo.readNextPacket(packetvideo) >= 0) {

            containerAudio.readNextPacket(packetaudio);

            // video packet
            IVideoPicture picture = IVideoPicture.make(coderVideo.getPixelType(), width, height);
            coderVideo.decodeVideo(picture, packetvideo, 0);
            if (picture.isComplete()) 
                mWriter.encodeVideo(0, picture);

            // audio packet 
            IAudioSamples samples = IAudioSamples.make(512, coderAudio.getChannels(),      IAudioSamples.Format.FMT_S32);
            coderAudio.decodeAudio(samples, packetaudio, 0);
            if (samples.isComplete()) 
                mWriter.encodeAudio(1, samples);

        }

        coderAudio.close();
        coderVideo.close();
        containerAudio.close();
        containerVideo.close();
        mWriter.close();
}

person user3741086    schedule 14.06.2014    source источник


Ответы (2)


Я ответил на этот вопрос здесь, который является полным ответом.

JAVA — Xuggler — воспроизведение видео при объединении аудиофайла MP3 и фильма в формате MP4

person Soley    schedule 22.02.2015

Вы можете использовать другой файл jar для объединения видео и аудио. Пожалуйста, обратите внимание, что это неправильный способ сделать это, но у меня не было выбора и времени копаться в кодах Xuggler.

Я надеюсь, что это сработает и для вас.

package MP4;

/**
 *
 * @author Pasban
 */
import com.coremedia.iso.boxes.Container;
import com.googlecode.mp4parser.authoring.Movie;
import com.googlecode.mp4parser.authoring.Track;
import com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder;
import com.googlecode.mp4parser.authoring.container.mp4.MovieCreator;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class MuxMp4 {

    public static void merge(String audio, String video, String output) throws IOException {

        Movie countVideo = MovieCreator.build(video);
        Movie countAudioEnglish = MovieCreator.build(audio);

        Track audioTrackEnglish = countAudioEnglish.getTracks().get(0);
        audioTrackEnglish.getTrackMetaData().setLanguage("eng");

        countVideo.addTrack(audioTrackEnglish);

        Container out = new DefaultMp4Builder().build(countVideo);
        FileOutputStream fos = new FileOutputStream(new File(output));
        out.writeContainer(fos.getChannel());
        fos.close();


    }
}

Дополнительные сведения см. в примерах кодов MP4Parser.

Приятно отметить, что оба ваших файла должны быть в формате mp4. Поэтому вам также нужно конвертировать mp3 в mp4. и ваше видео не должно содержать никакого звука, которого в вашем случае нет.

Как я упоминал ранее, это неправильный способ выполнения работы.

person Soley    schedule 20.09.2014