Use ffmpeg para adicionar legendas em texto [fechado]


121

Estou tentando adicionar legendas de texto a um contêiner .mp4 usando ffmpeg:

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

Quando estou tentando executar esta linha, ocorre um erro:

A quantidade de mapas de fluxo deve corresponder ao número de fluxos de saída.

Se eu tentar mudar o mp4 para mkv (embora o mp4 suporte legendas de texto), assim:

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

Mapeia corretamente os fluxos, mas fornece um erro:

Codificador (codec id 94210) não encontrado para o fluxo de saída # 0.2

Quando eu lanço

ffmpeg -codecs

Percebo que o codec srt é suportado como decodificador e codificador, no entanto, não tenho certeza do que é usado para a codificação de subs mp4 e mkv e se preciso ativá-lo ou compilar separadamente.

Respostas:


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

-vf subtitles=infile.srt não vai funcionar com -c copy


A ordem de -c copy -c:s mov_texté importante. Você está dizendo ao FFmpeg:

  1. Vídeo: cópia, Áudio: cópia, Legenda: cópia
  2. Legenda: mov_text

Se você os reverter, estará dizendo ao FFmpeg:

  1. Legenda: mov_text
  2. Vídeo: cópia, Áudio: cópia, Legenda: cópia

Como alternativa, você pode simplesmente usar -c:v copy -c:a copy -c:s mov_textem qualquer ordem.


13
Esta legenda método add para o arquivo como um dos stream, portanto, o suporte necessidade jogador para mostrar subtítulo (como o VLC)
BollMose

1
Isso significa que a legenda está disponível, mas não é gravada no vídeo? Posso mostrar se eu quero sob demanda?
Sun

3
Sim @ sunk818 é o que isso significa. Isso adiciona a legenda como uma faixa que pode ser ativada ou desativada desde que o player a suporte. Hyde e Paul ffmpeg também podem adicionar as legendas no próprio vídeo, e nesses casos você controlaria coisas como fonte e posicionamento.
Boushley

1
Os arquivos .srt devem ser importados com -c:s copynão -c:s mov_text.
GetFree

82

NOTA: Esta solução "grava as legendas" no vídeo, para que todos os visualizadores do vídeo sejam forçados a vê-las.

Use a libassbiblioteca (verifique se a instalação do ffmpeg tem a biblioteca na configuração --enable-libass).

Primeiro converta as legendas para o .assformato:

ffmpeg -i subtitles.srt subtitles.ass

Em seguida, adicione-os usando um filtro de vídeo:

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

40
Isso irá "gravá-los" no vídeo, o que significa que você não pode desativá-los no player. Isso é diferente de adicioná-los como um fluxo de legendas que pode ser lido pelo player e exibido se o espectador quiser.
Stib

1
Muito obrigado por esta solução. Existe alguma maneira de especificar o tamanho dos caracteres?
user1319182

1
Dê uma olhada nesta resposta: stackoverflow.com/questions/21363334/… . Provavelmente, você deseja definir a fonte no próprio arquivo de legenda; caso contrário, usando o filtro de legendas, você pode forçar o estilo para definir a Fonte: ffmpeg.org/ffmpeg-filters.html#subtitles-1
HdN8:

Isso será útil ao adicionar legendas para vídeos em algum lugar como o Instagram. Em algum lugar como Instagram espectador que o usuário não tem capacidade de ouvir o som ou vídeo é em outro idioma, então o usuário pode ler o subtítulo vez
ϻαϻɾΣɀО-MaMrEzO

1
Instale libassextensões se ausentes nos sistemas Debian com o `apt update && apt install libass-dev".
Sopalajo de Arrierez

53

Você está tentando misturar legendas como um fluxo de legendas. É fácil, mas é usada uma sintaxe diferente para MP4 (ou M4V) e MKV. Nos dois casos, você deve especificar o codec de vídeo e áudio ou apenas copiar o fluxo, se quiser adicionar legendas.

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
É possível adicionar mais de uma legenda? Esse softsub será reconhecido como idioma desconhecido?
Patrick

1
Sim, ele é. Acabei de testá-lo para MKV:
dotokija

7
Primeiro adicione outra entrada: -i input2.srt. Segundo, mapeie como segundo fluxo: -map 2: 0. Por fim, selecione o codificador para o segundo fluxo de legendas (o mesmo que o primeiro): -c: s srt. O exemplo 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: uma cópia \ -c: s srt -c: s srt output.mkv
dotokija

8
E para adicionar metadados do idioma (inserir antes do arquivo de saída) "-metadata: s: s: 0 language = eng"
Patrick

por que as legendas do arquivo original são excluídas quando eu "embrulho" arquivos mkv como arquivos mp4 (ffmpeg -i film.mkv -vcodec copy -acodec copy film.mp4) ?? o mkv original tem legendas, mas a saída no formato mp4 não. o que está acontecendo? o que não estou fazendo corretamente?
Oldboy

9

O contêiner MKV suporta codecs de vídeo e áudio Praticamente qualquer coisa e também suporta legendas e menus de DVD. Assim, você pode simplesmente copiar codecs de entrada de vídeo para saída de vídeo com contêiner MKV com legendas. Primeiro, você deve converter o formato de legenda SRT para ASS

ffmpeg -i input.srt input.ass

e incorporar legendas do ASS ao vídeo

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

Também trabalhou com arquivo 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

veja a página wiki Comparação de formatos de contêiner


1
Como o HV não é realmente relevante, é sempre bem-vindo ver mais soluções do que uma.
JasonXA

8

O ffmpeg suporta o mov_textcodificador de legenda, que é praticamente o único suportado em um contêiner MP4 e reproduzível pelo iTunes, Quicktime, iOS etc.

Sua linha seria:

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


5

Tentei usar o MP4Box para esta tarefa, mas ele não suportava o M4V com o qual estava lidando. Consegui incorporar o SRT como legendas suaves com ffmpeg com a seguinte linha de 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

Como você, eu tive que usar um arquivo de saída MKV - não consegui criar um arquivo M4V.


3

Fornecerei uma resposta simples e geral que funcione com qualquer número de áudios e legendas srt e respeite os metadados que podem incluir o contêiner mkv . Assim, ele adiciona as imagens que a matroska pode incluir como anexos (embora não outros tipos AFAIK) e as converte em faixas; você não poderá assistir, mas eles estarão lá (você pode desmembrá-los). Ah, e se o mkv tiver capítulos o mp4 também.

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

Como você pode ver, é tudo sobre o -map 0que diz ao FFmpeg para adicionar todas as faixas, incluindo metadados, capítulos, anexos etc. Se houver uma "faixa" não reconhecida (o mkv permite anexar qualquer tipo de arquivo), ele será termine com um erro.

Você pode criar um lote simples mkv2mp4.bat, se você costuma fazer isso, para criar um mp4 com o mesmo nome que o mkv . Seria melhor com controle de erro, um nome de saída diferente, etc., mas você entendeu.

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

Agora você pode simplesmente executar

mkv2mp4 "Video with subtitles etc.mkv"

E criará "Vídeo com legendas etc.mp4" com o máximo de informações incluídas.


-1

Exemplo simples:

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

Substitua apenas as variáveis ​​linux


Cuidado ao elaborar?
RamenChef

-3

Esta é a razão pela qual o mkv é um contêiner tão bom, especialmente agora que está maduro:

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

3
Gostaria de comentar por que sua abordagem solucionaria o problema do OP?
Mjarez
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.