PowerPoint előadások konvertálása videóvá Pythonban

Áttekintés

A PowerPoint vagy OpenDocument előadás videóvá alakítása lehetővé teszi, hogy a nézők a tartalmat egy videolejátszóban tekintsék meg anélkül, hogy előadásalkalmazást kellene megnyitniuk. Az Aspose.Slides for Python via Java az előadás animációit és átmeneteit képkockákká rendereli. Egy külön kódoló, például az FFmpeg, ezeket a képkockákat egy videofájlba egyesíti.

PowerPoint átalakítása videóvá

Az átalakítás két lépésből áll: PNG‑képkockák generálása a kiválasztott képkockasebességgel, majd a képsorozat MP4‑re kódolása. Ugyanazt a képkockasebességet használja mindkét lépésben az animáció időzítésének megtartásához.

Mielőtt futtatná a példát:

  1. Állítsa be az Aspose.Slides for Python via Java környezetet.
  2. Töltse le a FFmpeg‑t, és tegye elérhetővé a PATH‑on. A példa a libx264 kódolóval rendelkező buildet használja.
  3. Futtassa az alábbi Python‑kódot egy írható könyvtárban.

A példa egy mosolygó alakzatot hoz létre belépő és kilépő animációkkal, 30 FPS‑en rendereli a képkockákat, és az FFmpeg‑et hívja meg a output.mp4 létrehozásához. Egy új képkönyvtár megakadályozza, hogy a korábbi futások képkockái a videóba kerüljenek.

import shutil
import subprocess
import tempfile
from pathlib import Path

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import EffectPresetClassType, EffectSubtype, EffectTriggerType, EffectType, ImageFormat, Presentation, PresentationAnimationsGenerator, PresentationPlayer, ShapeType

fps = 30
frames_directory = Path(tempfile.mkdtemp(prefix="video_frames_", dir="."))
frame_count = 0

def save_frame(sender, arguments):
    global frame_count
    frame_path = frames_directory / f"frame_{frame_count:06d}.png"
    frame = arguments.getFrame()
    try:
        frame.save(str(frame_path), ImageFormat.Png)
    finally:
        frame.dispose()
    frame_count += 1

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    smile = slide.getShapes().addAutoShape(ShapeType.SmileyFace, 110, 20, 500, 500)
    sequence = slide.getTimeline().getMainSequence()
    entrance = sequence.addEffect(smile, EffectType.Fly, EffectSubtype.TopLeft, EffectTriggerType.AfterPrevious)
    entrance.getTiming().setDuration(2.0)
    exit_effect = sequence.addEffect(smile, EffectType.Fly, EffectSubtype.BottomRight, EffectTriggerType.AfterPrevious)
    exit_effect.setPresetClassType(EffectPresetClassType.Exit)
    exit_effect.getTiming().setDuration(2.0)

    generator = PresentationAnimationsGenerator(presentation)
    try:
        player = PresentationPlayer(generator, fps)
        try:
            callback = jpype.JProxy("com.aspose.slides.PresentationPlayer$FrameTick", dict(invoke=save_frame))
            player.setFrameTick(callback)
            generator.run(presentation.getSlides())
        finally:
            player.dispose()
    finally:
        generator.dispose()
finally:
    presentation.dispose()

ffmpeg = shutil.which("ffmpeg")
if frame_count == 0:
    print("No frames were generated.")
elif ffmpeg is None:
    print(f"FFmpeg was not found on PATH. PNG frames are available in {frames_directory}.")
else:
    input_pattern = str(frames_directory / "frame_%06d.png")
    command = [ffmpeg, "-n", "-framerate", str(fps), "-start_number", "0", "-i", input_pattern, "-vf", "pad=ceil(iw/2)*2:ceil(ih/2)*2", "-c:v", "libx264", "-pix_fmt", "yuv420p", "output.mp4"]
    result = subprocess.run(command, check=False)
    if result.returncode == 0:
        print("Saved output.mp4")
    else:
        print(f"FFmpeg failed with exit code {result.returncode}. Frames are available in {frames_directory}.")

Egy meglévő fájl átalakításához inicializálja a Presentation objektumot az útvonallal, és hagyja ki az alakzat‑ és animáció‑létrehozó utasításokat.

Az FFmpeg parancs egy számozott image sequence‑t olvas, a páratlan méreteket párosra kiegészíti, majd H.264 videót ír a yuv420p pixelformátummal. A -n opció megakadályozza a meglévő kimeneti fájl felülírását. A generált PNG‑fájlok a képkönyvtárban maradnak; távolítsa el őket, ha már nincs rájuk szükség.

Videóhatások

Az animációk határozzák meg, hogyan jelennek meg, mozognak vagy tűnnek el a diák objektumai. Az átmenetek a diák közötti változást szabályozzák. Adjon hozzá ezeket a hatásokat a videókép generálása előtt.

Lásd: PowerPoint Animation, Shape Animation, Shape Effects, és Slide Transitions.

Átmenet hozzáadása a diára

Az alábbi önálló példa egy két diából álló előadást hoz létre. A második dia magenta háttérrel és push‑átmenettel rendelkezik. Mentse el az előadást, majd használja bemenetként a fenti képkocka‑generáló példához.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import BackgroundType, FillType, Presentation, SaveFormat, ShapeType, TransitionType

Color = jpype.JClass("java.awt.Color")

presentation = Presentation()
try:
    first_slide = presentation.getSlides().get_Item(0)
    first_slide.getShapes().addAutoShape(ShapeType.SmileyFace, 110, 20, 500, 500)
    new_slide = presentation.getSlides().addEmptySlide(first_slide.getLayoutSlide())
    new_slide.getBackground().setType(BackgroundType.OwnBackground)
    new_slide.getBackground().getFillFormat().setFillType(FillType.Solid)
    new_slide.getBackground().getFillFormat().getSolidFillColor().setColor(Color.MAGENTA)
    new_slide.getSlideShowTransition().setType(TransitionType.Push)
    presentation.save("transition.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Bekezdések animálása

A szöveg bekezdésről bekezdésre jelenhet meg. Ez a példa három bekezdést hoz létre sorozatos fade‑belépő hatással, mindegyik egy másodperccel késleltetve az előző után. Használja a mentett paragraphs.pptx fájlt bemenetként a videó‑konvertáló példához.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import EffectSubtype, EffectTriggerType, EffectType, Paragraph, Portion, Presentation, SaveFormat, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 210, 120, 300, 300)
    shape.addTextFrame("")
    paragraphs = shape.getTextFrame().getParagraphs()
    paragraphs.clear()
    sequence = slide.getTimeline().getMainSequence()
    texts = ["Aspose.Slides for Python via Java", "Convert presentation text to video", "Paragraph by paragraph"]

    for text in texts:
        paragraph = Paragraph()
        portion = Portion(text)
        paragraph.getPortions().add(portion)
        paragraphs.add(paragraph)
        effect = sequence.addEffect(paragraph, EffectType.Fade, EffectSubtype.None_, EffectTriggerType.AfterPrevious)
        effect.getTiming().setTriggerDelayTime(1.0)
        effect.getTiming().setDuration(1.0)

    presentation.save("paragraphs.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Videókonvertáló osztályok

PresentationAnimationsGenerator animációs eseményeket generál a diákhoz. A prezentációból történő létrehozáskor a prezentáció diamérete alapján állítja elő a képkockákat. Használja a setDefaultDelay‑t az alapértelmezett késleltetés ezredmásodpercben történő beállításához.

PresentationPlayer a megadott képkockasebességgel veszi mintát a generált animációkból. Regisztráljon egy Python‑callback‑et a JPype‑on keresztül a setFrameTick‑el, majd hívja a run‑t a képkockák generálásához. Az első példa saját, nullárral kezdődő számlálót használ, így a fájlnevek megfelelnek az FFmpeg bemeneti sorozatának.

Az egyes animációs állapotokhoz regisztráljon callback‑et a setNewAnimation‑nel. A callback egy animációs playert kap, amely a kívánt időpontra állítható. Az alábbi példa az egyes generált animációk első és utolsó képkockáját egyedi fájlnevekkel menti:

from pathlib import Path

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import EffectSubtype, EffectTriggerType, EffectType, ImageFormat, Presentation, PresentationAnimationsGenerator, ShapeType

output_directory = Path("animation_states")
output_directory.mkdir(exist_ok=True)
animation_index = 0

def save_animation_states(animation_player):
    global animation_index
    duration = animation_player.getDuration()
    print(f"Animation {animation_index}: {duration} milliseconds")
    for label, position in [("first", 0.0), ("last", duration)]:
        animation_player.setTimePosition(position)
        frame = animation_player.getFrame()
        try:
            frame_path = output_directory / f"animation_{animation_index:04d}_{label}.png"
            frame.save(str(frame_path), ImageFormat.Png)
        finally:
            frame.dispose()
    animation_index += 1

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    smile = slide.getShapes().addAutoShape(ShapeType.SmileyFace, 110, 20, 500, 500)
    sequence = slide.getTimeline().getMainSequence()
    effect = sequence.addEffect(smile, EffectType.Fly, EffectSubtype.TopLeft, EffectTriggerType.AfterPrevious)
    effect.getTiming().setDuration(2.0)

    generator = PresentationAnimationsGenerator(presentation)
    try:
        callback = jpype.JProxy("com.aspose.slides.PresentationAnimationsGenerator$NewAnimation", dict(invoke=save_animation_states))
        generator.setNewAnimation(callback)
        generator.run(presentation.getSlides())
    finally:
        generator.dispose()
finally:
    presentation.dispose()

Támogatott animációk és hatások

Az alábbi táblázatok összegzik a Java átalakítási cikkben leírt renderelési támogatást. Tekintse meg a generált képkockákat, ha egy előadás olyan hatásokat használ, amelyek nincsenek támogatva.

Bevezető:

Animáció típusa Aspose.Slides PowerPoint
Appear Nem Igen
Fade Igen Igen
Fly In Igen Igen
Float In Igen Igen
Split Igen Igen
Wipe Igen Igen
Shape Igen Igen
Wheel Igen Igen
Random Bars Igen Igen
Grow & Turn Nem Igen
Zoom Igen Igen
Swivel Igen Igen
Bounce Igen Igen

Hangsúly:

Animáció típusa Aspose.Slides PowerPoint
Pulse Nem Igen
Color Pulse Nem Igen
Teeter Igen Igen
Spin Igen Igen
Grow/Shrink Nem Igen
Desaturate Nem Igen
Darken Nem Igen
Lighten Nem Igen
Transparency Nem Igen
Object Color Nem Igen
Complementary Color Nem Igen
Line Color Nem Igen
Fill Color Nem Igen

Kilépő:

Animáció típusa Aspose.Slides PowerPoint
Disappear Nem Igen
Fade Igen Igen
Fly Out Igen Igen
Float Out Igen Igen
Split Igen Igen
Wipe Igen Igen
Shape Igen Igen
Random Bars Igen Igen
Shrink & Turn Nem Igen
Zoom Igen Igen
Swivel Igen Igen
Bounce Igen Igen

Mozgásútvonalak:

Animáció típusa Aspose.Slides PowerPoint
Lines Igen Igen
Arcs Igen Igen
Turns Igen Igen
Shapes Igen Igen
Loops Igen Igen
Custom Path Igen Igen

GYIK

Készít-e az Aspose.Slides közvetlenül MP4 fájlt?

Nem. Az Aspose.Slides csak előadási képkockákat generál. Használjon olyan videókódolót, például az FFmpeg‑et, hogy ezeket MP4‑be egyesítse.

Miért játszik a videó gyorsabban vagy lassabban, mint várt?

Használja ugyanazt az FPS‑t a képkocka‑generáláshoz és a kódoló bemeneti képkockasebességéhez. A nem egyezés megváltoztatja a képfolyam lejátszási időtartamát.

Átalakíthatok jelszóval védett előadást?

Igen. Adja meg a megfelelő jelszót a védett előadás betöltése során, majd generáljon képkockákat a betöltött tartalomról.

Megőrzi-e ez a munkafolyamat az előadás hangját?

A példák csak kép‑kockákat exportálnak, így a kész videó némán fut. Hang hozzáadásához külön audio‑sávot kell megadni a videó kódolása során.

Hogyan csökkenthetem az ideiglenes lemezhasználatot?

Használjon kisebb képkockaméretet vagy alacsonyabb FPS‑t, és távolítsa el az ideiglenes PNG‑fájlokat a sikeres kódolás után. Ellenőrizze a videó minőségét, amikor valamelyik beállítást módosítja.