Re-codificação de vídeo com ffmpeg incluindo todas as legendas, mas não todo o áudio

1

Estou tentando re-codificar fluxos de vídeo de um arquivo Matroska para economizar espaço, mantendo todas as legendas como estão, usando o ffmpeg. Eu quero escrever um comando genérico que funciona sem eu ter que especificar números exatos de fluxo. Agora não consigo descobrir como deixar o ffmpeg escolher seu fluxo de vídeo padrão e o fluxo de áudio padrão e, em seguida, todas as legendas.

O arquivo de entrada atual com o qual estou trabalhando tem esses fluxos, mas outros arquivos terão fluxos diferentes.

    [lavf] stream 0: video (mpeg2video), -vid 0
    [lavf] stream 1: audio (ac3), -aid 0, -alang eng, Surround 5.1
    [lavf] stream 2: audio (ac3), -aid 1, -alang fre, Surround 5.1
    [lavf] stream 3: audio (ac3), -aid 2, -alang ita, Surround 5.1
    [lavf] stream 4: audio (ac3), -aid 3, -alang spa, Surround 5.1
    [lavf] stream 5: audio (ac3), -aid 4, -alang eng, Stereo
    [lavf] stream 6: subtitle (dvdsub), -sid 0, -slang eng
    [lavf] stream 7: subtitle (dvdsub), -sid 1, -slang fre
    [lavf] stream 8: subtitle (dvdsub), -sid 2, -slang ita
    [lavf] stream 9: subtitle (dvdsub), -sid 3, -slang spa
    [lavf] stream 10: subtitle (dvdsub), -sid 4, -slang ara
    [lavf] stream 11: subtitle (dvdsub), -sid 5, -slang dan
    [lavf] stream 12: subtitle (dvdsub), -sid 6, -slang dut
    [lavf] stream 13: subtitle (dvdsub), -sid 7, -slang fin
    [lavf] stream 14: subtitle (dvdsub), -sid 8, -slang ice
    [lavf] stream 15: subtitle (dvdsub), -sid 9, -slang nor
    [lavf] stream 16: subtitle (dvdsub), -sid 10, -slang por
    [lavf] stream 17: subtitle (dvdsub), -sid 11, -slang swe
    [lavf] stream 18: subtitle (dvdsub), -sid 12, -slang fre
    [lavf] stream 19: subtitle (dvdsub), -sid 13, -slang ita
    [lavf] stream 20: subtitle (dvdsub), -sid 14, -slang spa

Comandos que tentei:

ffmpeg -i IN.mkv -c:v libx264 -threads 4 -speed 1 -f matroska OUT.mkv

Resultado: um fluxo de vídeo, um fluxo de áudio, sem streams de legenda .

ffmpeg -i IN.mkv -c:v libx264 -threads 4 -speed 1 -f matroska -c:s copy OUT.mkv

Resultado: um fluxo de vídeo, um fluxo de áudio, um fluxo de legendas .

ffmpeg -i IN.mkv -c:v libx264 -threads 4 -speed 1 -f matroska -map 0 OUT.mkv

Resultado: Todo o vídeo , todo o áudio , todas as legendas.

ffmpeg -i IN.mkv -c:v libx264 -threads 4 -speed 1 -f matroska -c:s copy -map 0:s OUT.mkv

Resultado: Nenhum vídeo , sem áudio , todas as legendas.

Tanto quanto eu posso dizer no manual, -c:s copy deve copiar todos os fluxos, não apenas o padrão, mas não. Talvez seja um bug?

Para esclarecer, o que eu estou procurando é o resultado: um v ideo, um udio e todos os ubtitles.

    
por nilli 27.11.2015 / 16:39

1 resposta

7

O comportamento padrão seleção de fluxo seleciona apenas um fluxo por tipo de fluxo , Portanto, entradas com múltiplos fluxos de áudio criarão uma saída com um fluxo de áudio. Para desativar esse comportamento e escolher manualmente os fluxos desejados, use a -map option .

Estes exemplos usam -c copy para cópia de fluxo (re-mux) da entrada para a saída . Nenhuma recodificação ocorre.

Stream copy all streams

ffmpeg -i input -map 0 -c copy output

primeiro fluxo de vídeo, segundo fluxo de áudio, todas as legendas

ffmpeg -i input -map 0:v:0 -map 0:a:1 -map 0:s -c copy output

terceiro stream de vídeo, todos os fluxos de áudio, sem legendas

Este exemplo usa mapeamento negativo para excluir as legendas.

ffmpeg -i input -map 0:v:2 -map 0:a -map -0:s -c copy output

Escolhendo fluxos de várias entradas

Todo o vídeo da entrada 0, todo o áudio da entrada 1:

ffmpeg -i input0 -i input1 -map 0:v -map 1:a -c copy output
    
por 05.12.2015 / 01:45