21 votos

Se recomienda biblioteca de Java para la creación de un video mediante programación

¿Alguien puede recomendar una biblioteca de Java que me permita crear un vídeo mediante programación? En concreto, se haría lo siguiente:

  • tomar una serie de BufferedImages como los marcos
  • permitir un fondo WAV/MP3 a ser añadido
  • permitir 'incidental' WAV/Mp3 a ser añadido en forma arbitraria, mediante programación puntos especificados
  • la salida de vídeo en un formato común (MPEG, etc)

¿Alguien puede recomendar algo? Para la imagen y el sonido de la mezcla, de que iba a vivir con algo que llevó a una serie de fotogramas, y para cada frame, tenía para el suministro de crudo bytes de sonido sin comprimir datos asociados con ese marco.

P. S. no tiene que ser una "tercera parte" de la biblioteca como tal si el Java Media Framework tiene las llamadas a lograr que el anterior, pero desde mi boceto de memoria tengo la sensación de que no.

5voto

janoside Puntos 673

He utilizado el código mencionados a continuación para realizar con éxito los artículos 1, 2, y 4 en su lista de necesidades en Java puro. Vale la pena un vistazo y que probablemente podría averiguar cómo son #3.

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

4voto

Mukesh Kamath Puntos 333

He encontrado una herramienta llamada ffmpeg que puede convertir multimedia de archivos de un formato a otro. Hay un filtro llamado libavfilter en ffmpeg, que es el sustituto del vhook que permite que el vídeo/audio para ser modificado o examinados entre el decodificador y el codificador. Creo que debería ser posible entrada de fotogramas raw y generar vídeo. He investigado en cualquier implementación de java de ffmpeg y se encontró la página titulada "introducción a la FFMPEG-JAVA" que es un JAVA envoltura alrededor de FFMPEG utilizando JNA.

1voto

Usted puede tratar de un puro de Java biblioteca de códec llamado JCodec.
Tiene muy básico de H. 264 ( AVC ) codificador y MP4 muxer. He aquí un completo código de ejemplo tomada de la de sus muestras -- 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();
    }
}

Este ejemplo es más sofisticado y realmente muestra multiplexado de tramas codificados en archivo 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();
    }
}

0voto

John Puntos 2717

Trate De JavaFX.

JavaFX incluye soporte para el renderizado de imágenes en múltiples formatos y soporte para reproducción de audio y vídeo en todas las plataformas donde JavaFX es compatible.

Aquí hay un tutorial sobre la manipulación de las imágenes

Aquí hay un tutorial sobre la creación de presentaciones de diapositivas, los plazos y las escenas.

Aquí es preguntas frecuentes sobre la adición de sonidos.

La mayoría de estos están en JavaFX 1.3. Ahora JavaFX 2.0.

0voto

Jonathan Puntos 2310

¿Por qué no usar FFMPEG?

No parece ser un contenedor Java:

http://fmj-sf.net/ffmpeg-java/getting_started.php

Aquí está un ejemplo de cómo compilar varias fuentes de medios de comunicación en un vídeo con FFMPEG:

http://howto-pages.org/ffmpeg/#multiple

Y, por último, de la documentación:

http://ffmpeg.org/ffmpeg.html

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X