Evite ffmpeg re codificar usando filtro complexo

0

Eu tenho uma lista de arquivos ts que serão concatenados para serem reduzidos posteriormente e codificados em mp4.

Tudo isso está funcionando bem ... no entanto, o problema que tenho agora é que o arquivo é recodificado ... e isso não é o que eu quero, já que o ts já é h264 e mp3, então é só empacotá-lo no mp4 funciona ok. Na verdade, isso funciona:

ffmpeg -i file.ts -c copy file.mp4

Mas isso não é:

ffmpeg -i videohls-1935m-index.ts -y -filter_complex \
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[0:a]atrim=0:10,asetpts=PTS-STARTPTS[a0]; \
[0:v]trim=30:90,setpts=PTS-STARTPTS[v1]; \
[0:a]atrim=30:90,asetpts=PTS-STARTPTS[a1]; \
[0:v]trim=100:200,setpts=PTS-STARTPTS[v2]; \
[0:a]atrim=100:200,asetpts=PTS-STARTPTS[a2]; \
[0:v]trim=250:350,setpts=PTS-STARTPTS[v3]; \
[0:a]atrim=250:350,asetpts=PTS-STARTPTS[a3]; \
[v0][a0][v1][a1][v2][a2][v3][a3]concat=n=4:v=1:a=1[out] \
-map [out] \
-c copy \
videohls-1935m-index.mp4

Obviamente, ele não "copia" os codecs porque a saída vem de uma saída virtual mapeada para [out] (ou algo assim ... honestamente, não sei exatamente como funciona, mas sei que é assim, ele não tem um "codec" por palavra ... então não pode copiá-lo.

Isso significa que tenho 2 problemas:

  1. O arquivo é menor, o que não é ruim, mas ...
  2. O arquivo é re-codificado ... então a qualidade também é menor.

Como posso evitar isso para manter a qualidade do vídeo?

    
por AbrahamSustaita 26.02.2015 / 17:24

1 resposta

2

A filtragem requer recodificação , mas você tem outra opção:

1. Faça cada segmento

O que você pode fazer é copiar o fluxo para cada segmento usando -ss e -t ou -to com -c copy .

  • Exemplo para pular 10 segundos e fazer 20 segundos de saída:

    ffmpeg -ss 10 -i input -t 20 -c copy output
    
  • Exemplo para pular os primeiros 10 segundos e parar na duração 30, resultando em uma saída de 20 segundos:

    ffmpeg -i input -ss 10 -to 30 -c copy output
    

2. Concatenar

  1. Primeiro, leia a documentação do demolidor de concatilidades .

  2. Em seguida, crie um arquivo de lista:

    $ cat inputs.txt
    file '/path/to/segment00.mp4'
    file '/path/to/segment01.mp4'
    file '/path/to/segment02.mp4'
    file '/path/to/segment03.mp4'
    
  3. Finalmente, você pode concatenar:

    ffmpeg -f concat -i inputs.txt -c copy output
    

Veja também

por 26.02.2015 / 19:48