É um pouco complicado, mas aqui está um método de trabalho:
INFILE=input.ts
OUTFILE=output.mkv
ffmpeg \
-i "${INFILE}" \
-f lavfi -i movie="${INFILE}[out+subcc]" \
-map 0 -map 1:s \
-codec:v libx264 \
-codec:a copy \
-codec:s srt \
-metadata:s:s:0 language=eng \
"${OUTFILE}"
Aqui, input.ts
e output.mkv
são seus arquivos de entrada MPEG-TS e de saída Matroska desejados, respectivamente. Generalizar para um roteiro é deixado como um exercício para o leitor.
Interpretando os parâmetros linha a linha:
-i ...
é o arquivo de entrada.
-f lavfi -i ...
nos permite extrair o fluxo de legenda incorporado.
-map 0 -map 1:s
seleciona os fluxos para saída.
-codec:v libx264
diz ao ffmpeg para converter o vídeo para H.264.
-codec:a copy
copia todos os fluxos de áudio para a saída inalterada.
-codec:s srt
diz ao ffmpeg para converter as legendas incorporadas para SRT.
-metadata:s:s:0 language=eng
define o idioma do fluxo de legendas para inglês.
Notas:
- Eu só usei isso com transmissões ATSC pelo ar, incluindo o que eu suponho serem legendas EIA-608. Não tenho idéia se funciona com gravações QAM (cabo), embora eu espere que isso aconteça.
- Você pode ter problemas com nomes de arquivos de entrada contendo determinados caracteres, mesmo se você colocar o nome do arquivo entre aspas.
- Isso copia todos os fluxos de áudio. Se você quiser apenas o primeiro, será preciso mapear explicitamente os fluxos individuais a partir da entrada 0.
- É provável que os fluxos de áudio já tenham um idioma definido. Caso contrário, adicione outra opção -metadata para definir o idioma do fluxo de áudio também.
- Provavelmente você vai querer experimentar a qualidade da codificação de vídeo usando a opção -crf. Se o vídeo de entrada estiver entrelaçado, convém desentrelaçar e dimensionar para 720p adicionando
-filter:v bwdif=0,scale=1280:720
após as linhas-map
.