J'ai une vidéo au format MP4 qui est principalement en anglais, mais comporte une scène dans laquelle un personnage parle une autre langue. J'ai une piste de sous-titres anglais au format SRT pour le dialogue de ce personnage. Est-il possible d'incorporer la piste de sous-titre dans le MP4 lui-même et de l'activer par défaut sans avoir à l'activer manuellement. Avec la commande que j'utilise actuellement (ci-dessous), la piste de sous-titre est ajoutée au fichier, mais je dois la sélectionner manuellement lorsque vous lisez la vidéo.
ffmpeg -i movie.mp4 -i movie.srt -c:v copy -c:a copy -c:s mov_text \
-metadata:s:s:0 language=eng movie-sub.mp4
Y a-t-il d'autres métadonnées à ajouter pour que les sous-utilisateurs apparaissent par défaut? Je voudrais éviter les sous-marins durs si possible. S'il s'agit d'une limitation du conteneur MP4, je pourrais très bien passer à un autre format tel que MKV.
Sortie de ffmpeg:
ffmpeg version 2.1.1 Copyright (c) 2000-2013 the FFmpeg developers
built on Dec 31 2013 15:44:02 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
configuration: --prefix=/opt/local --enable-swscale --enable-avfilter --enable-avresample --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-libtheora --enable-libschroedinger --enable-libopenjpeg --enable-libmodplug --enable-libvpx --enable-libspeex --enable-libass --enable-libbluray --enable-gnutls --enable-libfreetype --disable-indev=jack --disable-outdev=xv --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/clang --arch=x86_64 --enable-yasm --enable-gpl --enable-postproc --enable-libx264 --enable-libxvid --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-nonfree --enable-libfaac
libavutil 52. 48.101 / 52. 48.101
libavcodec 55. 39.101 / 55. 39.101
libavformat 55. 19.104 / 55. 19.104
libavdevice 55. 5.100 / 55. 5.100
libavfilter 3. 90.100 / 3. 90.100
libavresample 1. 1. 0 / 1. 1. 0
libswscale 2. 5.101 / 2. 5.101
libswresample 0. 17.104 / 0. 17.104
libpostproc 52. 3.100 / 52. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'movie.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2013-03-18 08:10:43
Duration: 01:37:23.05, start: 0.000000, bitrate: 1877 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1683 kb/s, 23.98 fps, 23.98 tbr, 48k tbn, 47.95 tbc (default)
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 191 kb/s (default)
Input #1, srt, from 'movie.srt':
Duration: N/A, bitrate: N/A
Stream #1:0: Subtitle: subrip
Output #0, mp4, to 'movie-sub.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
encoder : Lavf55.19.104
Stream #0:0(und): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=2-31, 1683 kb/s, 23.98 fps, 48k tbn, 48k tbc (default)
Stream #0:1(und): Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, 191 kb/s (default)
Stream #0:2(eng): Subtitle: mov_text ([8][0][0][0] / 0x0008)
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Stream #1:0 -> #0:2 (subrip -> mov_text)
Press [q] to stop, [?] for help
frame=140093 fps=9457 q=-1.0 Lsize= 1340911kB time=01:37:23.04 bitrate=1880.0kbits/s
video:1200658kB audio:136946kB subtitle:0 global headers:0kB muxing overhead 0.247196%
ffmpeg -i movie-sub.mp4 -c copy -map 0 -t 1 out.mp4
et le télécharger quelque part?Réponses:
Non, il n'y a pas d'option dans ffmpeg pour spécifier une piste de sous-titre qui devrait être affichée par défaut.
(ffmpeg version 2.6.1 construite avec gcc 4.9.2 (GCC) 20150304 (version préliminaire) par défaut sur Arch, voir la fin de réponse pour les drapeaux de compilation)
Les ressources soulignant l'absence d'options de ligne de commande pour la définition du flux de sous-titres par défaut / forcés dans ffmpeg sont les suivantes:
Finalement, cette question sur StackOverflow demande la même chose que vous mais pour mkv, et souligne le fait que ffmpeg est le coupable depuis mkvpropedit (partie de mkvtoolnix ) peut le faire.
Cependant, il existe une solution de contournement possible
Ce rapport de bogue ffmpeg de mars 2013 (toujours ouvert) traite de mkv et du drapeau par défaut pour les sous-titres et explique quelque chose que nous pouvons utiliser pour contourner cette limitation dans certains scénarios:
Donc ffmpeg peut écrire l'indicateur par défaut sur notre flux de sous-titres dans certains cas; Je l'ai essayé avec différents fichiers vidéo d'entrée et j'ai obtenu des résultats mitigés:
avec le Big Buck Bunny AVI Mpeg4 et un fichier .srt aléatoire, le flux de sous-titres mkv remodelé fait avoir le drapeau par défaut:
mais je ne pouvais pas reproduire cela avec un échantillon H264 contenu dans le mp4 ni avec un mp4 personnel, donc je suppose
mp4 --> mkv
ne fonctionne pas. Mais si...?LA VICTOIRE! Faire
mp4 --> avi
et alorsavi + srt --> mkv
active le flux de sous-titres par défaut et VLC les affiche correctement.Bien sûr, c'est très détourné et je préfère ne pas penser à la perte d'informations dans le processus, mais au moins cela fonctionne.
Résumé
la source
ffmpeg -i in.mp4 -i in.srt -c copy -disposition:s:0 default out.mkv
Vous pouvez utiliser MP4Box 0.6.2-DEV-rev453 (Mai 2016) ou supérieur pour le faire:
Exemple
Ceci marquera le flux de sous-titres dans le fichier de sortie comme étant forcé.
toutefois , cette marque ne sera reconnue qu'à partir de ces versions de programmes:
MPC-HC 1.7.10.207 (Mai 2016)
Lecteur multimédia VLC 3.0.0-20161101 (Nov 2016)
J'ai vu des mentions à ce post sur la liste de diffusion FFmpeg concernant un correctif qui implémente la disposition pour FFmpeg:
Cependant, après avoir essayé avec "forcé" et "par défaut", les sous-titres marqués par FFmpeg ne sont pas reconnus comme forcés par MPC-HC ou VLC.
la source