Xuggle将音频与生成的音频相结合

时间:2012-01-13 09:14:09

标签: java xuggle

我有一个mp3文件和一个图像。我需要在java中创建一个组合它们的视频 我试图用xuggle来做,但仍然没有结果 任何人都可以给我任何建议吗?

1 个答案:

答案 0 :(得分:2)

最后,我找到了解决方案。

我使用了Xuggle示例中的代码片段。

我还解决了音频转码的问题。

我会在这里编写我的代码,因为我无法解释它为什么会起作用,但它只是有效。

public String make() throws IOException, InterruptedException {
        BufferedImage s1 = genImage();
        writer = ToolFactory.makeWriter("temp/" + sermon.getFile().getName() + ".flv");

        String filename = sermon.getFile().getAbsolutePath();
        IContainer container = IContainer.make();

        if (container.open(filename, IContainer.Type.READ, null) < 0) {
            throw new IllegalArgumentException("could not open file: " + filename);
        }
        int numStreams = container.getNumStreams();

        int audioStreamId = -1;
        IStreamCoder audioCoder = null;
        for (int i = 0; i < numStreams; i++) {
            IStream stream = container.getStream(i);
            IStreamCoder coder = stream.getStreamCoder();
            if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_AUDIO) {
                audioStreamId = i;
                audioCoder = coder;
                break;
            }
        }
        if (audioStreamId == -1) {
            throw new RuntimeException("could not find audio stream in container: " + filename);
        }

        if (audioCoder.open() < 0) {
            throw new RuntimeException("could not open audio decoder for container: " + filename);
        }
        writer.addAudioStream(0, 0, audioCoder.getChannels(), audioCoder.getSampleRate());
        writer.addVideoStream(1, 1, width, height);
        IPacket packet = IPacket.make();
        int n = 0;
        while (container.readNextPacket(packet) >= 0) {
            n++;

            if (packet.getStreamIndex() == audioStreamId) {
                IAudioSamples samples = IAudioSamples.make(2048, audioCoder.getChannels());
                int offset = 0;
                while (offset < packet.getSize()) {
                    try {
                        int bytesDecoded = audioCoder.decodeAudio(samples, packet, offset);
                        if (bytesDecoded < 0) {
                            //throw new RuntimeException("got error decoding audio in: " + filename);
                            break;
                        }
                        offset += bytesDecoded;

                        if (samples.isComplete()) {
                            if (n % 1000 == 0) {
                                writer.flush();
                                System.out.println(n);
                                System.gc();
                            }
                            writer.encodeAudio(0, samples);
                        }
                    } catch (Exception e) {
                        System.out.println(e);
                    }
                }
            } else {
                do {
                } while (false);
            }
        }
        for (int i = 0; i < container.getDuration() / 1000000; i++) {
            writer.encodeVideo(1, s1, i, TimeUnit.SECONDS);
        }

        writer.close();

        if (audioCoder != null) {
            audioCoder.close();
            audioCoder = null;
        }
        if (container != null) {
            container.close();
            container = null;
        }
        return "temp/" + sermon.getFile().getName() + ".flv";
    }

谢谢,祝你好运。