Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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 使用Xuggler将音频(aac)和视频(mp4容器中的h.264)合并到mp4容器中_Java_Javafx_Ffmpeg_Desktop Application_Xuggler - Fatal编程技术网

Java 使用Xuggler将音频(aac)和视频(mp4容器中的h.264)合并到mp4容器中

Java 使用Xuggler将音频(aac)和视频(mp4容器中的h.264)合并到mp4容器中,java,javafx,ffmpeg,desktop-application,xuggler,Java,Javafx,Ffmpeg,Desktop Application,Xuggler,这是我正在使用的代码 String filenamevideo = videoFilePath;(video.mp4) String filenameaudio = audioAACFilePath; (audio.aac) IMediaWriter mWriter = ToolFactory.makeWriter(videoWithAudioFilePath); // output // file IContainer containerVid

这是我正在使用的代码

    String filenamevideo = videoFilePath;(video.mp4)

    String filenameaudio = audioAACFilePath; (audio.aac)



    IMediaWriter mWriter = ToolFactory.makeWriter(videoWithAudioFilePath); // output
    // file

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

    if (containerVideo.open(filenamevideo, IContainer.Type.READ, null) < 0)
        throw new IllegalArgumentException("Cant find " + filenamevideo);

    if (containerAudio.open(filenameaudio, IContainer.Type.READ, null) < 0)
        throw new IllegalArgumentException("Cant find " + filenameaudio);

    int numStreamVideo = containerVideo.getNumStreams();
    int numStreamAudio = containerAudio.getNumStreams();    

    int videostreamt = -1; // this is the video stream id
    int audiostreamt = -1;

    IStreamCoder videocoder = null;

    for (int i = 0; i < numStreamVideo; i++) {
        IStream stream = containerVideo.getStream(i);
        IStreamCoder code = stream.getStreamCoder();

        if (code.getCodecType() == ICodec.Type.CODEC_TYPE_VIDEO) {
            videostreamt = i;
            videocoder = code;
            break;
        }

    }

    for (int i = 0; i < numStreamAudio; i++) {
        IStream stream = containerAudio.getStream(i);
        IStreamCoder code = stream.getStreamCoder();

        if (code.getCodecType() == ICodec.Type.CODEC_TYPE_AUDIO) {
            audiostreamt = i;
            break;
        }

    }

    if (videostreamt == -1)
        throw new RuntimeException("No video steam found");
    if (audiostreamt == -1)
        throw new RuntimeException("No audio steam found");

    if (videocoder.open() < 0)
        throw new RuntimeException("Cant open video coder");
    IPacket packetvideo = IPacket.make();

    IStreamCoder audioCoder = containerAudio.getStream(audiostreamt).getStreamCoder();

    if (audioCoder.open() < 0)
        throw new RuntimeException("Cant open audio coder");

    mWriter.addAudioStream(0, 0, ICodec.ID.CODEC_ID_AAC, audioCoder.getChannels(),audioCoder.getSampleRate());

    mWriter.addVideoStream(1, 0, ICodec.ID.CODEC_ID_H264, videocoder.getWidth(), videocoder.getHeight());


    IPacket packetaudio = IPacket.make();

    while (containerVideo.readNextPacket(packetvideo) >= 0 || containerAudio.readNextPacket(packetaudio) >= 0) {

        if (packetvideo.getStreamIndex() == videostreamt) {

            // video packet
            IVideoPicture picture = IVideoPicture.make(videocoder.getPixelType(), videocoder.getWidth(),
                    videocoder.getHeight());
            int offset = 0;
            while (offset < packetvideo.getSize()) {
                int bytesDecoded = videocoder.decodeVideo(picture, packetvideo, offset);
                if (bytesDecoded < 0)
                    throw new RuntimeException("bytesDecoded not working");
                offset += bytesDecoded;
                if (picture.isComplete()) {
                    // System.out.println(picture.getPixelType());
                    mWriter.encodeVideo(1, picture);
                }
            }
        }

        if (packetaudio.getStreamIndex() == audiostreamt) {
            // audio packet
            IAudioSamples samples = IAudioSamples.make(512, audioCoder.getChannels(), IAudioSamples.Format.FMT_S32);
            int offset = 0;
            while (offset < packetaudio.getSize()) {
                int bytesDecodedaudio = audioCoder.decodeAudio(samples, packetaudio, offset);
                if (bytesDecodedaudio < 0)
                    throw new RuntimeException("could not detect audio");
                offset += bytesDecodedaudio;
                if (samples.isComplete()) {
                    mWriter.encodeAudio(0, samples);
                }
            }

        }           
    }
输出文件mp4正在生成,但无法使用vlc和JavaFX场景媒体播放

请帮助我以正确的方式使用上面代码的输入,或者帮助我将audioaac和videoh264合并到mp4容器的可能解决方案


提前感谢。

所有流都必须结束。你们所有人都还开着