Como ir de legendas .srt e um vídeo .ts para um vídeo .ts com dvb_subtitles?
Estou tentando obter de um arquivo de legenda .srt + um arquivo de vídeo .ts => um arquivo de vídeo .ts com um dvb_subtitle.
Meu .srt:
1
00:00:00,000 --> 00:00:05,000
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vel hendrerit massa.
2
00:00:05,000 --> 00:00:10,000
Aliquam dolor sapien, molestie ac sagittis eu, tempus nec est.
3
00:00:10,000 --> 00:00:28,000
Morbi id sem eu sapien consectetur imperdiet. Morbi sed purus et sapien interdum placerat vitae quis orci.
Meu .ts: sample_1920x1080.ts de https://filesamples.com/formats/ts
SubtitleEdit comando: .\SubtitleEdit.exe /convert 'test_subtitles.srt' Blu-raysup /resolution:1920x1080 /overwrite
. Isso cria um arquivo test_subtitles.sup conforme o esperado.
Eu, então, usar ffmpeg
para incluir as legendas .sup, como este: .\ffmpeg.exe -y -i 'sample_1920x1080.ts' -fix_sub_duration -i 'test_subtitles.sup' -map 0:v -map 1:s -vcodec copy -acodec copy -scodec dvbsub -copyts -muxdelay 0 -max_delay 0 'output.ts'
. Isso funciona, mas às vezes os resultados não são muito legíveis. Aqui está uma captura de tela:

Eu tenho alguma outra opção aqui? Ou opções em subtitleedit / ffmpeg para f.ex. fazer as legendas ficarem maiores?
(Eu postei isso no repositório SubtitleEdit Github também: https://github.com/SubtitleEdit/subtitleedit/issues/4539.)
ATUALIZAR:
Aprendi com o autor do SubtitleEdit que é realmente possível aumentar o tamanho da fonte usando a interface gráfica do usuário do SubtitleEdit (veja aqui . No entanto, desejo fazer isso usando uma ferramenta de linha de comando.
Respostas
Infelizmente, isso tinha que ser feito com ffmpeg assim:
ffmpeg -i ./sample_1280x720.ts -i ./sample.srt -map 0 -map 1 -c copy -c:s dvd_subtitle ./out.ts
mas o ffmpeg não o aceita com este erro:
A codificação de legendas atualmente só é possível de texto para texto ou bitmap para bitmap
.srt
o formato é baseado em texto e o .sup
formato é baseado em imagem.
assim, enquanto o ffmpeg se recusar a codificar a legenda em vídeo.
podemos usar -vf
(filtro de vídeo), legenda Hardcoding (srt) no vídeo:
ffmpeg -i ./sample_1280x720.ts -vf subtitles=sample.srt:force_style='Fontsize=24' ./out.ts
Podemos definir o tamanho da fonte com Fontsize
opção.

mas se tiver o sup
e quiser gravar em vídeo, você pode usar isto:
ffmpeg -i ./sample_1280x720.ts -i ./sample.sup -filter_complex "[0:v][1:s]overlay" ./out.ts
EDITAR 19.12.2020:
A ideia do meu último comentário - um script Python que substitui o tamanho da fonte em Settings.xml do SubtitleEdit, para ser chamado antes de seus scripts:
https://github.com/Twenkid/Python-Various/blob/main/Exercise/SubtitleEdit/sub.py
python sub.py C:\SE3518\Settings.xml 44
etc.
...
Você já tentou escalar a trilha do dvb? Esse tópico sugere que é possível: dimensionamento de legendas ffmpeg e dvb
Essa parte da Maknol (embora
eu não tenha experimentado
):
-filter_complex "[0: s: 0] escala = -1: 2400 [sub], [0: v] [sub] sobreposição = x = 150: y = -80"
Onde:
escala - tamanho da legenda
sobreposição x = - vertical
sobreposição y = - horizontal
EDIT: Eu consegui dimensionar as legendas .sup com ffmpeg, mas até agora funcionou em duas passagens, veja abaixo.
Minha sequência foi:
- Seu comando, produzindo um stream com as legendas:
ffmpeg -i sample_1920x1080.ts -fix_sub_duration -i test_subtitles.sup -map 0: v -map 1: s -vcodec copy -acodec copy -scodec dvbsub -copyts -muxdelay 0 -max_delay 0 outputA.ts
- Dimensione as legendas e ajuste sua posição (no entanto, requer uma nova codificação devido ao filter_complex)
ffmpeg -i outputA.ts -metadata title = "Scale" -filter_complex "[0: s: 0] scale = -1: 1400 [sub], [0: v] [sub] overlay = x = -250: y = -300 "-c: v libx264 -b: v 5M -preset fast -aspect 16: 9 -c: uma cópia output_Scaled.ts
Tamanho inicial:

Minhas legendas iniciais eram maiores (tamanho da fonte 25) e o coeficiente de escala aqui é pequeno = 1400/1080
Em escala:

...
Se eu tentar fazer isso de uma vez, minha sintaxe renderiza o tamanho padrão + sobrepõe os dimensionados (e exibe apenas um item, não todos).
Essa é a tentativa de um passe:
# Uma vez sobrepõe-se a eles ... ffmpeg -i sample_1920x1080.ts -fix_sub_duration -i test_subtitles.sup -scodec dvbsub -map 0: v -map 1: s -metadata title = "Escala" -filter_complex "escala [1: s] = -1: 1400 [sub], [0: v] [sub] sobreposição = x = -250: y = -300 "-c: v libx264 -crf 20 -preset veryfast -aspect 16: 9 -c: a aac -b estrito experimental: um 192k outputSTACK_SUP.ts
Produz algo assim:
