Hoy veremos como aplicar conversiones de vídeo en un entorno web donde los usuarios suben sus vídeos en cualquier formato. Sí, tienes razón, ni más ni menos que lo que hace YouTube, de hecho utilizaban un sistema muy similar a lo que veremos ahora y basado en el mismo software. En realidad el artículo se podría aplicar a prácticamente cualquier tipo de conversiones, incluso para iPod o PSP, sólo hay que utilizar los parámetros adecuados. Nosotros nos centraremos en la conversión a 3gp para después poder hacer streaming con ellos además de permitir su descarga.
Nuestro entorno se basará en un servidor con Linux (Centos5 en mi caso). Como software sólamente necesitaremos ffmpeg, herramienta imprescindible para cualquier aplicación (tanto web como de escritorio) bajo Linux.
¿Qué es ffmpeg?
Hace unas semanas veíamos cómo utilizar ffserver para convertir flujos de vídeo y hacer streaming. ffmpeg es la utilidad en la que se apoya ffserver para realizar las conversiones.
ffmpeg es una herramienta de software libre que permite realizar conversión entre la mayoría de formatos de vídeo más utilizados. Una inmensa mayoría de programas de conversión bajo Windows no son más que frontends gráficos para ffmpeg.
Normalmente los paquetes precompilados de ffmpeg no vienen con las extensiones adecuadas para las conversiones que necesitamos, así que deberemos compilar nuestra propia versión.
Necesitas instalar los siguientes paquetes, son más de los imprescindibles, pero así nos ahorraremos problemas futuros:
libmp4v2
libvorbis
libvorbis-devel
lame
lame-devel
faac
faac-devel
faad2
x264
x264-devel
xvidcore
xvidcore-devel
Debo decir que para mi Centos no están todos disponibles como rpm con lo cual habrá que compilar manualmente algunos de ellos. No deberías tener ningún problema para localizar cada librería.
Finalmente habrá instalar los siguientes paquetes:
http://ftp.penguin.cz/pub/users/utx/amr/amrnb-7.0.0.2.tar.bz2
http://ftp.penguin.cz/pub/users/utx/amr/amrwb-7.0.0.3.tar.bz2
Con esto tenemos ya todo preparado para compilar nuestro propio ffmpeg. Descarga el paquete desde la web oficial, descomprímelo y:
./configure --enable-libmp3lame --enable-libvorbis --enable-libogg --enable-libamr-nb --enable-libamr-wb --enable-libfaac --enable-gpl --enable-libxvid --enable-libx264 --enable-libfaad --enable-shared make make install
Si has seguido bien todos los pasos tendrás el software de conversión preparado.
Convirtiendo a 3gp
Para realizar las conversiones algo tan sencillo como:
ffmpeg -y -i original.avi -s qcif -r 12 -b 30 -ac 1 -ar 8000 -ab 12200 video.3gp /usr/local/bin/MP4Box -3gp -mtu 1450 -hint video.3gp
Cuando vimos cómo hacer streaming a móviles veíamos como utilizar la utilidad MP4Box para que nuestros vídeos 3gp se puediesen utilizar para emitir en vivo.
Para nuestro proyecto es probable que necesitemos algo más. Si queremos que también se puedan visualizar los vídeos desde una web necesitaremos convertirlos a flv:
ffmpeg -y -i original.avi -acodec libmp3lame -ac 2 -ar 22050 -r 12 -b 196 -s 176x144 video.flv /usr/bin/flvtool2 u video.flv
Flvtool es una herramienta que inserta en los flv los metadata necesarios para que funcione bien en el reproductor flash.
Y necesitaremos capturar algún fotograma del vídeo para mostrar como demo:
ffmpeg -i original.avi -y -ss 00:00:01 -vframes 1 -an -sameq -s 160x120 -f image2 thumbnail.jpg
Ahora ya sabemos:
- cómo crear nuestro vídeo 3gp que nos sirva tanto para descarga como para streaming.
- cómo crear el vídeo flv que nos sirva para ver vía web.
- cómo generar thumbnails de escenas del vídeo.
Creando el entorno web
Supongamos que queremos desarrollar una web al estilo Youtube donde el usuario sube vídeos desde un formulario y posteriormente se desea mostrarlos categorizados, con un buscador, una preview (flv), descarga para móviles, etc.
La parte de la web propiamente dicha resulta obvia, no vamos a entrar en detalles. Lo que nos ocupa aquí es como realizar la conversión según las instrucciones que hemos visto. Obviamente no podemos ejecutar la conversión cada vez que un usuario sube un vídeo, sería un proceso lento y pesado. La mejor manera es crear una cola de conversión. Cuando se sube un nuevo vídeo no esta disponible públicamente (no se ha convertido todavía). Podríamos definir tres estados diferentes para un video:
- Sin procesar (convertir).
- Procesando.
- Procesado.
Según esto sería sencillo tener en una tabla el estado de los vídeos. Sólo los procesados se listarían públicamente.
Por otro lado tendríamos una tarea encargada de buscar vídeos en estado “sin procesar” y realizar su conversión. Esta tarea podría ser o bien un demonio residente que está permanentemente buscando vídeos o bien, si el tráfico de nuevos vídeos no va a ser elevado, podría ejecutarse periódicamente para realizar las conversiones.
Si el tráfico fuese muy elevado podría incluso haber varias tareas en paralelo ya que una vez una de ellas encuentra un vídeo “no procesado” actualiza su estado a “procesando” de manera que la siguiente tarea ya no escogerá ese mismo vídeo.
La teoría es mucho más sencilla de lo que parece. La tarea que realiza la conversión creará los formatos que estimemos oportunos según ya hemos visto antes.
Convirtiendo a otros formatos
Con ffmpeg se pueden generar los vídeos para casi cualquier formato existente incluyendo PSP, iPod/iPhone/iTouch… Googleando un poco encontrarás los parámetros adecuados para cada formato.
Conclusiones
En este artículo he explicado cómo realizar conversiones de vídeos a distintos formatos y cómo aplicarlo a un entorno web dónde los usuarios suben sus propios vídeos. He dado los pasos básicos para entender el sistema, vosotros tendríais que adaptarlo a vuestras necesidades.
mira mi duda seria saber donde puedo bajar el mp4box qeu no lo encuentro ya instale el darwin ya convierto a 3gp pero no me permite correr la instruccion por que no esta el archivo
usr/local/bin/MP4Box -3gp -mtu 1450 -hint video.3gp
o si me puedes decir dodne lo bajo MP4Box por que no lo encuetro
gracias de antemano
Me ha servido de mucho las aportaciones
tengo instalado el centos 5.3
Hola Luciano,
En el artículo menciono que en otro de mis artículos viene explicado:
http://blog.osusnet.com/2008/09/25/haciendo-streaming-de-videos-a-moviles/
Saludos,
Jesus
hola
realmente el servidor funciona pero no puedo ver los archivos que genero en 3gp, si veo los ejemplos pero los que genero en linea de comando no
nose si sea por que no he podido instlar el mp4box ya qeu no lo encuentro
Luciano,
Debes instalar el paquete “gpac” en
http://gpac.sourceforge.net/
Por otro lado, los 3gp generados ¿puedes reproducirlos como archivos, no en streaming?
hola de nuez el problema de cuando los quiero ver en el movil me marca errores ejemplo
unsupporte Media type
no found
nada mas puedo ver los ejemplos que trae en el movil y en real player
rtsp://99.90.100.200/ca8.3gp
medice conectando y luego no found
espero que me puedas orientar por fas te lo agradeceria bastante
o si me pudieras decir por que no reproduces los archivos generados por mi, y por que los ejemplos si los reproduce
FFmpeg version SVN-r18763, Copyright (c) 2000-2009 Fabrice Bellard, et al.
configuration: –enable-libamr-nb –enable-libamr-wb –enable-nonfree
libavutil 50. 3. 0 / 50. 3. 0
libavcodec 52.28. 0 / 52.28. 0
libavformat 52.32. 0 / 52.32. 0
libavdevice 52. 2. 0 / 52. 2. 0
libswscale 0. 7. 1 / 0. 7. 1
built on May 6 2009 15:30:48, gcc: 4.1.2 20080704 (Red Hat 4.1.2-44)
Seems stream 0 codec frame rate differs from container frame rate: 29.97 (30000/1001) -> 15.00 (15/1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from ‘luis.3gp’:
Duration: 00:00:33.10, start: 0.000000, bitrate: 226 kb/s
Stream #0.0(und): Video: h263, yuv420p, 176×144 [PAR 12:11 DAR 4:3], 15 tbr, 15 tbn, 29.97 tbc
Stream #0.1(und): Audio: libamr_nb, 8000 Hz, mono, s16
At least one output file must be specified
y por ultimo los videos generados en 3gp si los puedo ver localmente en el server el problema es cuando los quiero ver desde el rtsp://************/*.3gp
com puedo instalar el gpac en centos 5.3 ya qeu no encuentro como hacerlo
Tienes que descargar y compilar el archivo fuente que te dan.
Tambien puedes buscar si hay un rpm compilado para tu sistema, eso no lo se, pero posiblemente.