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.
Megjegyzés
Próbálja ki az online PowerPoint to Video converter szolgáltatást, hogy lássa a prezentáció‑videó átalakítást működés közben.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:
- Állítsa be az Aspose.Slides for Python via Java környezetet.
- Töltse le a FFmpeg‑t, és tegye elérhetővé a
PATH‑on. A példa alibx264kódolóval rendelkező buildet használja. - 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.
Megjegyzés
Ez a példa csak képkockákat kódol. Nem ad hozzá narrációt vagy beágyazott előadás‑hangot a kimeneti videóhoz.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.