ffmpeg dvd mkv avconv

ffmpeg - Convertir una imagen de DVD con subtítulos a MKV usando avconv



(2)

Este es el procedimiento que conozco para convertir una imagen de DVD a otro videoformato (vg MP4):

  1. concatene los archivos VTS_01_ n VTS_01_ dentro de la carpeta VIDEO_TS (para n > = 0) en un solo archivo VOB.
  2. use avconv o ffmpeg para convertir ese VOB a otro formato.

Hasta ahora todo bien, sin embargo, ahora quiero convertir la imagen de DVD con los subtítulos. Por lo que sé, el formato MKV admite subtítulos, por lo que parece una opción obvia. Alternativamente, podría usar cualquier otro formato con subtítulos en disco (subtítulos como parte de la imagen de video).

Sin embargo, la codificación de subtítulos en la imagen de DVD es dvdsub y dvdsub el siguiente error

Only SUBTITLE_ASS type supported. Subtitle encoding failed

Sin embargo, cuando avconv -codecs obtengo:

... DES dvdsub DVD subtitles ...

Y el interruptor de -c:s copy , mientras evita que el comando falle, no parece producir un subtítulo que el jugador pueda entender.

Entonces, ¿cómo puedo crear subtítulos desde dvdsub usando avconv ?

Mi archivo VOB tiene ocho canales de subtítulos y dos canales de audio. La aplicación de video de Ubuntu no muestra ningún subtítulo, y solo el primer canal de audio parece estar funcionando, la imagen del DVD podría estar rota.

Otro archivo, para un DVD de doble capa, muestra el error de codificación de subtítulos, sin embargo, al usar el interruptor de -c:s copy se muestra:

Application provided invalid, non monotonically increasing dts to muxer in stream 2: 49 >= 49 av_interleaved_write_frame(): Invalid argument

Gracias de antemano por cualquier idea sobre cómo resolver estos problemas.

(Estoy usando Ubuntu donde ffmpeg es un alias para avconv . Sé que es posible instalar el ffmpeg real, pero hasta ahora no lo he hecho).

actualización: comandos y salidas de consola:

comandos

cat VTS_01_1.VOB VTS_01_2.VOB VTS_01_3.VOB VTS_01_4.VOB VTS_01_5.VOB > ~/temp/mymovie.VOB cd ~/temp avconv -i mymovie.VOB

salida

avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers built on Mar 30 2013 22:20:06 with gcc 4.7.2 [mpeg @ 0x1a64d40] max_analyze_duration reached Input #0, mpeg, from ''mymovie.VOB'': Duration: 00:00:01.95, start: 0.280633, bitrate: -2147483 kb/s Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 7500 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc Stream #0.1[0x20]: Subtitle: dvdsub Stream #0.2[0x21]: Subtitle: dvdsub Stream #0.3[0x22]: Subtitle: dvdsub Stream #0.4[0x23]: Subtitle: dvdsub Stream #0.5[0x24]: Subtitle: dvdsub Stream #0.6[0x25]: Subtitle: dvdsub Stream #0.7[0x26]: Subtitle: dvdsub Stream #0.8[0x27]: Subtitle: dvdsub Stream #0.9[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s Stream #0.10[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s At least one output file must be specified

mando

avconv -i mymovie.VOB mymovie.mkv

salida

avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers built on Mar 30 2013 22:20:06 with gcc 4.7.2 [mpeg @ 0x1cdad40] max_analyze_duration reached Input #0, mpeg, from ''mymovie.VOB'': Duration: 00:00:01.95, start: 0.280633, bitrate: -2147483 kb/s Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 7500 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc Stream #0.1[0x20]: Subtitle: dvdsub Stream #0.2[0x21]: Subtitle: dvdsub Stream #0.3[0x22]: Subtitle: dvdsub Stream #0.4[0x23]: Subtitle: dvdsub Stream #0.5[0x24]: Subtitle: dvdsub Stream #0.6[0x25]: Subtitle: dvdsub Stream #0.7[0x26]: Subtitle: dvdsub Stream #0.8[0x27]: Subtitle: dvdsub Stream #0.9[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s Stream #0.10[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s File ''mymovie.mkv'' already exists. Overwrite ? [y/N] y [buffer @ 0x1ce23c0] w:720 h:480 pixfmt:yuv420p Output #0, matroska, to ''mymovie.mkv'': Metadata: encoder : Lavf53.21.1 Stream #0.0: Video: mpeg4, yuv420p, 720x480 [PAR 8:9 DAR 4:3], q=2-31, 200 kb/s, 1k tbn, 29.97 tbc Stream #0.1: Audio: libvorbis, 48000 Hz, 5.1, s16 Stream #0.2: Subtitle: ass, 200 kb/s Stream mapping: Stream #0:0 -> #0:0 (mpeg2video -> mpeg4) Stream #0:9 -> #0:1 (ac3 -> libvorbis) Stream #0:1 -> #0:2 (dvdsub -> ass) Press ctrl-c to stop encoding [ass @ 0x1ce0140] Only SUBTITLE_ASS type supported. Subtitle encoding failed

mando

avconv -i mymovie.VOB -c:s copy mymovie.mkv

Salida omitida.

mando

avconv -i mymovie.mkv

salida

avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers built on Mar 30 2013 22:20:06 with gcc 4.7.2 [matroska,webm @ 0xbc1d40] Estimating duration from bitrate, this may be inaccurate Input #0, matroska,webm, from ''mymovie.mkv'': Metadata: ENCODER : Lavf53.21.1 Duration: 01:05:09.47, start: 0.000000, bitrate: N/A Stream #0.0: Video: mpeg4 (Simple Profile), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 29.97 fps, 29.97 tbr, 1k tbn, 30k tbc (default) Stream #0.1: Audio: vorbis, 48000 Hz, 5.1, s16 (default) Stream #0.2: Subtitle: dvdsub (default) At least one output file must be specified

Ahora, para los comandos de doble capa:

cat VTS_01_1.VOB VTS_01_2.VOB VTS_01_3.VOB VTS_01_4.VOB VTS_01_5.VOB VTS_01_6.VOB VTS_01_7.VOB VTS_01_8.VOB > ~/temp/mylongmovie.VOB cd ~/temp avconv -i mylongmovie.VOB mylongmovie.mkv

salida

avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers built on Mar 30 2013 22:20:06 with gcc 4.7.2 [mpeg @ 0x13c2d40] max_analyze_duration reached Input #0, mpeg, from ''Cosmos-0203.VOB'': Duration: 00:00:30.24, start: 0.280633, bitrate: 2103365 kb/s Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 8000 kb/s, 27.46 fps, 59.94 tbr, 90k tbn, 59.94 tbc Stream #0.1[0x20]: Subtitle: dvdsub Stream #0.2[0x21]: Subtitle: dvdsub Stream #0.3[0x22]: Subtitle: dvdsub Stream #0.4[0x23]: Subtitle: dvdsub Stream #0.5[0x24]: Subtitle: dvdsub Stream #0.6[0x25]: Subtitle: dvdsub Stream #0.7[0x26]: Subtitle: dvdsub Stream #0.8[0x27]: Subtitle: dvdsub Stream #0.9[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s Stream #0.10[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s File ''mylongmovie.mkv'' already exists. Overwrite ? [y/N] y [buffer @ 0x13ca3c0] w:720 h:480 pixfmt:yuv420p Output #0, matroska, to ''mylongmovie.mkv'': Metadata: encoder : Lavf53.21.1 Stream #0.0: Video: mpeg4, yuv420p, 720x480 [PAR 8:9 DAR 4:3], q=2-31, 200 kb/s, 1k tbn, 59.94 tbc Stream #0.1: Audio: libvorbis, 48000 Hz, 5.1, s16 Stream #0.2: Subtitle: ass, 200 kb/s Stream mapping: Stream #0:0 -> #0:0 (mpeg2video -> mpeg4) Stream #0:9 -> #0:1 (ac3 -> libvorbis) Stream #0:1 -> #0:2 (dvdsub -> ass) Press ctrl-c to stop encoding [ass @ 0x13d19c0] Only SUBTITLE_ASS type supported. Subtitle encoding failed

mando

avconv -i mylongmovie.VOB -c:s copy mylongmovie.mkv

salida

avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers built on Mar 30 2013 22:20:06 with gcc 4.7.2 [mpeg @ 0xce1d40] max_analyze_duration reached Input #0, mpeg, from ''mylongmovie.VOB'': Duration: 00:00:30.24, start: 0.280633, bitrate: 2103365 kb/s Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 8000 kb/s, 27.46 fps, 59.94 tbr, 90k tbn, 59.94 tbc Stream #0.1[0x20]: Subtitle: dvdsub Stream #0.2[0x21]: Subtitle: dvdsub Stream #0.3[0x22]: Subtitle: dvdsub Stream #0.4[0x23]: Subtitle: dvdsub Stream #0.5[0x24]: Subtitle: dvdsub Stream #0.6[0x25]: Subtitle: dvdsub Stream #0.7[0x26]: Subtitle: dvdsub Stream #0.8[0x27]: Subtitle: dvdsub Stream #0.9[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s Stream #0.10[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s File ''mylongmovie.mkv'' already exists. Overwrite ? [y/N] y [buffer @ 0xce93c0] w:720 h:480 pixfmt:yuv420p Output #0, matroska, to ''mylongmovie.mkv'': Metadata: encoder : Lavf53.21.1 Stream #0.0: Video: mpeg4, yuv420p, 720x480 [PAR 8:9 DAR 4:3], q=2-31, 200 kb/s, 1k tbn, 59.94 tbc Stream #0.1: Audio: libvorbis, 48000 Hz, 5.1, s16 Stream #0.2: Subtitle: dvdsub Stream mapping: Stream #0:0 -> #0:0 (mpeg2video -> mpeg4) Stream #0:9 -> #0:1 (ac3 -> libvorbis) Stream #0:1 -> #0:2 (copy) Press ctrl-c to stop encoding [matroska @ 0xce4b40] Application provided invalid, non monotonically increasing dts to muxer in stream 2: 49 >= 49 av_interleaved_write_frame(): Invalid argument


Respuesta corta: salte a la sección Línea de comando completa y descargue ffmpeg de este sitio .

Originalmente, planeaba responder cómo hacerlo con avconv porque (a) esa respuesta sigue faltando y (b) avconv parece ser la avconv predeterminada en los sistemas de Ubuntu hoy. Sin embargo, parece que actualmente está demasiado lleno de errores para lograr esto, al menos para mis testcases.

configuración ffmpeg

Ya que pides avconv o ffmpeg , y acabo de enterarme de que avconv es una bifurcación de ffmpeg (ver esta respuesta para una discusión), descargué una versión actual de ffmpeg de este sitio como lo explica la respuesta antes mencionada. Las versiones de Windows también están disponibles. Para una compilación Linux de 64 bits actual típica, el enlace directo sería a esta página . Contiene construcciones diarias. Así que desplácese hacia abajo hasta que vea lo último y mejor, descargue y desempaquete con, por ejemplo, tar xzvf ffmpeg.static.64bit.2014-02-14.tar.gz . La ventaja de una construcción estática es que tiene menos dependencias, si no es así. Al descomprimir el archivo tar se crearon dos nuevos ejecutables ffmpeg y ffprobe en el directorio actual.

Linea de comando basica

Ahora podemos usar este último ffmpeg para copiar todas las transmisiones dentro de mymovie.vob* a un formato diferente. Por ejemplo:

./ffmpeg -i mymovie.vob -c:v copy -c:a copy -c:s copy -map 0 mymovie.mkv

Esta linea de comando

  • lee desde el archivo de entrada -i filename
  • copia las secuencias de video en la copia -c:v copy
  • copia las secuencias de audio en ella -c:a copy
  • Copia subtítulos en el mismo -c:s copy
  • y en lugar de utilizar el primero de cada uno, utiliza y copia todos ellos: -map 0
  • al archivo de salida del archivo de salida

Expandamos la línea de comando anterior para solucionar algunos posibles errores en la herramienta, o archivos de entrada corruptos, o simplemente detalles sobre archivos .vob .

Solución para el error Can''t write packet with unknown timestamp

Agregue las opciones -fflags +genpts antes del archivo de entrada.

./ffmpeg -fflags +genpts -i mymovie.vob -c:v copy -c:a copy -c:s copy -map 0 mymovie.mkv

Las opciones en ffmpeg siempre solo afectan a los archivos de entrada o salida que llevan el nombre de la opción actual. Esas dos opciones deben afectar el archivo de entrada, por lo que deben aparecer primero.

Esta solución está cubierta en este ticket de error y puede no ayudar en todos los casos.

Falta algunos o todos los subtítulos

Este es un comportamiento muy típico cuando se procesan archivos .vob y se trata en las preguntas frecuentes de ffmpeg . Los tipos de archivos de contenedores de video, como .avi o .mp4 o .mkv tienen encabezados (datos al inicio de un archivo) que listan todo el contenido del archivo. Esto facilita a los jugadores y las herramientas de conversión saber qué tipo de datos pueden esperar. .vob archivos .vob no tienen un encabezado explícito. Así que cuando se inician ffmpeg o avconv , miran los primeros dos mil bytes. En archivos vob, los subtítulos pueden comenzar muy tarde. En mi caso de prueba, el primer subtítulo aparece después de varios segundos, por lo que las herramientas no lo ven durante el inicio. Este es un ejemplo típico de salida durante la codificación en estas situaciones:

Output #0, matroska, to ''test.mkv'': Metadata: encoder : Lavf55.32.101 Stream #0:0: Video: mpeg2video (mpg2 / 0x3267706D), yuv420p, 720x576 [SAR 64:45 DAR 16:9], q=2-31, max. 9800 kb/s, 25 fps, 1k tbn, 90k tbc Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), 448 kb/s Stream #0:2: Audio: dts ([1] [0][0] / 0x2001), 48000 Hz, 5.1(side), 768 kb/s Stream #0:3: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), 448 kb/s Stream #0:4: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, 224 kb/s Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:1 -> #0:1 (copy) Stream #0:2 -> #0:2 (copy) Stream #0:3 -> #0:3 (copy) Stream #0:4 -> #0:4 (copy) Press [q] to stop, [?] for help [mpeg @ 0x31f2540] New subtitle stream 0:5 at pos:16945166 and DTS:22.2473s [mpeg @ 0x31f2540] New subtitle stream 0:6 at pos:16951310 and DTS:22.2473s [mpeg @ 0x31f2540] New subtitle stream 0:7 at pos:16957454 and DTS:22.2873s [mpeg @ 0x31f2540] New subtitle stream 0:8 at pos:16963598 and DTS:22.2873s [mpeg @ 0x31f2540] New subtitle stream 0:9 at pos:18405390 and DTS:25.4873s [mpeg @ 0x31f2540] New subtitle stream 0:10 at pos:18417678 and DTS:25.4873s [mpeg @ 0x31f2540] New subtitle stream 0:11 at pos:264593422 and DTS:288.207sts/s [mpeg @ 0x31f2540] New subtitle stream 0:12 at pos:264597518 and DTS:288.207s frame=24694 fps=7322 q=-1.0 Lsize= 859345kB time=00:16:27.74 bitrate=7127.1kbits/s video:632823kB audio:224996kB subtitle:0 data:0 global headers:0kB muxing overhead 0.177935%

Como se puede ver, se encontraron nuevos flujos de subtítulos durante la codificación real. Si se intentara agregar la opción -map 5 para incluir esa transmisión, ffmpeg se quejaría durante el inicio de que este número de transmisión no existe.

La solución es decirle a ffmpeg que analice más bytes al inicio del archivo para encontrar todas las secuencias.

Intente agregar las opciones -analyzeduration 1000000k -probesize 1000000k antes del archivo de entrada.

Intenta aumentar los números si aún no se encuentran las secuencias. En mis testcases esos números eran lo suficientemente grandes. La salida cambia entonces a:

Input #0, mpeg, from ''mymovie.vob'': Duration: 00:59:39.90, start: 0.287267, bitrate: 5915 kb/s Stream #0:0[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, bt470bg), 720x576 [SAR 64:45 DAR 16:9], max. 9800 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc Stream #0:1[0x80]: Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s Stream #0:2[0x89]: Audio: dts (DTS), 48000 Hz, 5.1(side), fltp, 768 kb/s Stream #0:3[0x82]: Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s Stream #0:4[0x83]: Audio: ac3, 48000 Hz, stereo, fltp, 224 kb/s Stream #0:5[0x20]: Subtitle: dvd_subtitle Stream #0:6[0x21]: Subtitle: dvd_subtitle Stream #0:7[0x22]: Subtitle: dvd_subtitle Stream #0:8[0x23]: Subtitle: dvd_subtitle Stream #0:9[0x24]: Subtitle: dvd_subtitle Stream #0:10[0x25]: Subtitle: dvd_subtitle Stream #0:11[0x26]: Subtitle: dvd_subtitle Stream #0:12[0x27]: Subtitle: dvd_subtitle File ''test.mkv'' already exists. Overwrite ? [y/N] y Output #0, matroska, to ''test.mkv'': Metadata: encoder : Lavf55.32.101 Stream #0:0: Video: mpeg2video (mpg2 / 0x3267706D), yuv420p, 720x576 [SAR 64:45 DAR 16:9], q=2-31, max. 9800 kb/s, 25 fps, 1k tbn, 90k tbc Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), 448 kb/s Stream #0:2: Audio: dts ([1] [0][0] / 0x2001), 48000 Hz, 5.1(side), 768 kb/s Stream #0:3: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), 448 kb/s Stream #0:4: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, 224 kb/s Stream #0:5: Subtitle: dvd_subtitle Stream #0:6: Subtitle: dvd_subtitle Stream #0:7: Subtitle: dvd_subtitle Stream #0:8: Subtitle: dvd_subtitle Stream #0:9: Subtitle: dvd_subtitle Stream #0:10: Subtitle: dvd_subtitle Stream #0:11: Subtitle: dvd_subtitle Stream #0:12: Subtitle: dvd_subtitle

Línea de comando completa

./ffmpeg -fflags +genpts -analyzeduration 1000000k -probesize 1000000k -i mymovie.vob -c:v copy -c:a copy -c:s copy -map 0 mymovie.mkv

Cualquiera de las copias puede reemplazarse con un códec para convertir realmente, y probablemente comprimir, los datos. Pero si solo son las tres copias, entonces el comando se puede simplificar para:

./ffmpeg -fflags +genpts -analyzeduration 1000000k -probesize 1000000k -i mymovie.vob -c copy -map 0 mymovie.mkv

Todas estas opciones también son compatibles con avconv . Sin embargo, esta herramienta parece tener un problema con algunos subtítulos. Si ve este error:

[matroska @ 0x383aee60] Application provided invalid, non monotonically increasing dts to muxer in stream 7: 58280 >= 58280 av_interleaved_write_frame(): Invalid argument

Puede solucionarlo descargando la última ffmpeg y usando esa herramienta en su lugar, como he explicado anteriormente.


Si necesita una solución de ahorro de calidad, debe probar MakeMKV .
Si desea comprimir la pista de video o convertir MPEG-2 a H.264 puede usar el handbrake .