Estou usando o ffmpeg para cortar uma seção de um arquivo grande como este:
ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv
A -ss
peça funciona bem, mas -t
é ignorada. Ele remove corretamente os segundos iniciais especificados especificados com, -ss
mas continua indo para o final da entrada com a cópia.
Existe uma maneira de usar o ffmpeg para cortar o final de um vídeo sem recodificá-lo?
Respostas:
Você pode usar a
-ss
opção para especificar um registro de data e hora de início e a-t
opção para especificar a duração da codificação. Os registros de data e hora precisam estar noHH:MM:SS.xxx
formato ou em segundos (s.msec
).O seguinte cortaria os primeiros 30 segundos e, em seguida, cortaria tudo o que fosse 10 segundos depois:
Observe que
-t
é uma opção de saída e sempre precisa ser especificada depois-i
.Algumas dicas:
-ss
depois-i
, obterá uma busca mais precisa às custas de uma execução mais lenta. Veja também: Procurando com o FFmpegVocê pode usar, em
-to
vez de,-t
para especificar o carimbo de data e hora no qual deseja cortar. Então, em vez de-i <input> -ss 30 -t 10
você também poderia fazer-i <input> -ss 30 -to 40
para conseguir a mesma coisa.Se o seu ffmpeg não suportar
-c
, ou-to
provavelmente está desatualizado. Compile você mesmo uma nova versão ou faça o download de uma versão estática da página inicial. Realmente não é complicado.fonte
ffmpeg -i input.wmv -c copy -t 35 output.wmv
frame= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s
-c copy
removeu a tela preta inicial. Veja sua resposta para obter detalhes.Como outras pessoas mencionaram, colocar
-ss
antes (muito mais rápido) ou depois (mais preciso) o-i
faz uma grande diferença. A seção "Busca rápida e precisa" na página de busca do ffmpeg mostra como obter os dois, e eu o usei, e isso faz uma grande diferença. Basicamente, você coloca-ss
antes e depois do tempo-i
, mas deixe um tempo suficiente antes de começar a cortar para ter outro quadro-chave. Exemplo: se você quiser criar um clipe de 1 minuto, de 9min0seg a 10min 0seg no Video.mp4, poderá fazê-lo com rapidez e precisão usando:O primeiro
-ss
procura rapidamente (aproximadamente) 8min0seg, e o segundo-ss
procura com precisão 9min0seg, e-t 00:01:00
remove um clipe de 1min0seg.Observe também este ponto importante dessa página: "Se você usar
-ss
com-c:v copy
, o fluxo de bits resultante pode acabar sendo instável, não reproduzível ou fora de sincronia com o fluxo de áudio, pois o ffmpeg é forçado a usar / dividir apenas nos quadros i. "Isso significa que você precisa recodificar o vídeo, mesmo se você quiser apenas copiá-lo ou arriscar que ele fique instável e fora de sincronia. Você pode tentar
-c copy
primeiro, mas se o vídeo for ruim, será necessário refazê-lo.fonte
-c:a copy
esse modo de busca.Descobri que,
-ss
combinado com,-c copy
resultou em um corte de meio segundo no início.Para evitar isso, você deve remover o
-c copy
(que reconhecidamente fará uma transcodificação).fonte
-c copy
corrigida.MANUALMENTE
Abra o arquivo em um media player que avance quadro a quadro e reproduza um arquivo AVISynth com dados como:
Em seguida, corte com o formato de hora EXATO:
e
Agora crie um arquivo txt com os arquivos de vídeo com conteúdos como:
Execute o ffmpeg:
fonte
Para mim, a
-t
opção não funcionou, mas-vframes
funcionou. Eu prefiro usar#frames
, já que prefiro cortar em I-Frames e descobri o GOP para vídeo usandoffprobe
.A linha de comando que funcionou para mim é:
A propósito, colocar
-ss
na frente-i
faz uma grande diferença no tempo de execução.fonte
-vframes
(ou-frames:v
) deve vir depois,-i
porque é uma opção de saída.Assim como no user225366, a opção -t não funciona em vídeos curtos, mas em vídeos mais longos. Para vídeos curtos, parece que -frames: v é melhor. Isto é o que funcionou para mim.
É necessário adicionar uma cópia do codec se o vídeo tiver áudio, como mostram as outras respostas.
fonte
Não vejo muitos mencionarem isso (não sou especialista, talvez haja um problema), mas se o seu arquivo tiver outros fluxos, como legendas e outros metadados, como capítulos e assim por diante, é possível cortar / aparar e manter todos os fluxos com o seguinte comando
Com
-map 0
você tomar todos os fluxos no arquivo e com-c copy
que você copiar todos eles como eles são.Se você
-to
omitir o início via-ss
, o vídeo de entrada será cortado do início para o segundo 60.Brincar
map
também é útil se você deseja que apenas os fluxos específicos sejam mantidos no corte (talvez você não precise de todas as fontes de áudio no arquivo ou apenas de algumas legendas).Eu uso isso quando preciso dividir arquivos MKV grandes que não podem ser armazenados no armazenamento FAT32.
fonte