Como associar videoclipes de maneira eficiente e automatizada usando transições curtas?

1

Eu pretendo unir um conjunto de clipes de vídeo (com áudio) usando algumas transições curtas (idealmente crossfade) de uma maneira direta, automatizada e eficiente.

IE:

ClipA ---> ClipB --> ClipC --> ClipD
[aaaaaaaa][bbbbbbbb][cccccccc][dddddddd]
(--> indicate crossfades, not to scale!)

Para esclarecer:

  • por simples , o ideal seria envolver o uso de ferramentas 'padrão' (ou seja, aquelas com as quais já estou familiarizado, ffmpeg , mas ferramentas menos conhecidas como melt são qualificadas e Estou disposto a explorar novos horizontes como o MoviePy)
  • por automatizado quero dizer algo que pode ser parametrizado e colocado em um script python / shell / etc
  • por eficiente quero dizer codificar rapidamente ou minimizar a re-codificação

No momento, estou usando python e ffmpeg para cortar um arquivo de vídeo já em Matroska / h264 / aac usando o parâmetro de cópia de fluxo ( muito rápido ) com base em timecodes em um arquivo de texto. Em seguida, melt sequencialmente sequencia esses clipes um após o outro usando transições de luma (crossfade) curtas ( muito lentas devido à recodificação da sequência inteira ).

Parece-me que, desses longos videoclipes, apenas alguns segundos precisam ser processados e recodificados - as próprias transições. O resto pode ser copiado. Existe uma maneira já existente / intuitiva de fazer isso? Minha abordagem ingênua seria cortar os clipes em subclipes, usando melt para criar as transições e usando o filtro concat para colar a bagunça.

Por exemplo:

ClipA1 ClipA2 ClipB1 ClipB2 ClipB3 ClipC1 ClipC2 ClipC3 ClipD1 Clip D2
[aaaaaaa] + [a][b] + [bbbbbb] + [b][c] + [cccccc] + [c][d] + [ddddddd]
(+ indicates concat-ing of subclips; [x][y] indicates a short xfade from x to y)

No entanto, estou reticente em cobrar o que pode ser uma tarefa tola, pois antecipo as% de melt / ffmpeg relacionadas ao timing de cortes e à sincronização de áudio; e eu não quero perder seções de vídeo ou áudio devido à colocação de frame-I ou o que você tem. Além disso, tenho a sensação de que não sou a primeira pessoa a se deparar com isso, por isso estou curioso para saber como aqueles mais inteligentes do que eu resolvi isso - minhas soluções tendem para os ingênuos como eu digo!

Espero que isso tenha sido claro. Felicidades pela leitura e obrigado antecipadamente!

Para o contexto, minha intenção é reduzir as cenas de vídeo game não editadas e não editadas em um vídeo interessante / "útil"; isso é cortar a penugem de carregar coisas, classificar problemas de conectividade etc. Mas também é generalizável destacar uma montagem para mostrar progressão. Como é algo que em teoria surgirá toda vez que houver novas filmagens, tenho um grande interesse em fazê-lo da maneira mais eficiente (mais preguiçosa).

    
por bertieb 23.06.2015 / 02:33

1 resposta

2

Eu não tive tempo para testá-lo, mas isso deve funcionar se você quiser usar o MoviePy:

from moviepy.editor import *

clips = [ VideoFileClip("vid1.mp4"),
          VideoFileClip("vid2.mp4"),
          VideoFileClip("vid3.mp4"), ... ]


fade_duration = 1 # 1-second fade-in for each clip
clips = [clip.crossfadein(fade_duration) for clip in clips]

final_clip = concatenate_videoclips(clips, padding = -fade_duration)

# You can write any format, in any quality.
final_clip.write_videofile("final.mp4", bitrate="5000k")
    
por 23.06.2015 / 08:30