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):
- concatene los archivos
VTS_01_
nVTS_01_
dentro de la carpetaVIDEO_TS
(para n > = 0) en un solo archivo VOB. - use
avconv
offmpeg
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.