videos ver hacer framework ejemplo descargar como advanced java video media

ver - java media framework



Biblioteca Java recomendada para crear un video programáticamente (5)

¿Alguien puede recomendar una biblioteca Java que me permita crear un video mediante programación? Específicamente, haría lo siguiente:

  • tomar una serie de imágenes Buffered como marcos
  • permite agregar un fondo WAV / MP3
  • Permitir que se agreguen WAV / MP3 ''incidentales'' en puntos arbitrariamente especificados por programa
  • muestra el video en un formato común (MPEG, etc.)

¿Alguien puede recomendar algo? Para la mezcla de imagen / sonido, incluso viviría con algo que tomara una serie de fotogramas, y para cada fotograma tenía que proporcionar los bytes sin formato de datos de sonido sin comprimir asociados con ese fotograma.

PD. Ni siquiera tiene que ser una "biblioteca de terceros" como tal si Java Media Framework tiene las llamadas para lograr lo anterior, pero de mi memoria incompleta tengo la sensación de que no es así.



Encontré una herramienta llamada ffmpeg que puede convertir archivos multimedia de un formato a otro. Hay un filtro llamado libavfilter en ffmpeg que es el sustituto de vhook que permite que el video / audio sea modificado o examinado entre el decodificador y el codificador. Creo que debería ser posible ingresar marcos sin procesar y generar video. Investigué sobre cualquier implementación java de ffmpeg y encontré la página titulada "Comenzando con FFMPEG-JAVA" que es un contenedor JAVA alrededor de FFMPEG usando JNA.



Prueba JavaFX.

JavaFX incluye soporte para la representación de imágenes en múltiples formatos y soporte para la reproducción de audio y video en todas las plataformas donde se admite JavaFX.

Here hay un tutorial sobre manipulación de imágenes

Here hay un tutorial sobre cómo crear presentaciones de diapositivas, líneas de tiempo y escenas.

Here hay preguntas frecuentes sobre cómo agregar sonidos.

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


Puede probar una biblioteca de códec Java pura llamada JCodec.
Tiene un codificador H.264 (AVC) muy básico y muxer MP4. Aquí hay un código de muestra completo tomado 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(); } }

Esta muestra es más sofisticada y en realidad muestra muxing de fotogramas codificados en un 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(); } }