PowerPoint prezentációk videóvá konvertálása Java-ban

Bevezetés

PowerPoint vagy OpenDocument prezentáció videóvá konvertálásával a következő előnyöket érheti el:

Megnövelt hozzáférhetőség: Minden eszköz, platformtól függetlenül, alapértelmezés szerint videólejátszóval rendelkezik, így a felhasználók számára egyszerűbb a videók megnyitása vagy lejátszása a hagyományos prezentációs alkalmazásokhoz képest.

Szélesebb elérés: A videók lehetővé teszik, hogy nagyobb közönséget érjen el, és információt vonzóbb formátumban mutasson be. Kérdőívek és statisztikák azt mutatják, hogy az emberek szívesebben néznek és fogyasztanak videótartalmat más formákhoz képest, ezáltal üzenete hatásosabb lesz.

PowerPoint videó konvertálása az Aspose.Slides-ben

Az Aspose.Slides 22.11 verzióban bevezettük a prezentáció videóvá konvertálásának támogatását.

  • Használja a Aspose.Slides‑t, hogy a prezentáció diái alapján olyan képkockákat állítson elő, amelyek egy adott FPS‑nek (képkocka/másodperc) felelnek meg
  • Használjon egy harmadik féltől származó eszközt, például a ffmpeg‑et (java‑hoz), hogy a képkockákból videót készítsen.

PowerPoint videóvá konvertálása

  1. Adja hozzá ezt a POM‑fájljához:
   <dependency>
     <groupId>net.bramp.ffmpeg</groupId>
     <artifactId>ffmpeg</artifactId>
     <version>0.7.0</version>
   </dependency>
  1. Töltse le a ffmpeg‑et itt.

  2. Futtassa a PowerPoint videó Java kódot.

Ez a Java kód bemutatja, hogyan konvertálhat egy prezentációt (amely egy ábrát és két animációs hatást tartalmaz) videóvá:

Presentation presentation = new Presentation();
try {
    // Hozzáad egy mosoly alakzatot, majd animálja azt
    IAutoShape smile = presentation.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.SmileyFace, 110, 20, 500, 500);
    ISequence mainSequence = presentation.getSlides().get_Item(0).getTimeline().getMainSequence();
    IEffect effectIn = mainSequence.addEffect(smile, EffectType.Fly, EffectSubtype.TopLeft, EffectTriggerType.AfterPrevious);
    IEffect effectOut = mainSequence.addEffect(smile, EffectType.Fly, EffectSubtype.BottomRight, EffectTriggerType.AfterPrevious);
    effectIn.getTiming().setDuration(2f);
    effectOut.setPresetClassType(EffectPresetClassType.Exit);

    final int fps = 33;
    ArrayList<String> frames = new ArrayList<String>();

    PresentationAnimationsGenerator animationsGenerator = new PresentationAnimationsGenerator(presentation);
    try
    {
        PresentationPlayer player = new PresentationPlayer(animationsGenerator, fps);
        try {
            player.setFrameTick((sender, arguments) ->
            {
                try {
                    String frame = String.format("frame_%04d.png", sender.getFrameIndex());
                    arguments.getFrame().save(frame, ImageFormat.Png);
                    frames.add(frame);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });
            animationsGenerator.run(presentation.getSlides());
        } finally {
            if (player != null) player.dispose();
        }
    } finally {
        if (animationsGenerator != null) animationsGenerator.dispose();
    }

    // Állítsa be az ffmpeg binárisok mappáját. Lásd ezt az oldalt: https://github.com/rosenbjerg/FFMpegCore#installation
    FFmpeg ffmpeg = new FFmpeg("path/to/ffmpeg");
    FFprobe ffprobe = new FFprobe("path/to/ffprobe");

    FFmpegBuilder builder = new FFmpegBuilder()
            .addExtraArgs("-start_number", "1")
            .setInput("frame_%04d.png")
            .addOutput("output.avi")
            .setVideoFrameRate(FFmpeg.FPS_24)
            .setFormat("avi")
            .done();

    FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe);
    executor.createJob(builder).run();
} catch (IOException e) {
    e.printStackTrace();
}

Videóeffektek

Animációkat alkalmazhat a diákon lévő objektumokra, valamint átmeneteket használhat a diák között.

Az animációk és átmenetek élőbbé és érdekesebbé teszik a diavetítéseket – ugyanígy hatnak a videókra is. Adjunk hozzá egy új diát és átmenetet a korábbi prezentáció kódjához:

// Hozzáad egy mosoly alakzatot és animálja azt

// ...

// Hozzáad egy új diát és animált átmenetet

ISlide newSlide = presentation.getSlides().addEmptySlide(presentation.getSlides().get_Item(0).getLayoutSlide());

newSlide.getBackground().setType(BackgroundType.OwnBackground);

newSlide.getBackground().getFillFormat().setFillType(FillType.Solid);

newSlide.getBackground().getFillFormat().getSolidFillColor().setColor(Color.MAGENTA);

newSlide.getSlideShowTransition().setType(TransitionType.Push);

Az Aspose.Slides szövegekre is támogat animációt. Így animálhatunk bekezdéseket objektumokon, amelyek egyesével, egy másodperces késleltetéssel jelennek meg:

Presentation presentation = new Presentation();
try {
    // Szöveget és animációkat ad hozzá
    IAutoShape autoShape = presentation.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.Rectangle, 210, 120, 300, 300);
    Paragraph para1 = new Paragraph();
    para1.getPortions().add(new Portion("Aspose Slides for Java"));
    Paragraph para2 = new Paragraph();
    para2.getPortions().add(new Portion("convert PowerPoint Presentation with text to video"));

    Paragraph para3 = new Paragraph();
    para3.getPortions().add(new Portion("paragraph by paragraph"));
    IParagraphCollection paragraphCollection = autoShape.getTextFrame().getParagraphs();
    paragraphCollection.add(para1);
    paragraphCollection.add(para2);
    paragraphCollection.add(para3);
    paragraphCollection.add(new Paragraph());

    ISequence mainSequence = presentation.getSlides().get_Item(0).getTimeline().getMainSequence();
    IEffect effect1 = mainSequence.addEffect(para1, EffectType.Appear, EffectSubtype.None, EffectTriggerType.AfterPrevious);
    IEffect effect2 = mainSequence.addEffect(para2, EffectType.Appear, EffectSubtype.None, EffectTriggerType.AfterPrevious);
    IEffect effect3 = mainSequence.addEffect(para3, EffectType.Appear, EffectSubtype.None, EffectTriggerType.AfterPrevious);
    IEffect effect4 = mainSequence.addEffect(para3, EffectType.Appear, EffectSubtype.None, EffectTriggerType.AfterPrevious);

    effect1.getTiming().setTriggerDelayTime(1f);
    effect2.getTiming().setTriggerDelayTime(1f);
    effect3.getTiming().setTriggerDelayTime(1f);
    effect4.getTiming().setTriggerDelayTime(1f);

    final int fps = 33;
    ArrayList<String> frames = new ArrayList<String>();

    PresentationAnimationsGenerator animationsGenerator = new PresentationAnimationsGenerator(presentation);
    try
    {
        PresentationPlayer player = new PresentationPlayer(animationsGenerator, fps);
        try {
            player.setFrameTick((sender, arguments) ->
            {
                try {
                    String frame = String.format("frame_%04d.png", sender.getFrameIndex());
                    arguments.getFrame().save(frame, ImageFormat.Png);
                    frames.add(frame);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });
            animationsGenerator.run(presentation.getSlides());
        } finally {
            if (player != null) player.dispose();
        }
    } finally {
        if (animationsGenerator != null) animationsGenerator.dispose();
    }

    // Állítsa be az ffmpeg binárisok mappáját. Lásd ezt az oldalt: https://github.com/rosenbjerg/FFMpegCore#installation
    FFmpeg ffmpeg = new FFmpeg("path/to/ffmpeg");
    FFprobe ffprobe = new FFprobe("path/to/ffprobe");

    FFmpegBuilder builder = new FFmpegBuilder()
            .addExtraArgs("-start_number", "1")
            .setInput("frame_%04d.png")
            .addOutput("output.avi")
            .setVideoFrameRate(FFmpeg.FPS_24)
            .setFormat("avi")
            .done();

    FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe);
    executor.createJob(builder).run();
} catch (IOException e) {
    e.printStackTrace();
}

Videókonvertálási osztályok

Az Aspose.Slides a PresentationAnimationsGenerator és a PresentationPlayer osztályokkal teszi lehetővé a PowerPoint videóvá konvertálási feladatok elvégzését.

A PresentationAnimationsGenerator segítségével a videó (később létrehozandó) képkockaméretét a konstruktorában adhatja meg. Ha a prezentáció egy példányát adja át, a Presentation.SlideSize lesz használva, és olyan animációkat generál, amelyeket a PresentationPlayer felhasznál.

Az animációk generálásakor minden egyes további animációhoz egy NewAnimation eseményt hoz létre, amely a IPresentationAnimationPlayer paraméterrel rendelkezik. Az utóbbi egy olyan osztály, amely egy különálló animáció lejátszóját képviseli.

Az IPresentationAnimationPlayer használatához a Duration (az animáció teljes időtartama) tulajdonság és a SetTimePosition metódus szolgál. Minden animáció pozíciója a 0 és az időtartam közötti tartományban állítható, majd a GetFrame metódus egy BufferedImage‑et ad vissza, amely az adott pillanatban az animáció állapotát tükrözi:

Presentation presentation = new Presentation();
try {
    // Hozzáad egy mosoly alakzatot és animálja azt
    IAutoShape smile = presentation.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.SmileyFace, 110, 20, 500, 500);
    ISequence mainSequence = presentation.getSlides().get_Item(0).getTimeline().getMainSequence();
    IEffect effectIn = mainSequence.addEffect(smile, EffectType.Fly, EffectSubtype.TopLeft, EffectTriggerType.AfterPrevious);
    IEffect effectOut = mainSequence.addEffect(smile, EffectType.Fly, EffectSubtype.BottomRight, EffectTriggerType.AfterPrevious);
    effectIn.getTiming().setDuration(2f);
    effectOut.setPresetClassType(EffectPresetClassType.Exit);

    PresentationAnimationsGenerator animationsGenerator = new PresentationAnimationsGenerator(presentation);
    try {
        animationsGenerator.setNewAnimation(animationPlayer ->
        {
            System.out.println(String.format("Animation total duration: %f", animationPlayer.getDuration()));
            animationPlayer.setTimePosition(0); // kezdeti animációs állapot
            try {
                // kezdeti animációs állapot bitmap
                animationPlayer.getFrame().save("firstFrame.png", ImageFormat.Png);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            animationPlayer.setTimePosition(animationPlayer.getDuration()); // animáció végső állapota
            try {
                // animáció utolsó képkockája
                animationPlayer.getFrame().save("lastFrame.png", ImageFormat.Png);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });
    } finally {
        if (animationsGenerator != null) animationsGenerator.dispose();
    }
} finally {
    if (presentation != null) presentation.dispose();
}

Az összes animáció egyszerre történő lejátszásához a PresentationPlayer osztályt használjuk. Ez az osztály egy PresentationAnimationsGenerator példányt és az FPS‑t veszi fel a konstruktorában, majd minden animációhoz meghívja a FrameTick eseményt, hogy azok lejátszásra kerüljenek:

Presentation presentation = new Presentation("animated.pptx");
try {
    PresentationAnimationsGenerator animationsGenerator = new PresentationAnimationsGenerator(presentation);
    try {
        PresentationPlayer player = new PresentationPlayer(animationsGenerator, 33);
        try {
            player.setFrameTick((sender, arguments) ->
            {
                try {
                    arguments.getFrame().save("frame_" + sender.getFrameIndex() + ".png", ImageFormat.Png);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });
            animationsGenerator.run(presentation.getSlides());
        } finally {
            if (player != null) player.dispose();
        }
    } finally {
        if (animationsGenerator != null) animationsGenerator.dispose();
    }
} finally {
    if (presentation != null) presentation.dispose();
}

Ezután a generált képkockákat össze lehet vonni egy videó készítéséhez. Lásd a PowerPoint videóvá konvertálása szakaszt.

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

Belépés:

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

Kiemelés:

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

Kilépés:

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

Mozgás útvonalak:

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

GYIK

Lehetőség van jelszóval védett prezentációk konvertálására?

Igen, az Aspose.Slides támogatja a jelszóval védett prezentációk kezelését. Az ilyen fájlok feldolgozásához meg kell adnia a megfelelő jelszót, hogy a könyvtár hozzáférhessen a prezentáció tartalmához.

Támogatja az Aspose.Slides a felhőalapú megoldásokat?

Igen, az Aspose.Slides integrálható felhőalkalmazásokba és szolgáltatásokba. A könyvtár úgy lett tervezve, hogy szerverkörnyezetben működjön, magas teljesítményt és méretezhetőséget biztosítva a fájlok kötegelt feldolgozásához.

Vannak-e méretkorlátozások a prezentációk konvertálása során?

Az Aspose.Slides gyakorlatilag bármilyen méretű prezentációt képes kezelni. Nagyon nagy fájlok esetén azonban további rendszererőforrásokra lehet szükség, és gyakran ajánlott a prezentáció optimalizálása a teljesítmény javítása érdekében.