Usa ffmpeg per aggiungere sottotitoli di testo [chiuso]


122

Sto cercando di aggiungere sottotitoli di testo a un contenitore .mp4 usando ffmpeg:

ffmpeg -i input.mp4 -i input.srt -map 0.0 -map 0.1 -map 1.0 output.mp4

Quando provo a eseguire questa riga, viene visualizzato un errore:

Il numero delle mappe di flusso deve corrispondere al numero di flussi di output.

Se provo a cambiare mp4 in mkv (sebbene mp4 supporti i sottotitoli di testo), in questo modo:

ffmpeg -i input.mp4 -i input.srt -map 0.0 -map 0.1 -map 1.0 output.mkv

Mappa correttamente i flussi, ma restituisce un errore:

Encoder (codec id 94210) non trovato per il flusso di output n. 0.2

Quando lancio

ffmpeg -codecs

Vedo che il codec srt è supportato come decodificatore e codificatore, tuttavia non sono sicuro di cosa venga utilizzato per la codifica dei sub mp4 e mkv e se devo accenderlo o compilare separatamente.

Risposte:


196
ffmpeg -i infile.mp4 -i infile.srt -c copy -c:s mov_text outfile.mp4

-vf subtitles=infile.srt non funzionerà con -c copy


L'ordine di -c copy -c:s mov_textè importante. Stai dicendo a FFmpeg:

  1. Video: copia, Audio: copia, Sottotitolo: copia
  2. Sottotitolo: mov_text

Se li inverti, stai dicendo a FFmpeg:

  1. Sottotitolo: mov_text
  2. Video: copia, Audio: copia, Sottotitolo: copia

In alternativa puoi semplicemente usare -c:v copy -c:a copy -c:s mov_textin qualsiasi ordine.


13
Questo metodo aggiunge i sottotitoli al file come uno stream, quindi è necessario il supporto del lettore per mostrare i sottotitoli (come VLC)
BollMose

1
Significa che il sottotitolo è disponibile, ma non masterizzato nel video? Posso mostrare se voglio su richiesta?
Dom

3
Sì @ sunk818 questo è ciò che significa. Questo aggiunge il sottotitolo come una traccia che può essere abilitata o disabilitata fintanto che il lettore lo supporta. Mr. Hyde e Paul ffmpeg possono anche aggiungere i sottotitoli in cima al video stesso, e in quei casi dovresti controllare cose come il carattere e il posizionamento.
Boushley

1
I file .srt devono essere importati con -c:s copynon con -c:s mov_text.
GetFree

82

NOTA: questa soluzione "brucia i sottotitoli" nel video, in modo che ogni spettatore del video sarà costretto a vederli.

Usa la libasslibreria (assicurati che la tua installazione di ffmpeg abbia la libreria nella configurazione --enable-libass).

Prima converti i sottotitoli in .assformato:

ffmpeg -i subtitles.srt subtitles.ass

Quindi aggiungili usando un filtro video:

ffmpeg -i mymovie.mp4 -vf ass=subtitles.ass mysubtitledmovie.mp4

40
In questo modo verranno "masterizzati" nel video, ovvero non potrai disattivarli nel lettore. Questo è diverso dall'aggiungerli come stream di sottotitoli che possono essere letti dal giocatore e visualizzati se lo spettatore li desidera.
stib

1
Grazie mille per questa soluzione. C'è comunque da specificare la dimensione dei caratteri?
user1319182

1
Dai un'occhiata a questa risposta: stackoverflow.com/questions/21363334/… . Probabilmente vorrai impostare il carattere nel file dei sottotitoli stesso, altrimenti usando il filtro dei sottotitoli, potresti force_style per impostare il carattere: ffmpeg.org/ffmpeg-filters.html#subtitles-1
HdN8

Ciò sarà utile quando si aggiungono i sottotitoli per i video da qualche parte come Instagram. Da qualche parte come il visualizzatore di Instagram che l'utente non ha la capacità di ascoltare l'audio o il video è in un'altra lingua, quindi l'utente può invece leggere i sottotitoli
ϻαϻɾΣɀО-MaMrEzO

1
Installa le libassestensioni se mancanti sui sistemi Debian con `apt update && apt install libass-dev"
Sopalajo de Arrierez

53

Stai tentando di convertire i sottotitoli come flusso di sottotitoli. È facile ma viene utilizzata una sintassi diversa per MP4 (o M4V) e MKV. In entrambi i casi è necessario specificare il codec video e audio o semplicemente copiare lo stream se si desidera solo aggiungere i sottotitoli.

MP4:

ffmpeg -i input.mp4 -f srt -i input.srt \
-map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy \
-c:s mov_text output.mp4

MKV:

ffmpeg -i input.mp4 -f srt -i input.srt \
-map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy \
-c:s srt  output.mkv

3
È possibile aggiungere più di un sottotitolo? Questo softsub verrà riconosciuto come lingua sconosciuta?
Patrick

1
Sì. L'ho appena testato per MKV:
dotokija

7
Per prima cosa aggiungi un altro input: -i input2.srt. Secondo, mappalo come secondo flusso: -map 2: 0. Infine, seleziona il codificatore per il secondo flusso di sottotitoli (lo stesso del primo): -c: s srt. L'esempio completo \ ffmpeg -i input.mp4 -f srt -i input.srt -i input2.srt \ -map 0: 0 -map 0: 1 -map 1: 0 -map 2: 0 -c: v copy - c: a copy \ -c: s srt -c: s srt output.mkv
dotokija

8
E per aggiungere i metadati della lingua (inserire prima del file di output) "-metadata: s: s: 0 language = eng"
Patrick

come mai i sottotitoli nel file originale vengono esclusi quando "riavvolgo" i file mkv come file mp4 (ffmpeg -i film.mkv -vcodec copy -acodec copy film.mp4) ?? il mkv originale ha i sottotitoli ma l'output in formato mp4 no. cosa sta succedendo? cosa non sto facendo correttamente?
oldboy

9

Il contenitore MKV supporta codec video e audio Praticamente qualsiasi cosa e supporta anche sottotitoli e menu DVD. Quindi puoi semplicemente copiare i codec dal video in ingresso al video in uscita con il contenitore MKV con i sottotitoli. Per prima cosa dovresti convertire SRT in formato di sottotitoli ASS

ffmpeg -i input.srt input.ass

e incorpora i sottotitoli ASS nel video

ffmpeg -i input.mp4 -i input.ass -c:v copy -c:a copy -c:s copy -map 0:0 -map 0:1 -map 1:0 -y out.mkv

Ha funzionato anche con il file VMW.

ffmpeg -i input.wmv -i input.ass -c:v copy -c:a copy -c:s copy -map 0:0 -map 0:1 -map 1:0 -y out.mkv

vedere la pagina wiki Confronto dei formati dei contenitori


1
HV non è molto rilevante, è sempre positivo vedere più soluzioni di una.
JasonXA

8

ffmpeg supporta il mov_textcodificatore dei sottotitoli che è quasi l'unico supportato in un contenitore MP4 e riproducibile da iTunes, Quicktime, iOS ecc.

La tua riga leggerebbe:

ffmpeg -i input.mp4 -i input.srt -map 0:0 -map 0:1 -map 1:0 -c:s mov_text output.mp4


5

Ho provato a utilizzare MP4Box per questa attività, ma non riusciva a gestire l'M4V con cui avevo a che fare. Ho avuto successo nell'incorporare SRT come sottotitoli morbidi con ffmpeg con la seguente riga di comando:

ffmpeg -i input.m4v -i input.srt -vcodec copy -acodec copy -scodec copy -map 0:0 -map 0:1 -map 1:0 -y output.mkv

Come te, ho dovuto usare un file di output MKV: non sono stato in grado di creare un file M4V.


3

Fornirò una risposta semplice e generale che funziona con qualsiasi numero di audio e sottotitoli srt e rispetta i metadati che possono includere il contenitore mkv . Quindi aggiungerà anche le immagini che la matroska può includere come allegati (anche se non di altri tipi AFAIK) e le convertirà in tracce; non sarai in grado di guardare ma ci saranno (puoi demuxarli). Ah, e se l' MKV ha capitoli anche l' MP4 .

ffmpeg -i <mkv-input> -c copy -map 0 -c:s mov_text <mp4-output>

Come puoi vedere, è tutta una questione di -map 0, che dice a FFmpeg di aggiungere tutte le tracce, inclusi metadati, capitoli, allegati, ecc. Se c'è una "traccia" non riconosciuta ( mkv permette di allegare qualsiasi tipo di file), lo farà finire con un errore.

Puoi creare un batch semplice mkv2mp4.bat, se lo fai di solito, per creare un mp4 con lo stesso nome di mkv . Sarebbe meglio con il controllo degli errori, un nome di output diverso, ecc., Ma ottieni il punto.

@ffmpeg -i %1 -c copy -map 0 -c:s mov_text "%~n1.mp4"

Ora puoi semplicemente correre

mkv2mp4 "Video with subtitles etc.mkv"

E creerà "Video con sottotitoli, ecc. Mp4" con il massimo di informazioni incluse.


-1

Semplice esempio:

videoSource=test.mp4
videoEncoded=test2.mp4
videoSubtitle=test.srt
videoFontSize=24
ffmpeg -i "$videoSource" -vf subtitles="$videoSubtitle":force_style='Fontsize="$videoFontSize"' "$videoEncoded"

Sostituisci solo le variabili Linux


Ti va di elaborare?
RamenChef

-3

Questo è il motivo per cui mkv è un buon contenitore, soprattutto ora che è maturo:

mkvmerge -o output.mkv video.mp4 subtitle.srt

3
Ti interessa commentare perché il tuo approccio risolverebbe il problema dell'OP?
mjuarez
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.