web-dev-qa-db-fra.com

Conversion d'une image DVD avec sous-titres en MKV en utilisant avconv

Voici la procédure que je connais pour convertir une image DVD en un autre format vidéo (par exemple MP4):

  1. concaténer le VTS_01_ n .VOB fichiers à l'intérieur VIDEO_TS dossier (pour n > = 0) dans un seul fichier VOB.
  2. utilisez avconv ou ffmpeg afin de convertir cela VOB dans un autre format.

Jusqu'ici tout va bien, mais maintenant je veux convertir l'image DVD avec les sous-titres. Pour autant que je sache, le format MKV prend en charge les sous-titres, donc cela semble un choix évident. Alternativement, je pourrais utiliser n'importe quel autre format avec des sous-titres durs (sous-titres dans le cadre de l'image vidéo).

Cependant, le codage des sous-titres dans l'image DVD est dvdsub et j'obtiens l'erreur suivante

Only SUBTITLE_ASS type supported.
Subtitle encoding failed

Cependant, lors de l'exécution de avconv -codecs Je reçois:

...
 DES    dvdsub          DVD subtitles
...

Et le -c:s copy switch, bien qu'il empêche la commande d'échouer, il ne semble pas produire de sous-titre que le joueur puisse comprendre.

Alors, comment puis-je créer des sous-titres ass à partir de dvdsub en utilisant avconv?

Mon fichier VOB a huit canaux de sous-titres et deux canaux audio. L'application vidéo Ubuntu ne montre aucun sous-titre, et seul le premier canal audio semble fonctionner, si l'image DVD pourrait être cassée.

Un autre fichier, pour un DVD double couche, affiche l'erreur de codage des sous-titres, cependant lors de l'utilisation de -c:s copy switch il affiche en outre:

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

Merci d'avance pour toute idée sur la façon de résoudre ces problèmes.

(J'utilise Ubuntu où ffmpeg est un alias pour avconv. Je sais qu'il est possible d'installer le vrai ffmpeg mais jusqu'à présent je ne l'ai pas fait.)


mise à jour: commandes et sorties console:

commandes

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

production

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

commander

avconv -i mymovie.VOB mymovie.mkv

production

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

commander

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

sortie omise.

commander

avconv -i mymovie.mkv

production

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

Maintenant, pour la double couche: commandes

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

production

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

commander

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

production

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

Réponse courte: passez à la section Ligne de commande complète et téléchargez ffmpeg depuis ce site .

À l'origine, j'avais prévu de répondre à cette question avec avconv car (a) cette réponse est toujours manquante et (b) avconv semble être la valeur par défaut sur les systèmes ubuntu aujourd'hui. Cependant, il semble qu'il soit actuellement trop bogué pour y parvenir - du moins pour mes tests.

Configuration de ffmpeg

Puisque vous demandez avconv ou ffmpeg, et je viens d'apprendre que avconv est une fourchette de ffmpeg (voir cette réponse = pour une discussion), j'ai téléchargé une version actuelle de ffmpeg depuis ce site comme l'explique la réponse susmentionnée. Les versions Windows sont également disponibles. Pour une version Linux 64 bits courante, le lien direct serait cette page . Il contient des versions quotidiennes. Faites donc défiler vers le bas jusqu'à ce que vous voyiez la dernière et la meilleure, téléchargez et décompressez tar xzvf ffmpeg.static.64bit.2014-02-14.tar.gz. L'avantage d'une construction statique est qu'elle a moins, sinon aucune, dépendance. Le décompactage du fichier tar a créé deux nouveaux exécutables ffmpeg et ffprobe dans le répertoire courant.

Ligne de commande de base

Maintenant, nous pouvons utiliser ce dernier ffmpeg pour copier tous les flux à l'intérieur du mymovie.vob* dans un autre format. Par exemple:

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

Cette ligne de commande

  • lit à partir du fichier d'entrée -i filename
  • y copie les flux vidéo -c:v copy
  • y copie des flux audio -c:a copy
  • y copie des sous-titres -c:s copy
  • et au lieu d'utiliser simplement le premier de chacun, il les utilise et les copie tous -map 0
  • vers le fichier de sortie outputfile

Développons la ligne de commande ci-dessus pour contourner certains bogues possibles de l'outil, ou des fichiers d'entrée corrompus, ou simplement des détails sur .vob des dossiers.

Contournement de l'erreur Can't write packet with unknown timestamp

Ajoutez les options -fflags +genpts avant le fichier d'entrée.

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

Les options de ffmpeg n'affectent toujours que les fichiers d'entrée ou de sortie nommés après l'option actuelle. Ces deux options doivent affecter le fichier d'entrée, elles doivent donc venir en premier.

Cette solution de contournement est couverte par ce ticket de bogue et peut ne pas aider dans tous les cas.

Certains ou tous les sous-titres manquent

Il s'agit d'un comportement très typique lors du traitement de .vob fichiers et est couvert dans la ffmpeg FAQ . Types de fichiers de conteneur vidéo tels que .avi ou .mp4 ou .mkv ont des en-têtes (données au début d'un fichier) répertoriant tout le contenu du fichier. Cela permet aux joueurs et aux outils de conversion de savoir facilement à quel type de données s'attendre. .vob les fichiers n'ont pas un en-tête explicite. Ainsi, lorsque ffmpeg ou avconv démarre, ils regardent les deux mille premiers octets. Dans les fichiers vob, les sous-titres peuvent commencer très tard. Dans mon testcase, le premier sous-titre apparaît après quelques secondes, donc les outils ne le voient pas lors du démarrage. Voici un exemple de sortie typique lors du codage dans ces situations:

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%

Comme on peut le voir, de nouveaux flux de sous-titres ont été trouvés lors de l'encodage proprement dit. Si l'on essayait d'ajouter -map 5 option pour inclure ce flux, ffmpeg se plaindrait au démarrage que ce numéro de flux n'existe pas.

La solution est de dire à ffmpeg d'analyser plus d'octets au début du fichier afin de trouver tous les flux.

Essayez d'ajouter les options -analyzeduration 1000000k -probesize 1000000k avant le fichier d'entrée.

Essayez d'augmenter le nombre si les flux ne sont toujours pas trouvés. Dans mes tests, ces chiffres étaient suffisamment importants. La sortie devient alors:

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

Ligne de commande complète

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

N'importe laquelle des copies peut être remplacée par un codec pour réellement convertir et probablement compresser les données. Mais s'il ne s'agit que des trois copies, la commande peut être simplifiée pour:

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

Toutes ces options sont également prises en charge par avconv. Cependant, cet outil semble toujours avoir un problème avec certains sous-titres. Si vous voyez cette erreur:

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

Vous pouvez contourner ce problème en téléchargeant la dernière ffmpeg et en utilisant cet outil à la place, comme je l'ai expliqué ci-dessus.

40
cfi

Si vous avez besoin d'une solution d'économie de qualité, vous devriez essayer MakeMKV .
Si vous souhaitez compresser la piste vidéo ou convertir MPEG-2 en H.264, vous pouvez utiliser frein à main .

4
Endoro