Existe-t-il une option dans ffmpeg pour spécifier une piste de sous-titre qui devrait être affichée par défaut?

3

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%
Sean
la source
Quel (s) joueur (s) avez-vous testé?
llogan
J'ai essayé QuickTime et VLC. Les deux m'ont obligé à sélectionner manuellement la piste de sous-titre.
Sean
Je pense que cela dépend du joueur. Mon VLC affichera tous les sous-titres par défaut. Je me souviens que je devais toujours les éteindre. Pouvez-vous faire une copie courte du fichier avec ffmpeg -i movie-sub.mp4 -c copy -map 0 -t 1 out.mp4 et le télécharger quelque part?
slhck

Réponses:

1

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:

La spécification Matroska - http://matroska.org/technical/specs/index.html (search for FlagDefault) - spécifie que la valeur de l'indicateur par défaut est "default" si rien n'est spécifié, le démultiplexeur marque donc toutes les pistes de sous-titre comme "default".

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:

    $ ffmpeg -i big_buck_bunny_480p_surround-fix.avi -i subtitle.srt -c copy test.mkv
    $ ffmpeg -i test.mkv
    Input #0, matroska,webm, from 'test.mkv':
      Metadata:
        ENCODER         : Lavf56.25.101
      Duration: 00:28:31.40, start: 0.000000, bitrate: 1028 kb/s
        Stream #0:0: Video: mpeg4 (Simple Profile), yuv420p, 854x480 [SAR 1:1 DAR 427:240], 24 fps, 24 tbr, 1k tbn, 24 tbc (default)
        Stream #0:1: Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s (default)
        Stream #0:2: Subtitle: subrip (default)
    
  • 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...?

    $ ffmpeg -i sample.mp4 -c copy sample.avi
    $ ffmpeg -i sample.avi -i subtitle.srt -c copy sample.mkv
    $ ffmpeg -i sample.mkv
    ...
    Input #0, matroska,webm, from 'sample.mkv':
      Metadata:
        ENCODER         : Lavf56.25.101
      Duration: 00:28:31.40, start: 0.000000, bitrate: 2 kb/s
        Stream #0:0: Video: h264 (Constrained Baseline), yuv420p(tv, bt709), 560x320, SAR 1:1 DAR 7:4, 60 fps, 60 tbr, 1k tbn, 60 tbc (default)
        Stream #0:1: Audio: aac (LC), 48000 Hz, mono, fltp (default)
        Stream #0:2: Subtitle: subrip (default)
    

LA VICTOIRE! Faire mp4 --> avi et alors avi + 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é

  • ffmpeg n'est définitivement pas adapté pour le moment à la définition de flux par défaut ou forcés,
  • mkv est probablement meilleur que mp4 en tant que conteneur d’origine, car il possède un outil connu qui fait le travail correctement ( mkvpropedit de mkvtoolnix ).
Détails de la version de ffmpeg:

ffmpeg version 2.6.1 construite avec gcc 4.9.2 (GCC) 20150304 (version préliminaire)     configuration: --prefix = / usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-avresample --enable-fontconfig --enable-gnutls --enable-gpl - enable-libass --enable-libbluray --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg - enable-libopus --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvorbis --enable-libvpx --enable-libx264 - enable-libx265 --enable-libxvid --enable-runtime-cpudetect --enable-shared --enable-swresample --enable-vdpau --enable-version3 --enable-x11grab`

neitsab
la source
4
Je pense comme par ce patch c'est maintenant possible. Au moins pour moi ça marche avec ffmpeg -i in.mp4 -i in.srt -c copy -disposition:s:0 default out.mkv
1

Vous pouvez utiliser MP4Box 0.6.2-DEV-rev453 (Mai 2016) ou supérieur pour le faire:

mp4box -add alfa.mp4 -add bravo.srt:txtflags=0xC0000000 -new charlie.mp4

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:


J'ai vu des mentions à ce post sur la liste de diffusion FFmpeg concernant un correctif qui implémente la disposition pour FFmpeg:

ffmpeg -i alfa.mp4 -i bravo.srt -c copy -c:s mov_text -disposition:s forced charlie.mp4

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.

Steven Penny
la source