viernes, 1 de junio de 2012

Vídeos webm; cortar y unir

Por razones de docencia, me interesaba unos minutos del episodio sobre el Ártico de Beyond Survival. Como es natural, es muy sencillo conseguirlo en Youtube, ya que en general estos programas están colgados en su versión inglesa. Si alguién tiene curiosidad, en Youtube solo hay que buscar beyond survival artic, y encontrará el programa dividido en 5 partes. el problema reside en que lo que nos interesa era el final de la parte 2 y el principio de la parte 3. ¿Como lograrlo?

1. Bajar los ficheros. Tenemos varias opciones; lo más fácil es usar la extensión DownloadHelper en Firefox. En Chrome/Chromium tenéis aplicaciones o extensiones para que os aparezca en los ficheros de youtube la opción de descarga. Finalmente, en terminal (¡por supuesto!) existe la aplicación youtube-dl. Bajamos mediante youtube-dl todas las partes

youtube-dl url

Las partes 2 y 3 corresponden por ejemplo a:

youtube-dl http://www.youtube.com/watch?v=vXto9zcwlZg
youtube-dl http://www.youtube.com/watch?v=KNjQBzp-q5Y

Los ficheros que obtuve fueron del formato webm, descrito en su faq como

"WebM is an open media file format designed for the web. WebM files consist of video streams compressed with the VP8 video codec and audio streams compressed with the Vorbis audio codec. The WebM file structure is based on the Matroska media container."

Los que prefieran trabajar en otros formatos, la solución es

youtube-dl --all-formats url

Y así bajará todos los contenedores presentes (webm, flv, mp4...).

Se observaron los vídeos, anotando los segundos iniciales y finales de cada parte para los siguientes pasos.

2. Recortar los vídeos. Las GUI de las que disponía no me permitieron cortar de forma fácil el vídeo, así que me fui a las aplicaciones CLI. Lo más sencillo es recurrir a ffmpeg

ffmpeg -i video.webm -vcodec copy -ss 190 -t 320 -acodec copy corte1.avi

siendo
-vcodec copy y -acodec copy significa que no alteramos los vídeos, manteniendo los codecs de video y audio, ya que solo queremos cortar
-ss 190 el segundo donde empieza el corte (en este caso de la parte 2)
-t 320 el tiempo de duración en segundos que yo quiero a partir de ese 190


3. Unir los dos cortes. No todos los formatos de vídeo permiten la unión con una simple concatenación. En el caso de que fuera así, con un simple cat los podemos unir

cat video1.mpeg video2.mpeg > video.mpeg

El ejemplo indica vídeos mpeg, ya que vídeos así sí se pueden concatenar. En el caso de webm no funciona. Una solución es la transformación previa , por ejemplo a mpeg, pero eso supone una pérdida de calidad, solo para unir, así que hay que evitarlo. Gracias a esta dirección, descubrí que se pueden unir utilizando las mkvtoolnix

mkvmerge -o video.webm corte1.webm +corte2.webm

lo que tiene sentido, si el formato webm está basado (ver arriba) en el contenedor matroska. Según otras páginas, tambien es posible hacerlo de forma gráfica, con las mkvtoolnix-gui, pero no lo he probado.

Todo ello me ha dejado un vídeo de unos 6 minutos que contienen exactamente lo que yo quería, una piel de caribu con larvas de Hypoderma tarandi, es decir, con barros. De esta forma podemos enseñar diferentes especies de estas moscas parásitas afectando a otros hospedadores diferentes a los de aquí, las vacas.

4. Recodificación
Solo queda un último paso, que es la transformación de ese webm a otro formato que se pueda proyectar en casos en que no haya disponibilidad de red y con ordenadores de pocas prestaciones, antiguos, sin codecs, etc... Sin embargo, por ahora he tenido problemas. Winff gráfico y las ffmpeg en terminal indican errores que impiden la conversión. Debido a dependencias de librerías, solo puedo instalar transmageddon en la versión 0.16-1, y no lo puedo configurar adecuadamente para conseguir un vídeo razonable. Mencoder en terminal

mencoder video.webm -ovc xvid -oac mp3lame -lameopts abr:br=128 -xvidencopts bitrate=1200 -o video.avi

genera un video con desincronización de sonido respecto al vídeo. y de una calidad baja, así que tendré que leer más sobre mencoder. Las aplicaciones gráficas generan órdenes de decenas o centenares de líneas, que exigen un conocimiento a alto nivel que no tengo.

Lo logrado por ahora genera un vídeo perfecto para lo que queremos y que podemos usar fácilmente en muchas circunstancias. El problema es, por ejemplo, si queremos introducirlo como tal dentro de una presentación, si vamos a usar un portatil desconocido sin conexión a Internet en aulas aisladas, conferencias donde no sabemos de que vamos a disponer etc... Para evitar esos problemas, es recomendable llevar varios formatos del vídeo en el bolsillo. Seguiremos indagando.

7 comentarios:

  1. Hice la prueba siguiendo tus pasos (excepto los de cortar partes al vídeo):
    1. Bajé el primero de los vídeos con:
    youtube-dl http://www.youtube.com/watch?v=vXto9zcwlZg

    Me lo guardó como vXto9zcwlZg.flv (42,5 MB) y lo renombré a video.flv.

    2. Lo convertí a salida.avi con:
    mencoder video.flv -o salida.avi -oac mp3lame -lameopts br=128 -ovc xvid -xvidencopts bitrate=1200

    El resultado fue un salida.avi de 88,3 MB. Aparentemente, en el proceso no se ha perdido excesiva calidad, y el audio está perfectamente sincronizado con el vídeo.

    De todos modos, destaco la aparición de 30 errores de este tipo:

    Skipping frame!
    Pos: 15.6s 467f ( 2%) 27.83fps Trem: 13min 70mb A-V:0.068 [505:265]

    Así como el siguiente mensaje relacionado con la sincronización del audio:

    Setting audio delay to 0.026s.

    Fíjate al convertior a AVI te sale algo del delay; si es así, corrígelo con:

    mencoder salida.avi -o salidabuena.avi -oac copy -ovc copy -delay -X.XXX

    Donde X.XXX es el delay mostrado en el mensaje.

    Un saludo.

    ResponderEliminar
  2. Siguiendo tus consejos, he aplicado youtube -dl --all-formats url y he bajado los formatos flv y mp4. Sobre llos he realizado los mismos cortes,

    ffmpeg -i vXto9zcwlZg.flv -vcodec copy -ss 190 -t 320 -acodec copy corte1.flv

    y

    ffmpeg -i KNjQBzp-q5Y.flv -vcodec copy -ss 9 -t 65 -acodec copy corte2.flv

    y luego he realizado la unión mediante

    mencoder -oac mp3lame -lameopts br=128 -ovc copy -o corte.flv corte1.flv corte2.flv

    pero aparecen errores múltiples de duplicación de cuadros

    1 duplicate frame(s)!
    Pos: 1.1s 32f ( 0%) 0.00fps Trem: 0min 22mb A-V:-0.069 [465:216]

    pero no se produce la unión debido a que no tienen la misma frecuencia de imágenes

    All video files must have identical fps, resolution, and codec for -ovc copy.

    El mismo error se produce con los ficheros mp4. En resumen, solo logro los minutos que quiero con el formato webm. Tengo que transformarlo de manera más adecuada

    ResponderEliminar
  3. Recapitulando...

    1. Bajamos el vídeo (.flv) y lo convertimos a .avi:

    mencoder video.flv -o video.avi -oac mp3lame -lameopts br=128 -ovc xvid -xvidencopts bitrate=1200

    2. Extraemos el intervalo de audio que nos interesa y lo guardamos en formato .mp3 (antes de realizar este paso tuve que instalar la librería libavcodec-extra-53. Sin ella me daba error al intentar guardar en .mp3):

    ffmpeg -i video.avi -ss 00:06:00 -t 00:00:15 -f mp3 corte.mp3

    3. Extraemos el intervalo de vídeo que nos interesa y lo guardamos en formato .avi:

    ffmpeg -i video.avi -acodec copy -vcodec copy -ss 00:06:00 -t 00:00:15 corte.avi

    4. Por último, unimos audio y vídeo:

    ffmpeg -i corte.mp3 -i corte.avi -acodec copy -vcodec copy resultado.avi

    Y tendremos un vídeo con la misma calidad de imagen (y el audio sincronizado).

    ResponderEliminar
  4. Le he dado una vuelta de tuerca más. Lo he dejado perfecto así:
    1. He convertido los flv en avi de la misma forma que tu
    mencoder vXto9zcwlZg.flv -o parte2.avi -oac mp3lame -lameopts br=128 -ovc xvid -xvidencopts bitrate=1200
    mencoder KNjQBzp-q5Y.flv -o parte3.avi -oac mp3lame -lameopts br=128 -ovc xvid -xvidencopts bitrate=1200

    2. he extraído el sonido de la misma forma
    ffmpeg -i parte2.avi -ss 190 -t 320 -f mp3 corte1.mp3
    ffmpeg -i parte3.avi -ss 7 -t 65 -f mp3 corte2.mp3

    3. sin embargo, y para evitar alteraciones por el sonido sobre la sincronización (se han perdido en la conversión algunas imágenes por duplicidad), extraje el vídeo sin sonido, mediante la opción n en audio (-an)
    ffmpeg -i parte2.avi -an -vcodec copy -ss 190 -t 320 corte1.avi

    ffmpeg -i parte3.avi -an -vcodec copy -ss 7 -t 65 corte2.avi

    4. Sigo la misma forma de union vídeo-sonido
    ffmpeg -i corte1.mp3 -i corte1.avi -acodec copy -vcodec copy resultado1.avi

    ffmpeg -i corte2.mp3 -i corte2.avi -acodec copy -vcodec copy resultado2.avi

    5. Unión de los dos avis
    El comando cat no sirve para vídeos avi. Forma un fichero de tamaño correcto (50+10 - 60 MB), pero al proyectarlo se para en el final del primer trozo. así que esta orden da un vídeo teóricamente válido pero erróneo
    cat resultado1.avi resultado2.avi > resultado.avi

    La segunda opción fue la unión mediante mencoder
    mencoder -oac copy -ovc copy -o resultado.avi resultado1.avi resultado2.avi
    Pero después de muchas líneas de acción aparece un mensaje
    All video files must have identical fps, resolution, and codec for -ovc copy.
    Exiting...
    y el resultado es también incompleto.

    Tampoco, y por la misma razón, lo permite VirtualDubMod.
    Sin embargo, avidemux deja unirlos y ha quedado un fichero perfecto.

    Respecto a los tiempos, aunque el segundo ideal en el segundo corte es 9, no me ha quedado más remedio que cortar desde 7, ya que si no se tenían 8 segundos con imagen negra, seguramente por que cortábamos la imagen maestra de los siguientes 8 segundos (y por ello me parece que los avis salen con imágenes maestras cada 300 0 360 frames)

    Finalmente, para hecerlo más compatible con todo, podemos convertirlo en mpg

    ffmpeg -i resultado.avi -sameq resultado.mpeg

    siendo -sameq para que mantenga las características de calidad (bps y resolución)

    Con esto me ha quedado un vídeo perfecto, aunque al enseñarlo, me dicen que prefieren solo el segundo corte.
    Pasaré esto a la entrada posterior que había escrito ayer, pero antes aun voy a hacer otro intento. Cortar primero los flv y luego hacer los mismos pasos, a ver como queda mejor.

    ResponderEliminar
  5. Gracias

    Para convertir vídeos (cambios de formato, tamaño, etc.) con mencoder:
    http://tayrona.org/ubuntu/mencoder.html
    http://www.comdigitalpro.com/mencoder/ejemplos-de-como-convertir-videos-utilizando-mencoder_22.html

    ResponderEliminar
  6. En Linux Mint 17 MATE, tras instalar mencoder y ejecutar algo así ...

    mencoder /ruta/al/video_de_partida.mp4 -ovc copy -oac faac -ss segundo_de_inicio1 -endpos duracion_en_segundos1 -o /ruta/al/cacho1.mp4

    ... me devuelve "MPlayer was compiled without libfaac", sin obtener el fragmento del vídeo.

    Tengo 3 alternativas: cambiar en el comando faac por ...

    a) pcm (la que menos tarda pero más ocupa -el fichero del fragmento-)

    b) lavc (tarda algo más que el anterior pero ocupa poco más de la mitad)

    c) mp3lame (tarda algo más que el anterior pero ocupa algo menos -más o menos la mitad que con pcm)

    ResponderEliminar
    Respuestas
    1. A la hora de unir cachos obtenidos con pcm y mp3lame (cada uno con otros obtenidos de la misma forma) me dan ficheros de unión buenos, pero los obtenidos con lavc, al unirse me dan ficheros defectuosos (imágenes deficientes y vídeo y audio descoordinados).

      Eliminar