Подтвердить что ты не робот

Рекомендуемая библиотека Java для создания видео программно

Может кто-нибудь порекомендовать библиотеку Java, которая позволила бы мне создать видео программно? В частности, он будет делать следующее:

  • возьмите серию BufferedImages в качестве фреймов
  • позволяют добавлять фоновый WAV/MP3.
  • позволяют добавлять "случайные" WAV/MP3 файлы произвольно, программно заданные точки
  • вывод видео в общем формате (MPEG и т.д.)

Кто-нибудь может что-нибудь рекомендовать? Для микширования изображения/звука я даже жил с чем-то, что занимало ряд кадров, и для каждого кадра мне приходилось поставлять необработанные байты несжатых звуковых данных, связанных с этим фреймом.

P.S. Он даже не должен быть "сторонней библиотекой" как таковой, если Java Media Framework имеет призывы к достижению вышеуказанного, но из моей отрывочной памяти у меня такое чувство, что это не так.

4b9b3361

Ответ 1

Я использовал приведенный ниже код для успешного выполнения элементов 1, 2 и 4 в списке требований в чистой Java. Это стоит посмотреть, и вы могли бы выяснить, как включить # 3.

http://www.randelshofer.ch/blog/2010/10/writing-quicktime-movies-in-pure-java/

Ответ 2

Я нашел инструмент под названием ffmpeg, который может конвертировать мультимедийные файлы из одного формата в другой. В ffmpeg есть фильтр libavfilter, который является заменой vhook, который позволяет изменять/анализировать видео/аудио между декодером и кодировщиком. Я думаю, что должно быть возможно вводить необработанные кадры и генерировать видео. Я изучил любую реализацию java ffmpeg и нашел страницу под названием "Начало работы с FFMPEG-JAVA" , которая представляет собой оболочку JAVA вокруг FFMPEG с использованием JNA,

Ответ 3

Вы можете попробовать чистую библиотеку кодеков Java под названием JCodec.
Он имеет очень простой кодер H.264 (AVC) и мультиплексор MP4. Здесь полный образец кода, взятый из их образцов - TranscodeMain.

private static void png2avc(String pattern, String out) throws IOException {
    FileChannel sink = null;
    try {
        sink = new FileOutputStream(new File(out)).getChannel();
        H264Encoder encoder = new H264Encoder();
        RgbToYuv420 transform = new RgbToYuv420(0, 0);

        int i;
        for (i = 0; i < 10000; i++) {
            File nextImg = new File(String.format(pattern, i));
            if (!nextImg.exists())
                continue;
            BufferedImage rgb = ImageIO.read(nextImg);
            Picture yuv = Picture.create(rgb.getWidth(), rgb.getHeight(), ColorSpace.YUV420);
            transform.transform(AWTUtil.fromBufferedImage(rgb), yuv);
            ByteBuffer buf = ByteBuffer.allocate(rgb.getWidth() * rgb.getHeight() * 3);

            ByteBuffer ff = encoder.encodeFrame(buf, yuv);
            sink.write(ff);
        }
        if (i == 1) {
            System.out.println("Image sequence not found");
            return;
        }
    } finally {
        if (sink != null)
            sink.close();
    }
}

Этот пример более сложный и на самом деле показывает мультиплексирование закодированных кадров в файл MP4:

private static void prores2avc(String in, String out, ProresDecoder decoder, RateControl rc) throws IOException {
    SeekableByteChannel sink = null;
    SeekableByteChannel source = null;
    try {
        sink = writableFileChannel(out);
        source = readableFileChannel(in);

        MP4Demuxer demux = new MP4Demuxer(source);
        MP4Muxer muxer = new MP4Muxer(sink, Brand.MOV);

        Transform transform = new Yuv422pToYuv420p(0, 2);

        H264Encoder encoder = new H264Encoder(rc);

        MP4DemuxerTrack inTrack = demux.getVideoTrack();
        CompressedTrack outTrack = muxer.addTrackForCompressed(TrackType.VIDEO, (int) inTrack.getTimescale());

        VideoSampleEntry ine = (VideoSampleEntry) inTrack.getSampleEntries()[0];
        Picture target1 = Picture.create(ine.getWidth(), ine.getHeight(), ColorSpace.YUV422_10);
        Picture target2 = null;
        ByteBuffer _out = ByteBuffer.allocate(ine.getWidth() * ine.getHeight() * 6);

        ArrayList<ByteBuffer> spsList = new ArrayList<ByteBuffer>();
        ArrayList<ByteBuffer> ppsList = new ArrayList<ByteBuffer>();
        Packet inFrame;
        int totalFrames = (int) inTrack.getFrameCount();
        long start = System.currentTimeMillis();
        for (int i = 0; (inFrame = inTrack.getFrames(1)) != null && i < 100; i++) {
            Picture dec = decoder.decodeFrame(inFrame.getData(), target1.getData());
            if (target2 == null) {
                target2 = Picture.create(dec.getWidth(), dec.getHeight(), ColorSpace.YUV420);
            }
            transform.transform(dec, target2);
            _out.clear();
            ByteBuffer result = encoder.encodeFrame(_out, target2);
            if (rc instanceof ConstantRateControl) {
                int mbWidth = (dec.getWidth() + 15) >> 4;
                int mbHeight = (dec.getHeight() + 15) >> 4;
                result.limit(((ConstantRateControl) rc).calcFrameSize(mbWidth * mbHeight));
            }
            spsList.clear();
            ppsList.clear();
            H264Utils.encodeMOVPacket(result, spsList, ppsList);
            outTrack.addFrame(new MP4Packet((MP4Packet) inFrame, result));
            if (i % 100 == 0) {
                long elapse = System.currentTimeMillis() - start;
                System.out.println((i * 100 / totalFrames) + "%, " + (i * 1000 / elapse) + "fps");
            }
        }
        outTrack.addSampleEntry(H264Utils.createMOVSampleEntry(spsList, ppsList));

        muxer.writeHeader();
    } finally {
        if (sink != null)
            sink.close();
        if (source != null)
            source.close();
    }
}

Ответ 5

Попробуйте JavaFX.

JavaFX включает поддержку для рендеринга изображений в нескольких форматах и ​​поддержку воспроизведения аудио и видео на всех платформах, где поддерживается JavaFX.

Здесь - это учебное пособие по управлению изображениями

Здесь - это учебное пособие по созданию слайд-шоу, временных рамок и сцен.

Здесь есть вопросы по добавлению звуков.

Большинство из них находятся на JavaFX 1.3. Теперь JavaFX 2.0 отсутствует.