Desejo dividir um grande vídeo avi em dois vídeos menores consecutivos. Estou usando o ffmpeg.
Uma maneira é executar o ffmpeg duas vezes:
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 output1.avi
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi
Mas de acordo com a página de manual do ffmpeg, posso fazer mais de um arquivo de saída de um arquivo de entrada usando apenas uma linha:
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 output1.avi \
-vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi
Minha pergunta é: a abordagem posterior economiza tempo de computação e memória?
htop
) e nos diz qual é a resposta?-ss
como opção de entrada na segunda divisão pode não ser preciso, portanto, você pode não obter uma divisão limpa. IMO o exemplo da OP é mais correto.Respostas:
O wiki do ffmpeg leva de volta a esta página em referência a "Como dividir o vídeo de forma eficiente". Não estou convencido de que esta página responda a essa pergunta, então fiz como @AlcubierreDrive sugeriu ...
Quais saídas ...
Testei um arquivo SD e HD, depois de algumas corridas e um pouco de matemática.
Arquivo SD = fluxo de transporte de 1,35 GB DVB
arquivo HD = fluxo de transporte de 3,14 GB DVB
Conclusão
O comando único é melhor se você estiver lidando com HD, ele concorda com os comentários do manual sobre o uso de -ss após o arquivo de entrada para fazer uma 'busca lenta'. Os arquivos SD têm uma diferença insignificante.
A versão de dois comandos deve ser mais rápida adicionando outro -ss antes do arquivo de entrada para uma 'busca rápida' seguida por uma busca lenta mais precisa.
fonte
-q:v 0
.Aqui está um script útil, que ajuda você a dividir automaticamente: Um script para dividir vídeos usando ffmpeg
fonte
Na minha experiência, não use o ffmpeg para dividir / juntar. MP4Box, é mais rápido e leve que o ffmpeg. Por favor tente. Por exemplo, se você deseja dividir um arquivo MP4 de 1400 MB em duas partes de 700 MB, você pode usar o seguinte cmdl:
MP4Box -splits 716800 input.mp4
por exemplo, para concatenar dois arquivos que você pode usar:Ou se precisar dividir por tempo, use
-splitx StartTime:EndTime
:MP4Box -add input.mp4 -splitx 0:15 -new split.mp4
fonte
EndTime
que-t
.http://ffmpeg.org/trac/ffmpeg/wiki/Seeking%20with%20FFmpeg também pode ser útil para você. Além disso, o ffmpeg tem um muxer de segmento que pode funcionar.
De qualquer forma, meu palpite é que combiná-los em um comando economizaria tempo.
fonte
Não há grande diferença entre esses dois exemplos que você forneceu. O primeiro exemplo corta o vídeo sequencialmente, em 2 etapas, enquanto o segundo exemplo faz isso ao mesmo tempo (usando threads). Nenhuma aceleração particular será notada. Você pode ler mais sobre como criar várias saídas com FFmpeg
Além disso, o que você pode usar (no FFmpeg recente) é o muxer segmentador de fluxo que pode:
fonte
Aqui está um arquivo bat simples do Windows para dividir o arquivo recebido em 50 partes. Cada parte tem duração de 1 minuto. Desculpe por esse script idiota. Espero que seja melhor ter um script do Windows idiota em vez de não tê-lo. Talvez ajude alguém. (Com base em "arquivo bat para loop" deste site.)
fonte
ffmpeg
comandos consecutivos ) reescrito como um loop. Isso não responde à pergunta se essa abordagem ou um único comando "economizará tempo de computação e memória".Não testei, mas parece promissor:
Segmentador de fluxo básico
Obviamente, está dividindo o AVI em segmentos do mesmo tamanho, o que implica que esses pedaços não perdem qualidade ou aumentam a memória ou devem ser recalculados.
Ele também usa a cópia do codec - isso significa que pode lidar com fluxos muito grandes? Porque este é meu problema, eu quero quebrar meu avi para que eu possa usar um filtro para me livrar da distorção. Mas um avi inteiro funciona por horas.
fonte
Esta é uma maneira perfeita de dividir o vídeo. Já fiz isso anteriormente e está funcionando bem para mim.
ffmpeg -i C:\xampp\htdocs\videoCutting\movie.mp4 -ss 00:00:00 -t 00:00:05 -async 1 C:\xampp\htdocs\videoCutting\SampleVideoNew.mp4
(Para cmd).shell_exec('ffmpeg -i C:\xampp\htdocs\videoCutting\movie.mp4 -ss 00:00:00 -t 00:00:05 -async 1 C:\xampp\htdocs\videoCutting\SampleVideoNew.mp4')
(para php).Siga isso e tenho certeza de que funcionará perfeitamente.
fonte
-i
seguido por-ss
e-t
. A questão é sobre como extrair com eficiência vários segmentos do mesmo arquivo de entrada, embora você esteja extraindo apenas um único segmento. Não vejo como isso responde à pergunta.uma maneira simples é usar a opção trim com API baseada em url publitio .
Depois de enviar seu vídeo, basta definir o deslocamento inicial e o deslocamento final no url (so_2, eo_2) assim:
isso criará novos vídeos instantaneamente a partir do segundo segundo e com 2 segundos de duração. você pode dividir os vídeos assim como quiser.
fonte
ffmpeg
. A menos que você tenha uma conexão de internet muito, muito rápida, acho que ter que carregar o vídeo inteiro para um serviço em nuvem e depois baixar os resultados aumentará significativamente o tempo de processamento. Mesmo assim, isso ainda não responde a pergunta de qual abordagem comffmpeg
é mais eficiente.