Existe uma opção no ffmpeg para especificar uma faixa de legenda que deve ser mostrada por padrão?

3

Eu tenho um vídeo no formato MP4 que é predominantemente inglês, mas tem uma cena em que um personagem fala outro idioma. Eu tenho uma legenda em inglês no formato SRT para o diálogo deste personagem. É possível incorporar a faixa de legendas no próprio MP4 e tê-lo ativado por padrão sem ter que ativá-lo manualmente. Com o comando que estou usando no momento (abaixo), a faixa de legendas é adicionada ao arquivo, mas eu tenho que selecioná-lo manualmente ao reproduzir o vídeo.

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

Existe algum outro metadado que preciso adicionar para que os subs sejam exibidos por padrão? Eu gostaria de evitar subs hard, se possível. Se esta é uma limitação do contêiner MP4, eu estaria bem com a mudança para outro formato como MKV.

Saída do 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%
    
por Sean 11.01.2014 / 03:44

2 respostas

1

Não, não há uma opção no ffmpeg para especificar uma faixa de legenda que deve ser mostrada por padrão.

(ffmpeg versão 2.6.1 criada com o gcc 4.9.2 (GCC) 20150304 (pré-lançamento) como padrão no Arch, veja o final da resposta para os sinalizadores de compilação)

Os recursos que destacam a falta de opções de linha de comando para configurar o fluxo de legendas padrão / forçado no ffmpeg incluem o seguinte:

Por fim, esta pergunta no StackOverflow pergunta o mesmo que você, mas para mkv, e destaca o fato de que o ffmpeg é o culpado desde mkvpropedit (parte do mkvtoolnix ) pode fazer isso.

No entanto, existe uma possível solução alternativa

Este relatório de bug do ffmpeg de março de 2013 (ainda aberto) lida com mkv e sinalizador padrão para legendas e explica algo que nós pode usar para contornar essa limitação em alguns cenários:

The Matroska specification - ​http://matroska.org/technical/specs/index.html (search for FlagDefault) - specifies that the value for the default flag is "default" if nothing is specified, the demuxer therefore marks all subtitle tracks as "default".

Então o ffmpeg pode escrever o sinalizador padrão em nosso fluxo de legendas em alguns casos; Eu tentei com arquivos de vídeo de entrada diferentes e obtive resultados mistos:

  • com o Big Buck Bunny AVI Mpeg4 e um arquivo .srt aleatório, o fluxo de legendas remk mkv did tem o sinalizador padrão:

    $ 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)
    
  • no entanto, não consegui reproduzir isso com uma amostra amostra contendo mp4 H264 nem com um mp4 pessoal, então eu acho que mp4 --> mkv não funciona. Mas e se ...?

    $ 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)
    

VITÓRIA! Fazer mp4 --> avi e, em seguida, avi + srt --> mkv recebe o fluxo de legendas por padrão e o VLC os exibe corretamente.

Claro que é muito rotativo e prefiro não pensar na perda de informações no processo, mas pelo menos funciona.

Resumo

  • O ffmpeg definitivamente não está adaptado agora para definir fluxos como padrão ou forçado,
  • O
  • mkv é provavelmente melhor que o mp4 como um contêiner de origem, já que ele possui uma ferramenta conhecida que faz o trabalho bem ( mkvpropedit de mkvtoolnix ).
Detalhes da versão do ffmpeg:

ffmpeg version 2.6.1 built with gcc 4.9.2 (GCC) 20150304 (prerelease) 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'

    
por 01.05.2015 / 14:32
1

Você pode usar MP4Box 0.6.2-DEV-rev453 (maio de 2016) ou superior para fazer isso:

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

Exemplo

Isso marcará o fluxo de legendas no arquivo de saída como forçado.

No entanto , essa marca só será reconhecida a partir dessas versões do programas:

  • MPC-HC 1.7.10.207 (maio de 2016)

  • media player VLC 3.0.0-20161101 (nov 2016)

Eu vi menções a esta postagem na lista de discussão do FFmpeg sobre uma patch que implementa disposição para o FFmpeg:

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

No entanto, depois de ter tentado com "forçado" e "padrão", as legendas marcados pelo FFmpeg não são reconhecidos como forçados pelo MPC-HC ou pelo VLC.

    
por 25.11.2016 / 23:32

Tags