Geralmente, é necessário que a comunidade de desenvolvedores de código aberto ou ativo publique grandes segmentos de vídeo online. (Vídeos de reunião, acampamentos, palestras sobre tecnologia ...) Como sou desenvolvedor e não cinegrafista, não tenho nenhum desejo de fazer um arranhão extra em uma conta premium do Vimeo. Como, então, pego um vídeo de conversa técnica MPEG de 12,5 GB (1:20:00) e o divido em segmentos 00:10:00 para facilitar o upload para sites de compartilhamento de vídeo?
ffmpeg
video-editing
Gabriel
fonte
fonte
Respostas:
Agrupar isso em um script para fazer isso em um loop não seria difícil.
Lembre-se de que, se você tentar calcular o número de iterações com base na duração da saída de uma
ffprobe
chamada, isso é estimado a partir da taxa de bits média no início do clipe e do tamanho do arquivo do clipe, a menos que você dê o-count_frames
argumento, o que diminui consideravelmente sua operação .Outra coisa a ter em atenção é que a posição da
-ss
opção na linha de comando é importante . Onde eu tenho agora é lento, mas preciso. A primeira versão desta resposta deu a alternativa rápida, mas imprecisa . O artigo vinculado também descreve uma alternativa mais rápida, mas ainda precisa, que você paga com um pouco de complexidade.Tudo isso de lado, eu não acho que você realmente queira cortar exatamente 10 minutos para cada clipe. Isso colocará cortes bem no meio das frases, até das palavras. Eu acho que você deveria usar um editor de vídeo ou player para encontrar pontos de corte naturais com apenas 10 minutos de intervalo.
Supondo que seu arquivo esteja em um formato que o YouTube possa aceitar diretamente, você não precisará recodificar para obter segmentos. Apenas passe as compensações naturais do ponto de corte para
ffmpeg
, dizendo-lhe para passar o A / V codificado intocado usando o codec "copy":O
-c copy
argumento diz para copiar todos os fluxos de entrada (áudio, vídeo e potencialmente outros, como legendas) na saída como estão. Para programas simples de A / V, é equivalente aos sinalizadores mais detalhados-c:v copy -c:a copy
ou sinalizadores de estilo antigo-vcodec copy -acodec copy
. Você usaria o estilo mais detalhado quando desejar copiar apenas um dos fluxos, mas recodifique o outro. Por exemplo, há muitos anos, havia uma prática comum com os arquivos do QuickTime para compactar o vídeo com o vídeo H.264, mas deixar o áudio como PCM descompactado ; se você leu hoje um arquivo como esse, pode modernizá-lo-c:v copy -c:a aac
para reprocessar apenas o fluxo de áudio, deixando o vídeo intocado.O ponto inicial de todos os comandos acima após o primeiro é o ponto inicial do comando anterior mais a duração do comando anterior.
fonte
ffmpeg
necessárias para manter a sincronização entre os fluxos de áudio e vídeo podem não estar presentes no arquivo de origem. Se isso estiver acontecendo com você, existem métodos mais complicados de dividir que evitam o problema.Aqui está a solução de uma linha :
Observe que isso não fornece divisões precisas, mas deve atender às suas necessidades. Em vez disso, ele será cortado no primeiro quadro após o tempo especificado depois
segment_time
, no código acima, após a marca de 20 minutos.Se você achar que apenas o primeiro pedaço é reproduzível, tente adicionar
-reset_timestamps 1
conforme mencionado nos comentários.fonte
-reset_timestamps 1
corrige o problema para mimEnfrentou o mesmo problema anteriormente e montou um script Python simples para fazer exatamente isso (usando FFMpeg). Disponível aqui: https://github.com/c0decracker/video-splitter e colado abaixo:
fonte
Se você deseja criar realmente os mesmos pedaços, deve forçar o ffmpeg a criar o i-frame no primeiro quadro de todos os pedaços, para que você possa usar este comando para criar pedaços de 0,5 segundo.
fonte
Uma maneira alternativa mais legível seria
Aqui está a fonte e a lista dos comandos FFmpeg usados com frequência.
fonte
Observe a pontuação exata do formato alternativo
-ss mm:ss.xxx
. Eu lutei por horas tentando usar o intuitivo, mas errado,mm:ss:xx
sem sucesso.Referências aqui e aqui .
fonte
fonte
Basta usar o que está embutido no ffmpeg para fazer exatamente isso.
Isso o dividirá em mandris de aproximadamente 2 segundos, divididos nos quadros-chave relevantes e resultará nos arquivos cam_out_h2640001.mp4, cam_out_h2640002.mp4, etc.
fonte