Voici la procédure que je connais pour convertir une image DVD en un autre format vidéo (par exemple MP4):
VTS_01_
n .VOB
fichiers à l'intérieur VIDEO_TS
dossier (pour n > = 0) dans un seul fichier VOB.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
-i filename
-c:v copy
-c:a copy
-c:s copy
-map 0
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.
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 .