2

I have an mp3 file, and an image. I need to create a video combining them, in java.
I'm trying to do it with xuggle, but there are still no results.
Can anybody give me any suggestions ?

user584397
  • 347
  • 2
  • 12
  • How are you doing it? Maybe you should use MediaTool? (see: [MediaTool Introduction](http://wiki.xuggle.com/MediaTool_Introduction)) – mrzasa Jan 13 '12 at 09:28
  • I'm still new to Xuggle. I tried to create 2 streams, one for audio, and other for video(like in some examples from site), but probably i'm doing something wrong, because it fails... – user584397 Jan 13 '12 at 09:44
  • My problem, is that as video is generated on the fly, but audio is already on the disk, i don't know how to put them together. I thought to save only video, and then to concatenate them ([link]http://code.google.com/p/xuggle/source/browse/trunk/java/xuggle-xuggler/src/com/xuggle/mediatool/demos/ConcatenateAudioAndVideo.java[/link]) but it didn't worked for this sample... – user584397 Jan 13 '12 at 09:48
  • i am facing the same problem. I have a video file instead of an image. Please tell me if u find any solution to it. – Muhammad Umar Jan 16 '12 at 10:55

1 Answers1

3

Finally, I found a solution.

I used pieces of code from Xuggle's examples.

I also solved a problem with audio transcoding.

I'll write my code here, because I cannot explain why it works, but it just works.

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";
    }

Thanks, good luck.

user584397
  • 347
  • 2
  • 12