PowerPointをビデオに変換する

PowerPointプレゼンテーションをビデオに変換すると、次のような利点があります。

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

Aspose.SlidesでのPowerPointからビデオへの変換

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

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

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つずつ(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
ライン サポート サポート
アーク サポート サポート
ターン サポート サポート
形状 サポート サポート
ループ サポート サポート
カスタムパス サポート サポート