Comment ajouter et / ou conserver des sous-titres lors de la conversion vidéo?

16

J'ai une vidéo mkv que je veux convertir en mp4, mais dans tous les cas j'essaie de la convertir (Handbrake, WinFF, ffmpeg, mencoder, ... je perds les sous-titres de la vidéo. Comment puis-je convertir la vidéo, en conservant les sous-titres, ou ajouter un subtitles.srt?

Je voudrais également un encodage à 2 passes avec un débit vidéo de 4054 et un débit audio de 160.

Merci.

On m'a demandé le ffmpeg -i:

joe@joe-Leopard-Extreme:/media/Elements/Home Folder/Videos$ ffmpeg -i iron.mkv
ffmpeg version 0.8.3-4:0.8.3-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav     developers
built on Jun 12 2012 16:52:09 with gcc 4.6.3
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
[matroska,webm @ 0x1a319a0] Estimating duration from bitrate, this may be inaccurate
Input #0, matroska,webm, from 'iron.mkv':
Metadata:
title           : Iron 
Duration: 02:06:01.67, start: 0.000000, bitrate: 1280 kb/s
Chapter #0.0: start 0.000000, end 546.170622
Metadata:
  title           : Chapter 00
Chapter #0.1: start 546.170622, end 1080.579489
Metadata:
  title           : Chapter 01
Chapter #0.2: start 1080.579489, end 1609.941667
Metadata:
  title           : Chapter 02
Chapter #0.3: start 1609.941667, end 2101.849733
Metadata:
  title           : Chapter 03
Chapter #0.4: start 2101.849733, end 2595.259333
Metadata:
  title           : Chapter 04
Chapter #0.5: start 2595.259333, end 3158.488667
Metadata:
  title           : Chapter 05
Chapter #0.6: start 3158.488667, end 3564.644400
Metadata:
  title           : Chapter 06
Chapter #0.7: start 3564.644400, end 4052.423356
Metadata:
  title           : Chapter 07
Chapter #0.8: start 4052.423356, end 4304.300000
Metadata:
  title           : Chapter 08
Chapter #0.9: start 4304.300000, end 4711.206489
Metadata:
  title           : Chapter 09
Chapter #0.10: start 4711.206489, end 5080.575489
Metadata:
  title           : Chapter 10
Chapter #0.11: start 5080.575489, end 5700.111067
Metadata:
  title           : Chapter 11
Chapter #0.12: start 5700.111067, end 6269.346400
Metadata:
  title           : Chapter 12
Chapter #0.13: start 6269.346400, end 6811.471333
Metadata:
  title           : Chapter 13
Chapter #0.14: start 6811.471333, end 7561.679000
Metadata:
  title           : Chapter 14
Stream #0.0(eng): Video: h264 (High), yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc
Stream #0.1(eng): Audio: ac3, 48000 Hz, 5.1, s16, 640 kb/s (default)
Metadata:
  title           : 3/2+1
Stream #0.2(ita): Audio: ac3, 48000 Hz, 5.1, s16, 640 kb/s
Metadata:
  title           : 3/2+1
Stream #0.3(eng): Subtitle: pgssub (default)
Stream #0.4(eng): Subtitle: pgssub
Stream #0.5(eng): Subtitle: pgssub
Stream #0.6(eng): Subtitle: pgssub
At least one output file must be specified
joe@joe-Leopard-Extreme:/media/Elements/Home Folder/Videos
JoeSteiger
la source

Réponses:

19

Softsubs

MP4 prend en charge la diffusion de sous-titres au format texte, mais la prise en charge de la lecture pour les lecteurs et les appareils n'est pas universelle.

Exemple de base utilisant le comportement de sélection de flux par défaut lors de la copie de flux audio:

ffmpeg -i input.mkv -c copy -c:s mov_text output.mp4

Exemple pour copier en flux tous les flux vidéo et audio, convertir tous les flux d'entrée de sous-titres basés sur du texte (SRT, ASS, VTT, etc.) au format de texte en continu et définir la langue pour les deux premiers flux de sous-titres.

ffmpeg -i input.mkv -map 0 -c copy -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:1 language=ipk output.mp4

Identique à ci-dessus mais réencode la vidéo et l'audio dans des formats compatibles avec le conteneur MP4 (vidéo H.264:

ffmpeg -i input.mkv -map 0 -c:v libx264 -c:a aac -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:1 language=ipk output.mp4

Comme ci-dessus, mais utilisez l' -mapoption pour choisir le premier flux vidéo, le deuxième flux audio et le troisième flux de sous-titres:

ffmpeg -i input.mkv -map 0:v:0 -map 0:a:1 -map 0:s:2 -c:v libx264 -c:a aac -c:s mov_text -metadata:s:s:0 language=eng output.mp4

Hardsubs

Entrées de format de sous-titres basées sur du texte

Utilisez le filtre de sous - titres pour "graver" des formats de sous-titres basés sur du texte (SRT, ASS, VTT, etc.). Notez que cela nécessite un ré-encodage, donc cela sera beaucoup plus lent que l'utilisation de softsubs.

Exemple de base utilisant le comportement de sélection de flux par défaut lors de la copie de flux audio:

ffmpeg -i input.mkv -filter_complex "subtitles=input.mkv" -c:a copy output.mp4

Exemple d'utilisation du troisième flux vidéo, du cinquième flux de sous-titres et du premier flux audio:

ffmpeg -i input.mkv -filter_complex "[0:v:2]subtitles=input.mkv:si=4[v]" -map "[v]" -map 0:a:0 -c:a copy output.mp4

Exemple pour un fichier d'entrée de sous-titres séparé ( your-subtitles-file.srt):

ffmpeg -i input.mp4 -filter_complex "subtitles=your-subtitles-file.srt" -c:a copy output.mp4

Entrées de format de sous-titres basées sur l'image

Utilisez le filtre de superposition . Cet exemple superposera le quatrième flux de sous-titres sur le deuxième flux vidéo et copiera le septième flux audio:

ffmpeg -i input.mkv -filter_complex "[0:v:2][0:s:3]overlay[v]" -map "[v]" -map 0:a:6 -c:a copy output.mp4

Regarde aussi

llogan
la source
Cela m'a un peu dérouté. Pouvez-vous fournir la commande complète? Oui, je cible une taille de fichier de sortie spécifique.
JoeSteiger
@JoeSteiger Vous devez mettre à jour votre question en fournissant d'abord la sortie console ffmpeg -i input.mkv.
llogan
Est-ce que ce que tu voulais dire ci-dessus
JoeSteiger
@JoeSteiger Oui, c'est utile.
llogan
K, laissez-moi savoir quoi faire ensuite.
JoeSteiger
13

vous pouvez utiliser -map 0 pour vous assurer que tous les flux sont copiés. Si ce n'est pas possible avec le format, ffmpeg devrait alors sortir en erreur.

-map 0 indique à ffmpeg / libav d'inclure tous les flux, pas seulement ceux pour lesquels vous avez défini des règles de convecsion.

Normalement, -map est utilisé pour définir le mappage de flux - c'est-à-dire que le flux 1 en entrée doit devenir le flux 0 en sortie. Avec juste -map 0, vous dites à ffmpeg / libav de prendre tous les flux sans mélange.

Arne Babenhauserheide
la source
Pouvez-vous expliquer un peu plus?
Kaz Wolfe
J'ai édité ma réponse
Arne Babenhauserheide
1

Si vous voulez simplement faire une simple conversion en mp4, vous pouvez utiliser VLC. VLC acceptera un fichier de sous-titres et le rendra sur la sortie.

Pour les conversions plus compliquées, y compris le style des sous-titres, vous pouvez utiliser OpenShot.

user191688
la source
-1

Eh bien, j'ai trouvé un moyen de le faire fonctionner, pas idéal, mais ça marche. Je peux ajouter un srt à une vidéo avec mkvmerge. Le seul inconvénient est qu'il rend la vidéo mkv, pas mp4.

JoeSteiger
la source