Eu só quero fazer um loop em um vídeo mp4 com ffmpeg e manter as configurações e o codec atuais.
Por exemplo, se input.mp4 tem 0:10 de comprimento e eu gostaria de fazer um loop 4 vezes para que output.mp4 tenha 0:40, como eu poderia alterar a seguinte linha de comando para fazer isso?
ffmpeg -i input.mp4 -c copy output.mp4
Eu tentei...
ffmpeg -loop 4 -i input.mp4 -c copy output.mp4
... mas recebo o erro "Loop de opção não encontrado".
Respostas:
Concat desmuxer
Isso permite que você faça um loop de uma entrada sem precisar recodificar.
Faça um arquivo de texto. Conteúdo de um arquivo de texto de exemplo para repetir 4 vezes.
Em seguida, execute
ffmpeg
:Para usuários do Linux
Este exemplo é o mesmo que acima, mas você não precisa fazer manualmente
list.txt
:Com os shells modernos mais usados, você pode até evitar a criação do
list.txt
arquivo completamente. Por exemplo, com o bash:Veja também:
filtro de loop
Exemplo usando o filtro de loop para fazer loop 4 vezes, cada loop é de 75 quadros, cada loop ignora os primeiros 25 quadros da entrada:
loop=3:75:25
loop=3
fará um loop 4 vezes.-1
.ffmpeg -h filter=loop
.filtro de filme
O filtro de filme tem uma opção de loop. Veja a resposta abaixo de Monah Tuk. A filtragem requer recodificação. Para áudio, use o filtro de filmes.
-stream_loop
opçãoVeja a resposta abaixo por Thingy e a resposta por Gyan.
Observe que esta opção era incorreta (consulte os relatórios de erros # 5719 , # 6121 e # 7043 ), portanto, pode não funcionar para construções antigas (qualquer coisa anterior a 2018/06/27, incluindo o ramo de lançamento do FFmpeg 4.0.x). Para usuários de compilações antigas, como mencionado por mulvya no ticket # 6121, uma solução alternativa é primeiro redimensionar para MKV ou TS e depois usar
-stream_loop
no próximo comando.-loop
opçãoA
-loop
opção é específica para o desmuxador de arquivo de imagem e o muxer de gif , portanto, não pode ser usado para arquivos de vídeo típicos, mas pode ser usado para fazer loop infinito de uma série de imagens de entrada. Este exemplo repetirá repetidamente, mas-t 30
limitará a duração da saída a 30 segundos:Ou para repetir uma saída GIF:
fonte
> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
ffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
-stream_loop
secção está a apontar para o mesmo bilhete como o primeiro ...Pelo menos no FFmpeg 2.8.x (mas o oldie também deve funcionar), você pode usar
lavfi
como formato de entrada e gráfico de filtro complexo usandomovie
esetpts
filtros como argumento para a-i
opção.Próximo comando fazendo este trabalho para você:
Zero
loop=
argumentos significa loop infinito. Valores maiores que conjuntos de zero repetem contagens.setpts
filtros necessários para o ajuste do PTS para repetições posteriores e posteriores; caso contrário, a maioria dos muxers de saída falhará com o aumento do PTS não monotônico: o loop não recalca o PTS.Observe que o uso de filtros assumindo que ignorar quadros sem decodificação / codificação é impossível: por design, os filtros lidam apenas com quadros decodificados.
No FFmpeg 2.8.2, nova opção de entrada foi
-stream_loop
introduzida. Primeiro, parece que funciona mais simples e permite copiar conteúdo sem transcodificar:Mas ele não recalcula o PTS e o arquivo de saída está errado. Se você adicionar um filtro para corrigir o PTS (consulte
setpts
), deverá remover-c copy
também. Somente filtros de fluxo de bits podem lidar com pacotes codificados, mas não há nenhum filtro de fluxo de bits para corrigir o PTS (consulte: https://ffmpeg.org/ffmpeg-bitstream-filters.html )Em qualquer caso, o ffmpeg na segunda passagem falha com erro:
Solução conhecida para mim : use o contêiner para o arquivo de entrada sem limites de PTS (contêiner de streaming). Um deles, me conhece, é o MPEG-TS. Então, você pode simplesmente converter seu arquivo MP4 para o MPEG-TS:
E use o próximo comando para compor o arquivo infinito:
(filtros de fluxo de bits devem ser usados apenas se necessário, nas minhas amostras é necessário)
FFmpeg> = 2.8.2 é necessário neste caso.
fonte
-c copy
. Resposta corrigida.Com o ffmpeg 2.8.4, o comando a seguir cria o output.mp4 que é uma cópia repetida do input.mp4 até o processo ffmpeg ser parado:
Este comando não será finalizado por si só, e o arquivo de saída crescerá infinitamente.
fonte
P: "... como eu poderia alterar a seguinte linha de comando para fazer isso? Ffmpeg -i input.mp4 -c copy output.mp4"?
R: O método simples que evita problemas de quais comandos funcionam com qual versão é a 'solução trivial':
ffmpeg -i input.mp4 -i input.mp4 -i input.mp4 -i input.mp4 -c copy output.mp4
Veja também: https://trac.ffmpeg.org/wiki/Concatenate para muitos exemplos.
fonte