Jak przejść z napisów .srt i wideo .ts do wideo .ts z dvb_subtitles?

Nov 27 2020

Próbuję uzyskać z pliku napisów .srt + plik wideo .ts => plik wideo .ts z dvb_subtitle.

Mój .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.

My .ts: sample_1920x1080.ts from https://filesamples.com/formats/ts

SubtitleEdit polecenie: .\SubtitleEdit.exe /convert 'test_subtitles.srt' Blu-raysup /resolution:1920x1080 /overwrite. Spowoduje to utworzenie pliku test_subtitles.sup zgodnie z oczekiwaniami.

Następnie używać ffmpegdo włączenia .sup napisy, na przykład: .\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'. To działa, ale wyniki są czasami niezbyt czytelne. Oto zrzut ekranu:

Czy mam tu jakieś inne opcje? Lub opcje w ramach subtitleedit / ffmpeg do f.ex. zwiększyć rozmiar napisów?

(Wysłałem to również do repozytorium SubtitleEdit Github: https://github.com/SubtitleEdit/subtitleedit/issues/4539.)

AKTUALIZACJA:

Dowiedziałem się od autora SubtitleEdit, że rzeczywiście można zwiększyć rozmiar czcionki, używając graficznego interfejsu użytkownika SubtitleEdit (patrz tutaj . Jednak chciałbym to zrobić za pomocą narzędzia wiersza poleceń.

Odpowiedzi

Abilogos Dec 17 2020 at 22:27

Niestety trzeba było to zrobić z ffmpeg w ten sposób:

ffmpeg -i ./sample_1280x720.ts -i ./sample.srt -map 0 -map 1 -c copy -c:s dvd_subtitle ./out.ts

ale ffmpeg nie zaakceptuje tego z tym błędem:

Kodowanie napisów jest obecnie możliwe tylko z tekstu na tekst lub bitmapy na bitmapę

.srtformat jest oparty na tekście, a .supformat jest oparty na obrazie.

tak długo, jak ffmpeg odmawia zakodowania napisów w wideo.

możemy użyć -vf(filtr wideo), Hardcoding (srt) napisów do filmu:

ffmpeg -i ./sample_1280x720.ts -vf subtitles=sample.srt:force_style='Fontsize=24' ./out.ts

Możemy zdefiniować rozmiar czcionki za pomocą Fontsizeopcji.

ale jeśli masz supi chcesz wypalić na wideo, możesz użyć tego:

ffmpeg -i ./sample_1280x720.ts -i ./sample.sup  -filter_complex "[0:v][1:s]overlay" ./out.ts
Twenkid Dec 17 2020 at 02:16

EDYCJA 19.12.2020:

Pomysł z mojego ostatniego komentarza - skrypt Pythona, który zastępuje rozmiar czcionki w Settings.xml SubtitleEdit, do wywołania przed twoimi skryptami:

https://github.com/Twenkid/Python-Various/blob/main/Exercise/SubtitleEdit/sub.py

python sub.py C:\SE3518\Settings.xml 44

itp.

...

Czy próbowałeś skalować ścieżkę dvb? Ten wątek sugeruje, że jest to możliwe: skalowanie napisów ffmpeg i dvb

Ta część autorstwa Maknola (chociaż tego nie próbowałem ):

-filter_complex "[0: s: 0] scale = -1: 2400 [sub], [0: v] [sub] overlay = x = 150: y = -80"

gdzie:

skala - rozmiar podtytułu

nakładka x = - w pionie

nakładka y = - pozioma

EDYCJA: Udało mi się skalować napisy .sup za pomocą ffmpeg, ale do tej pory działało to w dwóch przebiegach, patrz poniżej.

Moja sekwencja była następująca:

  1. Twoje polecenie, tworząc strumień z napisami:

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 wyjścieA.ts

  1. Skaluj napisy i dostosuj ich położenie (jednak wymaga to ponownego kodowania ze względu na filter_complex)

ffmpeg -i outputA.ts -metadata title = "Skala" -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: kopia output_Scaled.ts

Początkowy rozmiar:

Moje początkowe napisy były większe (rozmiar czcionki 25), a współczynnik skalowania tutaj jest mały = 1400/1080

Łuskowaty:

...

Jeśli próbowałem to zrobić w jednym przebiegu, moja składnia renderowała domyślny rozmiar + nakładała skalowane (i wyświetla tylko jeden element, nie wszystkie).

Oto próba jednego podania:

# Za jednym razem nakłada je ... ffmpeg -i sample_1920x1080.ts -fix_sub_duration -i test_subtitles.sup -scodec dvbsub -map 0: v -map 1: s -metadata title = "Scale" -filter_complex "[1: s] scale = -1: 1400 [sub], [0: v] [sub] overlay = x = -250: y = -300 "-c: v libx264 -crf 20 -preset veryfast -aspect 16: 9 -c: a aac -strict Experimental -b: a 192k outputSTACK_SUP.ts

Tworzy coś takiego: