Estou tentando excluir algumas seções de um vídeo usando o FFmpeg.
Por exemplo, imagine se você gravou um programa na televisão e quisesse cortar os comerciais. Isso é simples com um editor de vídeo da GUI; basta marcar o início e o final de cada clipe a ser removido e selecionar excluir. Estou tentando fazer o mesmo na linha de comando com o FFmpeg.
Eu sei como cortar um único segmento para um novo vídeo como este:
ffmpeg -i input.avi -ss 00:00:20 -t 00:00:05 -map 0 -codec copy output.avi
Isso corta um clipe de cinco segundos e o salva como um novo arquivo de vídeo, mas como posso fazer o oposto e salvar o vídeo inteiro sem o clipe especificado, e como posso especificar vários clipes a serem removidos?
Por exemplo, se meu vídeo pudesse ser representado pelo ABCDEFG, gostaria de criar um novo que consistisse em ACDFG.
fonte
Respostas:
Bem, você ainda pode usar o
trim
filtro para isso. Aqui está um exemplo, vamos assumir que você deseja cortar segmentos de 30 a 40 segundos (10 segundos) e 50 a 80 segundos (30 segundos):O que eu fiz aqui? Cortei os primeiros 30 segundos, 40-50 segundos e 80 segundos até o fim e depois os combinei em fluxo
out1
com oconcat
filtro.Sobre ajustes: precisamos disso porque o ajuste não modifica o tempo de exibição da imagem e, quando cortamos o contador do decodificador de 10 segundos, não vemos quadros por esses 10 segundos.
Se você quiser ter áudio também, precisará fazer o mesmo para fluxos de áudio. Portanto, o comando deve ser:
fonte
Eu nunca consigo fazer a solução do ptQa funcionar, principalmente porque nunca consigo descobrir o que significam os erros dos filtros ou como corrigi-los. Minha solução parece um pouco mais complicada porque pode deixar para trás uma bagunça, mas se você a jogar em um script, a limpeza poderá ser automatizada. Também gosto dessa abordagem, porque se algo der errado na etapa 4, você terminará as etapas 1 a 3, para que a recuperação dos erros seja um pouco mais eficiente.
A estratégia básica é usar
-t
e-ss
obter vídeos de cada segmento desejado e juntar todas as partes da sua versão final.Digamos que você tenha 6 segmentos ABCDEF a cada 5 segundos e deseje A (0-5 segundos), C (10-15 segundos) e E (20-25 segundos):
ou
Isso fará com que os arquivos a.tvshow, c.tvshow e e.tvshow. Ele
-t
diz quanto tempo cada clipe tem; portanto, se c tiver 30 segundos, você poderá passar 30 ou 0:00:30. A-ss
opção diz até onde pular no vídeo de origem, por isso é sempre relativo ao início do arquivo.Então, quando você tem um monte de arquivos de vídeo, eu faço um arquivo
ace-files.txt
como este:Observe o "arquivo" no início e o nome do arquivo de escape depois disso.
Então o comando:
Isso concatena todos os arquivos
abe-files.txt
juntos, copiando seus codecs de áudio e vídeo e cria um arquivoace.tvshow
que deve ser apenas as seções a, ce. Então lembre-se de excluirace-files.txt
,a.tvshow
,c.tvshow
ee.tvshow
.Isenção de responsabilidade : não tenho idéia de quão (in) eficiente isso é comparado a outras abordagens em termos de,
ffmpeg
mas para meus propósitos funciona melhor. Espero que ajude alguém.fonte
ace-files.txt
no seu exemplo) com:ffmpeg -f concat -i <(printf "file '%s'\n" $(pwd)/prefix_*.tvshow) -c copy output.tvshow
Fiz um roteiro para acelerar a edição da TV gravada. O script solicita os horários de início e fim dos segmentos que você deseja manter e os divide em arquivos. Oferece opções, você pode:
Vídeo dele em ação: aqui
Diz-me o que pensas.
fonte
safe=0
, ieffmpeg -f concat -safe 0 -i ...
Veja ffmpeg.org/ffmpeg-all.html#Options-36Embora a resposta fornecida pelo ptQa pareça funcionar, desenvolvi uma outra solução que provou funcionar bem.
Basicamente, o que faço é cortar um vídeo para cada parte do vídeo original que eu quero incluir no meu resultado. Mais tarde, concatená-los com o Concat Demuxer explicado aqui .
A solução é a mesma que eu tentei primeiro e apresentei problemas de sincronização. O que eu adicionei é o comando -avoid_negative_ts 1 ao gerar os diferentes vídeos. Com esta solução, os problemas de sincronização desaparecem.
fonte
Para aqueles que têm problemas para seguir a abordagem do ptQa, há uma maneira um pouco mais simplificada de fazer isso. Em vez de concatinar cada etapa do caminho, faça tudo no final.
Para cada entrada, defina um par A / V:
Defina quantos pares você precisar e concorde todos eles em uma única passagem, em que n = contagem total de entradas.
Isso pode ser facilmente construído em um loop.
Um comando completo que usa 2 entradas pode ser assim:
fonte