Digamos que eu precise remover tudo de um vídeo, exceto o segundo minuto.
Posso fazer isso, por exemplo, da seguinte maneira:
ffmpeg -copyts -ss <start> -i input.mp4 -to <end> -c:v libx264 -crf 23 -c:a aac -b:a 192k output.mp4
Estou interessado em saber se o -ss
deve ser antes ou depois do -i
.
Eu li todas as respostas e comentários aqui e aqui . Pelo que li lá, parece que nas versões mais antigas do FFmpeg, antes de 2.1, colocar -ss
antes -i
era para um processamento mais rápido, enquanto colocar -ss
depois -i
era para um processamento mais preciso, mas nas versões mais recentes, colocar -ss
antes -i
não é apenas para um processamento mais rápido, mas também para um processamento mais preciso.
Mas por outro lado, as seções “Busca de entrada” e “Busca de saída” aqui não mencionam essa nuance, e depois de lê-las não tenho tanta certeza de que colocar -ss
antes -i
seja “a única solução”.
Alguém poderia explicar isso? (O que eu quero do processamento é precisão. Não me importa quanto tempo vai demorar.)
Os codecs compactados usam quadros-chave (ou intra-quadros) em determinados intervalos de tempo. Somente nos quadros-chave é armazenada uma imagem completa, enquanto os quadros intermediários armazenam apenas a diferença em relação aos quadros-chave vizinhos. Portanto, qualquer decodificação de um stream deve sempre começar em um quadro-chave.
Antes da versão 2.1, a opção do ffmpeg
-ss
não conseguia buscar com precisão quando usada como opção de entrada (ou seja, antes do-i
parâmetro). Em vez disso, ele começaria no quadro-chave mais próximo, portanto não era possível cortar exatamente no horário indicado. Primeiro você precisava decodificar todo o fluxo para poder selecionar o quadro exato no qual cortar e, para isso, precisava usar-ss
como opção de saída (ou seja, após o-i
parâmetro).Hoje em dia, porém, a documentação oficial afirma:
Então, se você busca precisão, hoje em dia não faz sentido usar o
-ss
parâmetro como opção de saída , pois você apenas perde tempo para decodificar algo que irá descartar de qualquer maneira.O principal uso de
-ss
como parâmetro de saída é manter os códigos de tempo originais, o que pode ser útil em alguns casos.Observe que o que foi dito acima implica que você não pode fazer a cópia do fluxo e, ao mesmo tempo, iniciar a codificação em um ponto de busca arbitrário. Por outro lado, se o ponto de partida exato não for tão importante, você poderá usar
-ss
em combinação com a cópia do fluxo e evitar a recodificação.