cortando com resultados ffmpeg em alguns segundos da tela preta, como faço para corrigir isso?

8

Estou usando este comando para cortar um segmento de um vídeo da linha de comando

ffmpeg -i %1 -vcodec copy -acodec copy -ss %2 -t %3 %~n1_cut%~x1

e eu chamo assim

cut.bat video.mp4 001:23:45:678 10

e como esperado, recebo um video_cut.mp4 com 10 segundos do vídeo original, o problema é que alguns segundos do arquivo resultante são de tela preta com áudio, por que isso acontece e como faço para corrigi-lo?

um cara
fonte
% ~ n1_cut% ~ x1 o que essa parte do comando significa?
ScipioAfricanus
@ScipioAfricanus %~n1expande% 1 para um nome de arquivo, ou se apenas um caminho estiver presente (sem barra invertida) - a última pasta nesse caminho e %~x1expande% 1 apenas para a extensão do arquivo - .txt source: superuser.com/questions/ 224416 /…
Shayan

Respostas:

8

A maioria dos vídeos usa codecs que executam compactação temporal; portanto, um ponto de corte especificado pode depender de quadros antes (e depois) desse ponto de corte para ser decodificado corretamente. Portanto, quando você usa o ffmpeg para aparar vídeos e usa o copymodo, o ffmpeg deve incluir todos os quadros antes e depois do segmento aparado, necessários para decodificar o segmento corretamente.

Portanto, você tem duas opções: use o modo de cópia, mas defina uma opção que permita a todos os jogadores reproduzir corretamente esses arquivos.

ffmpeg -ss %2 -t %3 -i %1 -vcodec copy -acodec copy -avoid_negative_ts make_zero %~n1_cut%~x1

(isso provavelmente resultará em saída que começa antes do seu ponto de corte)

ou recodifique os fluxos

ffmpeg -ss %2 -t %3 -i %1 %~n1_cut%~x1
Gyan
fonte
Embora a recodificação seja mais lenta, ela produzirá melhores resultados, porque com a outra solução o vídeo pode demorar mais do que o especificado na -topção.
totymedli
@Gyan O que %faz? Tentei pesquisar em ffmpeg.org/ffmpeg.html, mas não consigo encontrar o uso.
Shayan
Como sua resposta sugeriu, usei tanto o anterior -ssquanto o -tanterior -ie funcionou, antes, apenas o coloquei -ssantes -ie o -tsegui para que não funcionasse.
Shayan
1

https://github.com/mifi/lossless-cut/pull/13

Quando executo ffmpeg com os argumentos nesta ordem -i ... -ss ... -t ..., ele produz um arquivo de vídeo que não tem vídeo por alguns segundos iniciais. (até onde eu entendo isso é porque ele não procura um quadro-chave?)

Se eu alterar a ordem para -ss ... -i ... -t ..., os vídeos cortados resultantes serão reproduzidos corretamente.

Minhas ffmpeg -version

Gerard Wensink
fonte
Eu tentei -ssantes, -imas não funcionou no meu arquivo mp4.
Shayan
Trabalhou para mim, obrigado. Apenas mudou a ordem dos parâmetros. ffmpeg versão 3.2.12-1 ~ deb9u1
shukshin.ivan
Na verdade, este move-se apenas a duração em branco para o final do vídeo
Honghao Zhang