【问题标题】:create mp4 from pictures and mp3 java using xuggler使用 xuggler 从图片和 mp3 java 创建 mp4
【发布时间】:2015-02-23 02:05:17
【问题描述】:

我正在尝试通过添加 mp3 文件将图片列表合并到 mp4 电影中。 电影的长度用户可以选择 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();
}

【问题讨论】:

    标签: java mp3 mp4 xuggler


    【解决方案1】:

    我在这里回答了这个问题,这是一个完整的答案。

    JAVA - Xuggler - Play video while combining an MP3 audio file and a MP4 movie

    【讨论】:

      【解决方案2】:

      您可以使用另一个 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。并且您的视频不应包含任何声音,在您的情况下它不包含任何声音。

      正如我之前提到的,这不是完成工作的正确方式。

      【讨论】:

        猜你喜欢
        • 2021-02-07
        • 1970-01-01
        • 1970-01-01
        • 2013-08-03
        • 1970-01-01
        • 1970-01-01
        • 2014-07-10
        • 1970-01-01
        • 2014-08-24
        相关资源
        最近更新 更多