2009-02-02 19 views
19

Actualmente estoy trabajando en una aplicación web que necesita aceptar videos subidos por usuarios en cualquier formato (.avi, .mov, etc.) y convertirlos a flv para reproducirlos en un flash. jugador.Convierta programáticamente un video a FLV

Dado que el sitio está basado en OpenCms, la mejor solución sería un complemento listo para OpenCms que permitiera subir y reproducir videos haciendo la operación de transcodificación en segundo plano, pero solo un conjunto de clases de Java para hacer la transcodificación Sé grandioso y luego podría hacer que la forma de carga y reproducción sea solo.

Respuesta

10

Usted tiene básicamente dos opciones si usted desea recibir, transmitir y reproducir archivos FLV (y no quieren comprar una aplicación de codificación de vídeo): puede llamar a FFMpeg/MEncoder o puede usar un servicio web externo. También podría eludir el problema completamente al permitirles incrustar videos de YouTube en su sitio.

Si va a la 'ruta local FFMpeg' sugeriría simplemente usar ProcessBuilder y construir una línea de comandos para ejecutar FFMpeg. De esta forma, usted obtiene el control total sobre lo que se ejecuta, evita JNI, lo cual es una pesadilla absoluta para trabajar, y mantiene el código específico del sistema operativo fuera de su aplicación. Puedes encontrar FFMPeg con todos los detalles para prácticamente cualquier plataforma. Es muy probable que ya esté en tu servidor.

Lo bueno de la ruta 'Local FFMPeg' es que no tiene que pagar ningún hosting adicional, y todo se ejecuta localmente, aunque su administrador de hosting podría comenzar a quejarse si está usando una gran cantidad de disco y CPU. Hay algunas otras preguntas de StackOverflow que hablan sobre algunos de los gotchas using FFMpeg para crear flvs que realmente puedes jugar en el reproductor flash.

La ruta del servicio web es agradable porque hay menos configuración involucrada. No he usado Hey!Watch pero parece prometedor. PandaStream es fácil de configurar y funciona bien, además de que obtiene todos sus videos en S3 sin ningún esfuerzo adicional.

+0

El uso de la CPU es definitivamente algo que deberías tener en cuenta si trabajas en un entorno de alojamiento compartido. La mayoría de los planes ofrecen mucho espacio en disco y ancho de banda, pero son muy tacaños con la potencia de CPU que utiliza. – Kibbee

21

Hay una gran herramienta de código abierto llamada FFmpeg que utilizo para transcodificar mis videos. Utilizo PHP haciendo llamadas de shell para que cobre vida, pero no me puedo imaginar que sería demasiado difícil hacer que funcione bien con Java. (Maybe this could be a good starting point for you.)

Suministro a mi instalación más de 30 lotes de conciertos cada semana y siempre sale como material de calidad. La única parte difícil para mí ha sido compilarla para manejar una gran variedad de formatos de video. En el lado positivo, esto me ha proporcionado el trabajo pesado que necesito.

+0

Sé de FFMpeg, pero no estoy seguro de poder hacer una llamada de shell en mi servidor web (especialmente porque no sé si el sistema operativo se ejecuta y me gustaría que mi aplicación sea independiente del sistema operativo), esperaba encontrar algo puro-java – Raibaz

+0

FFMpeg es, desafortunadamente, el único jugador REAL en el juego de forma gratuita. FFmpeg se usa comúnmente en Linux, pero también hay un binario de Windows si así lo deseas. – UltimateBrent

+0

asegúrese de obtener/compilar un archivo binario con compatibilidad con LAME, ya que FLV generalmente usa MP3 para su transmisión de audio –

1

Puede intentar usar un servicio en línea como HeyWatch para convertir su video. Nunca utilizado, pero afirman

"carga transparente, enviar videos forma transparente desde el sitio Web"

No

una solución de Java, pero que no tendría que preocuparse de qué sistema operativo de la aplicación web es en.

Si el sistema operativo no fue un problema, estoy de acuerdo con la respuesta theBadDawg dio. No sé y no he tenido suerte para encontrar una solución java pura.

1

La codificación de los archivos en un formato a otro requiere mucho tiempo de desarrollo para hacerlo bien, razón por la cual hay muy pocos en términos de decodificadores/codificadores que puedan realizar esas hazañas. Los que son más conocidos y utilizados son ffmpeg y mencoder.

Lo que puede interesar es ver si la plataforma en la que se ejecuta (Windows/Mac OS X/Other unix) tiene un conjunto subyacente de llamadas API que puede usar para decodificar los archivos, y volver a codificarlos. Windows tiene DirectShow y Mac OS X tiene Quicktime. No estoy seguro de si puede acceder a esas API usando Java.

FFMpeg tiene un contenedor Java disponible: FFMPEG Java, y también hay FOBS que tiene un JNI disponible para su contenedor de C++ alrededor de ffmpeg. El último que encontré jFFmpeg, sin embargo, hay algunas publicaciones que encontré en Google que sugieren que el proyecto puede no estar vivo por más tiempo.

Su mejor opción sería el mencoder de mplayer y/o ffmpeg. Ffmpeg puede instalarse como un binario independiente y luego llamarse desde otro código usando los comandos "shell" por defecto. Sin embargo, si no puede ejecutar comandos, puede necesitar usar un sitio web de conversión en línea como sugirió Mark Robinson.

4

Esto puede ser ligeramente tangencial, pero encontré que Panda Stream es una solución muy útil para todo tipo de problemas de codificación de video.

Todo lo que tiene que hacer es cargar el archivo de video en una instancia de Amazon EC2 ejecutando Panda y codificará el video con los formatos y calidad deseados y emitirá una devolución de llamada al servidor de aplicaciones con los detalles cuando esté listo. A continuación, puede usar el reproductor de Flash Video incluido o su propio reproductor para reproducir los videos en su sitio.

Es una solución muy escalable (gracias a Amazon EC2 & S3), rentable y personalizable en comparación con la propia.

Muy recomendado.

Actualización:

La arquitectura de Panda es el siguiente:

Architecture of Panda Stream http://pandastream.com/images/panda_arch.gif

  1. Página muestra formulario de carga de Panda en un marco flotante o emergente
  2. vídeo cargar con AJAX barra de progreso
  3. Devolución de llamada API cuando se completa la codificación
  4. vídeo transmitido al usuario
20

Puede codificar video en Java utilizando Xuggler, que es una API de Java que utiliza de forma nativa el código C de FFmpeg detrás de las escenas.

+1

+1 y muchos votos adicionales más para sus respuestas, que están infravaloradas. Arte, grandes felicitaciones por su trabajo en el proyecto Xuggler. – cetnar

+0

Xuggler no es un ejecutable java puro: debe instalarlo en el sistema operativo. Esto significa que si quisiera usarlo en Android, no puedo. –

1

Si quieres hacerlo con Java, puedes hacerlo muy fácilmente usando Xuggle.

Ellos tienen un gran sitio web que explica cómo hacer todo

la documentación está aquí: http://build.xuggle.com/view/Stable/job/xuggler_jdk5_stable/javadoc/java/api/index.html

y un excelente tutorial que le dice cómo hacer lo que quiere está aquí: http: // Blog .xuggle.com/2009/06/05/introduction-to-xuggler-mediatools/

Proporcionan una manera fácil de hacer lo que desee en el primer tutorial, que es simple transcodificación.

He encontrado que funciona bien para la codificación de flv. Lo que hace detrás de las escenas es usar ffmpeg, por lo que cualquier cosa que se dispare ffmpeg también fallará con xuggle.

El código Java de ejemplo relevante es:

// create a media reader 
IMediaReader reader = ToolFactory.makeReader("videofile.flv"); 

// add a viewer to the reader, to see the decoded media 
reader.addListener(ToolFactory.makeWriter("output.mov", reader)); 

// read and decode packets from the source file and 
// and dispatch decoded audio and video to the writer 
while (reader.readPacket() == null) 
    ; 

Qué obtuve de http: //wiki.xuggle.com/MediaTool_Introduction

Si quieres algo de código clojure completamente de trabajo ... aquí es :)

(import '(com.xuggle.mediatool ToolFactory)) 
(import '(com.xuggle.mediatool IMediaDebugListener IMediaDebugListener$Event)) 

    (defn readerRecurse 
     "calls .readPacket until there's nothing left to do2" 
     [reader] 
     (if (not (nil? (.readPacket reader))) ; here .readPacket actually does the processing as a side-effect. 
     true         ; it returns null when it has MORE ro process, and signals an error when done... 
     (recur reader))) 


    (defn convert 
     "takes video and converts it to a new type of video" 
     [videoInput videoOutput] 
     (let [reader (ToolFactory/makeReader videoInput)] 
     (doto reader 
      (.addListener (ToolFactory/makeWriter videoOutput reader)) 
      (.addListener (ToolFactory/makeDebugListener (into-array [IMediaDebugListener$Event/META_DATA])))) 
     (readerRecurse reader))) 

ahora todo lo que tiene que hacer es algo como:

(convert "/path/to/some_file.stupid_extention" "/path/to/awesome.flv") 

y listo!

0

Usted también puede estar interesado en la audiencia que ahora hemos lanzado Panda como un servicio alojado, así, que hace que la configuración y la ampliación más fácil :)

http://pandastream.com

0

sí, ffmpeg es la mejor para este trabajo ... Utilizamos ffmpeg para convertir video durante mucho tiempo y funciona con todos los formatos de video ... hay muchas opciones disponibles ...

Cuestiones relacionadas