Viene descritto come here come masterizzare un file srt in un video. Tuttavia, voglio mettere uno sfondo semitrasparente ai sottotitoli in modo che i testi possano essere letti più facilmente. Come lo posso fare?Come impostare lo sfondo del sottotitolo in ffmpeg?
risposta
Creare un png con una scatola trasparente e un canale alfa nella dimensione preferita. Puoi usare ad es. gimp o photoshop.
quindi utilizzare questo comando:
ffmpeg -i video.mp4 -i logo.png -filter_complex "[0:v][1:v]overlay=10:10" \
-codec:a copy out.mp4
dove 10:10 è la distanza dall'angolo in alto a sinistra.
Successivamente è possibile inserire i sottotitoli.
sottotitoli ASS possono avere uno sfondo semitrasparente per il testo.
Con Aegisub
Il modo più semplice per farlo è con aegisub.
- Aprire il file i sottotitoli con Aegisub.
- Fare clic su
Subtitle
→Styles manager
. - Sotto
Current Script
scegliereDefault
, quindi premere il pulsanteEdit
. - Esperimento con i valori
Outline
eShadow
. ControllareOpaque box
. - Sotto
Colors
fare clic sul colore sottoOutline
oShadows
. Apparirà una finestra. Regolare il valore della casellaAlpha
per modificare la trasparenza. - Salvare i sottotitoli come file
.ass
.
Ora è possibile utilizzare il file AAS per rendere hardsubs or softsubs with ffmpeg
.
Senza Aegisub
Se si desidera hardsubs è possibile utilizzare il subtitles filter per aggiungere lo sfondo trasparente con l'opzione force_style
.
ffmpeg -i input -filter_complex "subtitles=subs.ass:force_style='OutlineColour=&H80000000,BorderStyle=3,Outline=1,Shadow=0,MarginV=20'" output
Questo funziona con qualsiasi sottotitoli testuali supportati da FFmpeg perché il filtro li convertirà automaticamente in ASS.
Vedere SubStation Alpha (ASS) style fields per le opzioni di formattazione.
Problema con più linee
Se i sottotitoli contiene più righe, a causa di auto-avvolgimento di lunghe file o un'interruzione di linea intenzionale, gli sfondi si sovrapporranno e potenzialmente sembrare brutto come illustrato di seguito:
È possibile evitare questo:
- Modifica delle dimensioni
Outline
eShadow
su0
. - Le impostazioni alfa dell'ombra controllano la trasparenza della casella dello sfondo. Fare clic sul colore dell'ombra per regolare
Alpha
del colore dell'ombra sul livello di trasparenza desiderato. Modificare il file ASS in un editor di testo. Nella riga
Style
modificare il valore corrispondente aBorderStyle
a4
. Questo riempirà lo sfondo del riquadro di delimitazione di ciascun evento dei sottotitoli. EsempioStyle
line:Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H80000000,&H80000000,-1,0,0,0,100,100,0,0,4,0,0,2,10,10,10,1
Esempio:
Nota che BorderStyle=4
è un valore non standard, quindi potrebbe non funzionare correttamente in tutti i giocatori.
Grazie a sup e WM4 per la BorderStyle
suggestione.
Utilizzando drawBox
Il drawbox filter può essere utilizzato per creare una casella di sfondo. Questo può essere utile se si desidera che la scatola si estenda per la larghezza.
ffmpeg -i input -filter_complex "drawbox=w=iw:h=24:y=ih-28:t=max:[email protected],subtitles=subs.ass" output
aspetto negativo è che si deve tenere conto di interruzioni di riga o wrapping parola per lunghi sottotitoli. Sarà sufficiente rendere la casella più alta per compensare, ma sembrerà brutta perché la linea di base dei sottotitoli rimane statica: i sottotitoli a riga singola avranno più riempimento nella parte superiore rispetto alla parte inferiore.
Questo lascia una linea brutta lì in caso di sottotitoli a due righe. C'è un modo per liberarsi di Ged se? – sup
@sup Non che io sappia. Un metodo alternativo sarebbe quello di creare una scatola statica e trasparente usando il [filtro drawbox] (http://ffmpeg.org/ffmpeg-filters.html#drawbox), ma non è nemmeno un'idea. – LordNeckbeard
@LordNeckbeard man mi hai salvato la vita! È perfetto! Funziona come un fascino !! Non c'è bisogno di Adobe Encore, Adobe Premiere e tutta quella roba pagata che non è in grado di fare cose così semplici! – eusoubrasileiro
Aveva la stessa domanda, non è stata trovata una buona risposta. A quanto pare ffmpeg
(e avconv
sanno come applicare ass
formattazione a srt
in questo modo:.
avconv -i in.mp4 -vf "subtitles=subtemp.sub.0.sub:force_style='Name=Default,Fontname=Arial,Fontsize=28,PrimaryColour=&Hffffff,SecondaryColour=&Hffffff,OutlineColour=&H44000000,BackColour=&H0,BorderStyle=3,Shadow=0'" out.mp4
(sostituzione avconv
con ffmpeg
dovrebbe funzionare, o vicino ad esso)
Altri progetti A proposito ass
, in particolare quello che sembra questione sono BackColour
e BorderStyle
.
È possibile utilizzare lo script di Aegisub this. Questo script genera automaticamente uno sfondo trasparente per ogni riga di sottotitoli.
Se si vuole fare questo "fare un separato fondo di dialogo" metodo sarebbe più facile e più efficiente di utilizzare solo il [drawBox] (https://ffmpeg.org/ffmpeg-filters.html #drawbox) filtro. Inoltre, l'uso di filtri, come overlay o drawbox, richiederà la ricodifica del video, ma l'utilizzo dei sottotitoli ASS per i softsub come mostrato nella mia risposta non modificherà il video. – LordNeckbeard