ffmpeg pausa vídeo a cada 10 segundos por 3 segundos

0

Existe uma maneira de usar o ffmpeg para interromper um vídeo por 3 segundos a cada 10 segundos?

Por exemplo, eu uso um vídeo de 30 segundos, o vídeo deve parar às 0:00, 0:10, 0:20 e 0:30 por 3 segundos. A duração do vídeo de saída é de 0:42 segundos.

Obrigado!

    
por Franky 29.04.2016 / 19:43

2 respostas

3

Editar : método diferente adicionado, responsável pelo áudio e também pelos quadros sobrescritos devido ao método inicial, mostrado na parte inferior.

ffmpeg -i input.mp4 -filter_complex \
       "[0:v]split=4[v0][v1][v2][v3]; \
        [v0]trim=start_frame=0:end_frame=1,loop=90:1:0,setpts=N/FRAME_RATE/TB[0v]; \
        [v1]trim=start_frame=1:end_frame=301,loop=90:1:299,setpts=N/FRAME_RATE/TB[1v]; \
        [v2]trim=start_frame=301:end_frame=601,loop=90:1:299,setpts=N/FRAME_RATE/TB[2v]; \
        [v3]trim=start_frame=601:end_frame=900,loop=90:1:298,setpts=N/FRAME_RATE/TB[3v]; \
        aevalsrc=0:d=3[0a]; \
        [0:a]asplit=3[a1][a2][a3]; \
        [a1]atrim=0:10,asetpts=N/SR/TB[1a]; \
        [a2]atrim=10:20,asetpts=N/SR/TB[2a]; \
        [a3]atrim=20:30,asetpts=N/SR/TB[3a]; \
        [0v][0a][1v][1a][2v][2a][3v][3a]concat=n=4:v=1:a=1[v][a]" \
       -map "[v]" -map "[a]" outva.mp4

Isso pode ser feito, usando um filtro de loop margarida.

ffmpeg -i input.mp4 \
      -vf loop=90:1:0,setpts=N/FRAME_RATE/TB, \
          loop=90:1:390,setpts=N/FRAME_RATE/TB, \
          loop=90:1:780,setpts=N/FRAME_RATE/TB, \
          loop=90:1:1169,setpts=N/FRAME_RATE/TB
stuttered.mp4

O comando acima é para um vídeo de 30 fps. Cada filtro de loop define o loop para 90 quadros, ou seja, 3 segundos a 30 fps com um segmento de 1 quadro a ser em loop. O terceiro argumento é o índice de quadros que deve ser colocado em loop. O índice para todos os filtros de malha após o primeiro tem de ser compensado, uma vez que o seu feed de entrada contém loops anteriores inseridos, e. o segundo loop em 10 segundos normalmente seria 300 para um vídeo de 30 fps, mas como o primeiro foi colocado em loop por 3 segundos, ele é 3x30 + 10x30 = 390 .

Os setpts geram um conjunto monotônico de novos timestamps após cada loop, pois, caso contrário, o comando não funcionará corretamente.

O áudio foi completamente ignorado.

    
por 30.04.2016 / 10:52
0

Eu criei um script Python que faz isso: link - você pode instalá-lo com

pip install bufferer

Então:

bufferer -i input.mp4 -b "[10,3],[20,3],[30,3]" -o output.avi

Isso adicionará um indicador "rebuffering" ao comando - como um spinner que indica a pausa. Ele irá inserir as pausas que você especificou, ou seja, por três segundos a 10, 20 e 30 segundos do clipe original. Ele produzirá vídeo sem perda com codificação FFV1 e áudio PCM, mas isso pode ser alterado. Veja o README para mais informações.

Estou planejando adicionar um recurso para desativar esse indicador de rebuffering, pois você pode querer apenas uma pausa simples. Enquanto isso, você pode usar a opção --dry-run para imprimir o comando e usá-lo como ponto de partida para algumas alterações manuais.

    
por 07.04.2017 / 23:00