PowerPointを動画に変換する

PowerPointプレゼンテーションを動画に変換することで、次のようなメリットがあります。

  • アクセシビリティの向上: すべてのデバイス(プラットフォームに関係なく)は、プレゼンテーション用アプリケーションと比べてデフォルトで動画プレーヤーを備えているため、ユーザーは動画を簡単に開いたり再生したりできます。
  • リーチの拡大: 動画を通じて、大規模なオーディエンスに情報を届けることができ、プレゼンテーションでは退屈に見えるかもしれない情報も対象にできます。ほとんどの調査や統計は、人々が他のコンテンツ形式よりも動画を視聴し消費することを示しており、一般的に彼らはそのようなコンテンツを好みます。

Aspose.SlidesにおけるPowerPointから動画への変換

Aspose.Slides 22.11 では、プレゼンテーションから動画への変換をサポートしました。

  • Aspose.Slidesを使用して、特定のFPS(フレーム毎秒)に対応するフレームのセット(プレゼンテーションスライドから)を生成します。
  • ffmpegJava用)のようなサードパーティのユーティリティを使用して、フレームに基づいて動画を作成します。

PowerPointを動画に変換する

  1. POMファイルにこれを追加します:
   <dependency>
     <groupId>net.bramp.ffmpeg</groupId>
     <artifactId>ffmpeg</artifactId>
     <version>0.7.0</version>
   </dependency>
  1. ffmpegをここからダウンロードします。

  2. PowerPointから動画へのJavaコードを実行します。

このJavaコードは、図と2つのアニメーション効果を含むプレゼンテーションを動画に変換する方法を示しています:

Presentation presentation = new Presentation();
try {
    // 笑顔の形状を追加し、アニメーションを設定
    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();
    }

    // ffmpegバイナリフォルダーを設定します。 このページを参照してください: 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();
}

動画効果

スライド上のオブジェクトにアニメーションを適用し、スライド間のトランジションを使用できます。

アニメーションとトランジションはスライドショーをより魅力的で興味深いものにし、動画にも同じ効果をもたらします。前のプレゼンテーションのコードに別のスライドとトランジションを追加しましょう:

// 笑顔の形状を追加し、アニメーションを設定

// ...

// 新しいスライドとアニメーションされたトランジションを追加

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);

Aspose.Slidesはテキストのアニメーションもサポートしています。したがって、オブジェクトの段落をアニメーションさせることができ、これらは1秒の遅延で順番に表示されます:

Presentation presentation = new Presentation();
try {
    // テキストとアニメーションを追加
    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("テキストを含むPowerPointプレゼンテーションを動画に変換する"));

    Paragraph para3 = new Paragraph();
    para3.getPortions().add(new Portion("段落ごとに"));
    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();
    }

    // ffmpegバイナリフォルダーを設定します。 このページを参照してください: 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();
}

動画変換クラス

PowerPointから動画への変換タスクを実行できるように、Aspose.Slidesは、PresentationAnimationsGeneratorおよびPresentationPlayerクラスを提供します。

PresentationAnimationsGeneratorは、そのコンストラクタを通じて動画(後で作成される)用のフレームサイズを設定できます。プレゼンテーションのインスタンスを渡すと、Presentation.SlideSizeが使用され、PresentationPlayerが使用するアニメーションが生成されます。

アニメーションが生成されると、各後続のアニメーションに対してNewAnimationイベントが生成され、これにはIPresentationAnimationPlayerパラメーターがあります。後者は、別のアニメーションのプレーヤーを表すクラスです。

IPresentationAnimationPlayerで作業するには、Duration(アニメーションの総持続時間)プロパティとSetTimePositionメソッドが使用されます。各アニメーション位置は0からdurationの範囲内で設定され、その後、GetFrameメソッドはその時点でのアニメーション状態に対応するBufferedImageを返します:

Presentation presentation = new Presentation();
try {
    // 笑顔の形状を追加し、アニメーションを設定
    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("アニメーションの総持続時間: %f", animationPlayer.getDuration()));
            animationPlayer.setTimePosition(0); // 初期アニメーション状態
            try {
                // 初期アニメーション状態のビットマップ
                animationPlayer.getFrame().save("firstFrame.png", ImageFormat.Png);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            animationPlayer.setTimePosition(animationPlayer.getDuration()); // アニメーションの最終状態
            try {
                // アニメーションの最後のフレーム
                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();
}

プレゼンテーション内のすべてのアニメーションを同時に再生するには、PresentationPlayerクラスを使用します。このクラスは、PresentationAnimationsGeneratorインスタンスと効果のFPSをそのコンストラクタに取り、すべてのアニメーションを再生するためにFrameTickイベントを呼び出します:

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();
}

生成されたフレームは、動画を作成するためにコンパイルできます。 PowerPointを動画に変換するセクションを参照してください。

サポートされているアニメーションと効果

登場:

アニメーションタイプ Aspose.Slides PowerPoint
出現 サポートされていません サポートされています
フェード サポートされています サポートされています
フライイン サポートされています サポートされています
フロートイン サポートされています サポートされています
スプリット サポートされています サポートされています
ワイプ サポートされています サポートされています
形状 サポートされています サポートされています
ホイール サポートされています サポートされています
ランダムバー サポートされています サポートされています
成長と回転 サポートされていません サポートされています
ズーム サポートされています サポートされています
スウィブル サポートされています サポートされています
バウンス サポートされています サポートされています

強調:

アニメーションタイプ Aspose.Slides PowerPoint
パルス サポートされていません サポートされています
カラー パルス サポートされていません サポートされています
ティータ サポートされています サポートされています
スピン サポートされています サポートされています
成長/縮小 サポートされていません サポートされています
脱色 サポートされていません サポートされています
暗くする サポートされていません サポートされています
明るくする サポートされていません サポートされています
透明度 サポートされていません サポートされています
オブジェクトカラー サポートされていません サポートされています
補色 サポートされていません サポートされています
線の色 サポートされていません サポートされています
塗りつぶしの色 サポートされていません サポートされています

退出:

アニメーションタイプ Aspose.Slides PowerPoint
消失 サポートされていません サポートされています
フェード サポートされています サポートされています
フライアウト サポートされています サポートされています
フロートアウト サポートされています サポートされています
スプリット サポートされています サポートされています
ワイプ サポートされています サポートされています
形状 サポートされています サポートされています
ランダムバー サポートされています サポートされています
縮小と回転 サポートされていません サポートされています
ズーム サポートされています サポートされています
スウィブル サポートされています サポートされています
バウンス サポートされています サポートされています

モーションパス:

アニメーションタイプ Aspose.Slides PowerPoint
サポートされています サポートされています
サポートされています サポートされています
ターン サポートされています サポートされています
形状 サポートされています サポートされています
ループ サポートされています サポートされています
カスタムパス サポートされています サポートされています