Conversión automática/codificación de video para transmisión de Video On Demand

Necesito una solución automática para convertir clips de video para transmisión de video bajo demanda html5 (mp4/x264, webm/vp8) y flash (mp4/x264). Para un sitio como Youtube, mucho más pequeño.

Los archivos de entrada son en su mayoría h264/x264, pero a veces otros (como divx/xvid) tienen una resolución diferente y, a veces, contienen subtítulos (.ass) que deben grabarse. La resolución de salida debe ser 720p y 480p para video >=720p, 480p para 480p-720p y la resolución original para todo lo demás.

El servidor está ejecutando Debian.

No pude encontrar ningún proyecto de código abierto, solo algunos servicios en la nube (SaaS) que ofrecen este tipo de conversión. Intenté trabajar con ffmpeg, pero cada video necesita una tasa de bits diferente para tener una buena calidad y tener un tamaño de archivo que permita el video a pedido. Si el video de entrada es malo, el video de salida no debería ser más grande. No tengo idea de cómo configurar correctamente los parámetros x264/vp8 y, obviamente, no puedo hacerlo manualmente.

¿Conoces alguna herramienta (linux) para esto? Hay muchos sitios de videos por ahí, ¿cómo hacen esto? Miré los archivos de video de YouTube y todos difieren en la tasa de bits y el tamaño del archivo. ¿O conoces algún sitio web o tutorial que pueda ayudarme? He pasado mucho tiempo buscando consejos, pero no puedo encontrar nada, tal vez estoy buscando los términos incorrectos.

Respuestas (2)

Para un servidor, definitivamente quieres ffmpeg. También recomendaría compilarlo usted mismo (esas son instrucciones de Ubuntu, pero también deberían funcionar para Debian AFAIK): el mejor codificador AAC disponible para ffmpeg (libfdk_aac) no se puede redistribuir junto con x264 (debido a la GPL), y la versión de ffmpeg en los repositorios probablemente sea demasiado antiguo para algunas de las cosas que voy a enumerar aquí.

MP4

Para convertir un video arbitrario a un MP4 usando libx264 y libfdk_aac:

ffmpeg -i input.avi -c:v libx264 -crf 24 -preset veryfast \
-ac 2 -c:a libfdk_aac -vbr 3 -movflags faststart output.mp4

Controle la calidad del video con -crf: un número más bajo es una mejor calidad, pero un archivo más grande. 18 es visualmente sin pérdidas en la mayoría de las circunstancias, y 24 debería ser más que suficiente para la transmisión en línea. Use a -presetpara controlar la velocidad/tamaño del video: un ajuste preestablecido más lento significa un archivo más pequeño (los ajustes preestablecidos son ultrarrápido, súper rápido, muy rápido, rápido, rápido, medio, lento y más lento). Vea aquí para más detalles.

Controle la calidad del audio con -vbr: la escala es 1-5, donde 5 es la mejor calidad. En realidad, incluso un vbr de 1 debería ser lo suficientemente bueno para sus propósitos. Vea aquí para más detalles. -ac 2significa que ffmpeg emitirá 2 canales de audio, mezclándolos si es necesario; realmente solo necesita usarlo si cree que la gente enviará audio con sonido envolvente 5.1 o algo así.

-movflags faststartes necesario para video MP4 de Internet.

WEBM

.webm es un poco más complicado. libvpx (el codificador VP8) debería tener un modo crf que funcionará de manera similar a x264, pero actualmente no funciona . Desafortunadamente, tendrá que apuntar a una tasa de bits en su lugar. Para una definición estándar, 1000 kb/s debería dar muy buena calidad (de hecho, eso probablemente sea excesivo). Para Full HD de 1080p, alrededor de 5000 kb/s darán una calidad realmente buena (una vez más, probablemente puedas bajar más, pruébalo y verás). Alrededor de 2200kb/s debería ser suficiente para 720p.

ffmpeg -i input.avi -c:v libvpx -b:v 1000k \
-c:a libvorbis -q:a 4 -ac 2 output.webm

NOTA : asegúrese de usar libvorbis (la lib del codificador xiph.org), NO vorbis (el codificador ffmpeg interno inferior). Establezca la calidad con -q:a: el rango es -1-10, donde 10 es la mejor calidad y 5 es indistinguible de un CD original. 3 o 4 deberían ser adecuados para fines de transmisión en línea.

Subtítulos y video a escala

Para codificar subtítulos, primero debe extraerlos del archivo original y luego usar el filtro trasero o el filtro de subtítulos para codificarlos. Usando el filtro de subtítulos:

ffmpeg -i input.mkv -map 0:s:0 -c:s ass subtitle.ass
ffmpeg -i input.mkv -filter:v 'subtitles=subtitle.ass' \
-c:v libx264 -crf 24 -preset veryfast \
-c:a libfdk_aac -vbr 3 -movflags faststart output.mp4 \
-filter:v 'subtitles=subtitle.ass' \
-c:v libvpx -b:v 1000k \
-c:a libvorbid -q:a 4 output.webm

Para escalar videos, use el filtro de escala. -1:480significa 'para el ancho, mantenga la relación de aspecto de entrada y escale la altura a 480'.

ffmpeg -i input.avi -filter:v 'scale=-1:480' \
-c:v libx264 -crf 24 -preset veryfast \
-c:a libfdk_aac -vbr 3 -movflags faststart output.mp4 \
-filter:v 'scale:-1:480' \
-c:v libvpx -b:v 1000k \
-c:a libvorbid -q:a 4 output.webm

Puede combinar los filtros de escala y subtítulos así:

ffmpeg -i input.mkv -filter:v 'scale=-1:480,subtitles=subtitle.ass' \
-c:v libx264 -crf 24 -preset veryfast \
-c:a libfdk_aac -vbr 3 -movflags faststart output.mp4 \
-filter:v 'scale:-1:480,subtitles=subtitle.ass' \
-c:v libvpx -b:v 1000k \
-c:a libvorbid -q:a 4 output.webm

Probablemente querrá usar un script bash para detectar la altura de entrada y probar la existencia de subtítulos; Personalmente, usaría mediainfo para encontrar esa información, es bastante compatible con expresiones regulares.

Eso debería ser suficiente para ponerte en marcha.

La transcodificación de video es muy confusa y hay muchas opciones diferentes.

Si no quieres usar FFMpeg, puedes probar VLC

Lea más sobre la transcodificación con VLC aquí

De lo contrario, FFMpeg (o algún tipo de herramienta de envoltorio) es su mejor opción. Al omitir la opción -vb, permite que FFMpeg decida la tasa de bits. También hay algunos ajustes preestablecidos que puede usar para codificar en dispositivos y calidades específicos, como ipod640.

Creé una pequeña aplicación Java que transcodifica video de una cola (usando MySQL), pero un cronjob y un shell-script también son una buena solución.