Extraindo legendas de arquivos MKV com ffmpeg ou mplayer


3

Um arquivo MKV contendo vários conjuntos de legendas se recusa a reproduzi-los em um SmartTV ou dispositivos semelhantes, sem ver legendas. O mplayer gerencia o arquivo sem problemas. Aqui está o que está no arquivo:

$ ffprobe input.mkv |& grep Stream
Stream #0:0(zxx): Video: h264 (High), yuv420p(progressive), 716x360 [SAR 32:27 DAR 2864:1215], SAR 212:179 DAR 106:45, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
Stream #0:1(spa): Audio: ac3, 48000 Hz, stereo, fltp, 224 kb/s (default)
Stream #0:2(eng): Subtitle: dvd_subtitle, 720x480 (default)
Stream #0:3(fre): Subtitle: subrip
Stream #0:4(por): Subtitle: subrip

Minha suposição é que jogadores menos capazes são incapazes de lidar com formatos de legenda que não sejam SRT. A questão é como extrair a legenda de legendas em inglês existente do arquivo MKV, convertê-la em SRT e, opcionalmente, adicioná-la novamente no arquivo MKV.

Além de "nunca vi um arquivo MP4 com legendas SRT", outro thread ( Convertendo legendas de DVD em texto ) que fez a mesma pergunta não foi respondida.

O supostamente definitivo https://trac.ffmpeg.org/wiki/ExtractSubtitles contém informações que não correspondem à operação real do ffmpeg. Este é meu ffmpeg:

$ ffmpeg -v
ffmpeg version 3.3 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 7.1.0 (GCC)
configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/man --disable-static --enable-shared --enable-runtime-cpudetect --enable-avresample --enable-gpl --enable-version3 --enable-pthreads --enable-postproc --disable-debug --disable-indev=jack --disable-outdev=jack --arch=x86_64 --enable-pic --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-gnutls --enable-libcaca --enable-libcdio --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvorbis --enable-libvpx --enable-libmp3lame --enable-opencl --enable-opengl --enable-libopenjpeg --enable-libpulse --enable-libsmbclient --enable-libwavpack
libavutil      55. 58.100 / 55. 58.100
libavcodec     57. 89.100 / 57. 89.100
libavformat    57. 71.100 / 57. 71.100
libavdevice    57.  6.100 / 57.  6.100
libavfilter     6. 82.100 /  6. 82.100
libavresample   3.  5.  0 /  3.  5.  0
libswscale      4.  6.100 /  4.  6.100
libswresample   2.  7.100 /  2.  7.100
libpostproc    54.  5.100 / 54.  5.100

E isso é o que eu tentei fazer, sem sucesso:

$ ffmpeg -i input.mkv -map 0:2 subs-EN.srt
...
Stream mapping:
  Stream #0:2 -> #0:0 (dvd_subtitle (dvdsub) -> subrip (srt))
  Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
$ ffmpeg -codecs | grep dvdsub
...
DES... dvd_subtitle DVD subtitles (decoders: dvdsub ) (encoders: dvdsub )

Assim, o decodificador dvdsub é compilado no ffmpeg (como esperado, ou as legendas não serão mostradas no mplayer), mas não está sendo invocado para convertê-las.

Eu também tentei

$ mplayer -dumpsrtsub -dumpfile subs-EN.srt -sid 0 input.mkv 
MPlayer 1.3.0-7.1.0 (C) 2000-2016 MPlayer Team
...
[lavf] stream 0: video (h264), -vid 0
[lavf] stream 1: audio (ac3), -aid 0, -alang spa
[lavf] stream 2: subtitle (dvdsub), -sid 0, -slang eng
[lavf] stream 3: subtitle (srt), -sid 1, -slang fre
[lavf] stream 4: subtitle (srt), -sid 2, -slang por
...

O fluxo de legendas correto está sendo reproduzido, mas nada é gravado no subsen.srt.

O que estou fazendo de errado?



Entendo. Obrigado. Resumir "dvdsub" não é um formato de legenda baseado em texto (surpreendente, porque eu posso mudar a fonte que é usada para renderizá-lo), e precisa de OCR para convertê-lo em srt. No entanto, pode ser "gravado" como uma sobreposição no vídeo. Infelizmente, dos dois comandos que você oferece lá, nenhum dos dois funciona muito bem: ffmpeg -i input.mkv -vf legendas = input.mkv -acodec copy -sn convert.mkv ou ffmpeg -i input.mkv -filter_complex "[0: v : 0] [0: 2] sobreposição "-acodec copy -sn convert.mkv
Edward Sternin

ffmpeg -i input.mkv -vf legendas = input.mkv -acodec copy -sn convert.mkv reclama Não há tal filtro: 'legendas' enquanto ffmpeg -i input.mkv -filter_complex "[0: v: 0] [0: 2] sobreposição" -acodec copy -crf 20 -sn convert.mkv produz saída de qualidade terrível.
Edward Sternin

saída de qualidade terrível - & gt; a parte das legendas ou a imagem completa? Se este último, as imagens podem ter sprites retrógrados dentro de seus pixels e / ou baixa resolução. Eu sugeriria a rota do OCR para o texto primeiro. O filtro de legendas requer libass para ser compilado / vinculado.
Gyan

Toda a imagem, tudo em bloco, como se fosse uma largura de banda de vídeo muito limitada. De fato, adicionando -crf 20 não melhorou muito a qualidade, se é que o fez. Existem alguns sprites (?) Dentro das legendas, e sua resolução também é ruim, mas não é crítica. Devo dizer que você é a única pessoa, em qualquer fórum, que parece entender o ffmpeg, um software singularmente idiossincrático. Obrigado pela sua paciência, mas você está anos-luz à frente do resto de nós, tentando acompanhar. Existe uma estratégia equivalente no mplayer / mencoder? Eu pareço entender melhor sua lógica.
Edward Sternin
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.