Video Editing: Diashow mit Überblendung

Effect Strip Cross

Als die Welt noch Analog war haben Leute ihre Eindrücke und Meinungen manchmal in Diavorträgen unter die Leute gebracht. Die Profis hatten 2-4 Diaprojektoren und haben mit Überblendung weiche Übergänge zwischen den Bildern produziert.

Will man einen Diavortrag auf YouTube posten, dann ist die einfachste Möglichkeit im Video-Editing einfach alle Fotos reinladen und "Frame Rate" Custom einstellen und bei FPS einen Wert ≤1 eingeben.

Damit hat man aber noch keine weichen Übergänge. Für weiche Übergänge braucht man wieder die Standard "Frame Rate" von 24 und es muss jedes Foto 24 bis 48 Frames stehen bleiben. Zwischen zwei Fotos macht man dann einen Effect Strip Cross.

Beispiele

Bei 4 Fotos wie in der Abbildung kann man das so schon mal machen. Hat man aber sehr viele Fotos, dann muss das irgendwie automatisiert werden.

Ich nutze diesen Effekt zum einen für eine einleitende Diashow vor der Blender-Animation: Drache

Die andere Anwendung sind Stop-Motion Knetfiguren Animationen (Clay-Animation). Ich bekomme da in der Regel blos 6 Bilder pro Sekunde hin, um die Animationen trotzdem nicht so ruckelig zu haben, mache ich Überblendungen zwischen den einzelnen Bildern:

Clay-Animation

Fotos einfügen

Mit dem folgenden Skript habe ich das überlappende Einfügen der Fotos automatisiert:
import os
import bpy
fotos = "/home/magnus/Modeling/Python/Diashow/Fotos"
fl = os.listdir(fotos)
fl.sort()

for i, f in enumerate(fl):
    bpy.ops.sequencer.image_strip_add( 
        directory = fotos, 
        files = [{"name":f}], 
        frame_start=1+i*40, 
        frame_end  =1+i*40+50)

Cross-Übergänge einfügen

Wie bekommt man nun aber die Cross-Übergänge hin? Hierzu müssen im Skript immer zwei aufeinander folgende Fotos ausgewählt werden und danach ein Cross-Effekt hinzugefügt werden. Das Selektieren von Python aus, über das Setzen des Property myobject.select=True und Deselektieren myobject.select=False, funktioniert nicht zuverlässig (Blender 2.69 Ubuntu 12.04). Im Video-Editor ist die Sequenz immer noch selektiert.

Ist ein Effekt noch selektiert, wenn ich zwei Foto-Sequenzen selektiere und einen Cross-Effekt hinzufüge, dann ist der Cross-Effekt irgendwo, nur nicht da wo er hin soll.

Deshalb hier mein Trick:

import os
import bpy
fotos = "/home/magnus/Modeling/Python/Diashow/Fotos"
fl = os.listdir(fotos)
fl.sort()

for i, f in enumerate(fl):
    bpy.ops.sequencer.image_strip_add( 
        directory = fotos, 
        files = [{"name":f}], 
        frame_start=1+i*40, 
        frame_end  =1+i*40+50)


for i in range(len(fl)-1):
    bpy.data.scenes['Scene'].sequence_editor.sequences_all[ fl[i] ].select=True
    bpy.data.scenes['Scene'].sequence_editor.sequences_all[ fl[i+1] ].select=True
    bpy.ops.sequencer.effect_strip_add(channel=3)

    bpy.context.selected_sequences[0].input_1 = \
		bpy.data.scenes['Scene'].sequence_editor.sequences_all[ fl[i] ]
    bpy.context.selected_sequences[0].input_2 = \
		bpy.data.scenes['Scene'].sequence_editor.sequences_all[ fl[i+1] ]

    bpy.data.scenes['Scene'].sequence_editor.sequences_all[ fl[i] ].select=True
    bpy.data.scenes['Scene'].sequence_editor.sequences_all[ fl[i+1] ].select=True
    bpy.ops.sequencer.effect_strip_add(channel=3)
    bpy.ops.sequencer.delete()

So funktioniert's

Auswählen zweier Fotos und Cross-Effekt hinzufügen:
bpy.data.scenes['Scene'].sequence_editor.sequences_all[ fl[i] ].select=True
bpy.data.scenes['Scene'].sequence_editor.sequences_all[ fl[i+1] ].select=True
bpy.ops.sequencer.effect_strip_add(channel=3)
Die Fotos sind nicht aufeinanderfolgend weil sequences_all irgendwie komisch sortiert ist, also beim Cross-Effekt die Fotos manuell zuweisen:
bpy.context.selected_sequences[0].input_1 = \
	bpy.data.scenes['Scene'].sequence_editor.sequences_all[ fl[i] ]
bpy.context.selected_sequences[0].input_2 = \
	bpy.data.scenes['Scene'].sequence_editor.sequences_all[ fl[i+1] ]
Wie bekomme ich nun den Cross-Effekt deselektiert (myobject.select=False funktioniert wie gesagt nicht)?
Ich füge einen weiteren Cross-Effekt ein, den ich danach wieder lösche. Ein gelöschtes Objekt ist nämlich garantiert deselektiert.
bpy.data.scenes['Scene'].sequence_editor.sequences_all[ fl[i] ].select=True
bpy.data.scenes['Scene'].sequence_editor.sequences_all[ fl[i+1] ].select=True
bpy.ops.sequencer.effect_strip_add(channel=3)
bpy.ops.sequencer.delete()
Eine Macke hat das Script noch, ein Cross-Effekt muss zum Schluss manuell gelöscht werden und neu von Hand eingefügt werden: