Como ir de legendas .srt e um vídeo .ts para um vídeo .ts com dvb_subtitles?

Nov 27 2020

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 ffmpegpara 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

Abilogos Dec 17 2020 at 22:27

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

.srto formato é baseado em texto e o .supformato é 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 Fontsizeopção.

mas se tiver o supe 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
Twenkid Dec 17 2020 at 02:16

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:

  1. 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

  1. 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: