Конвертация PowerPoint в видео

Конвертируя вашу презентацию PowerPoint в видео, вы получаете

  • Увеличение доступности: Все устройства (независимо от платформы) по умолчанию оснащены мультимедийными плеерами, в отличие от приложений для открытия презентаций, поэтому пользователям проще открывать или воспроизводить видео.
  • Больше охвата: Через видео вы можете достичь широкой аудитории и донести до нее информацию, которая в противном случае может показаться скучной в презентации. Большинство опросов и статистики предполагают, что люди чаще смотрят и потребляют видео, чем другие формы контента, и они, как правило, предпочитают такой контент.

Конвертация PowerPoint в видео с помощью Aspose.Slides

В Aspose.Slides 22.11 мы реализовали поддержку конвертации презентации в видео.

  • Используйте Aspose.Slides для генерации набора кадров (из слайдов презентации), которые соответствуют определенному FPS (кадров в секунду).
  • Используйте утилиту стороннего производителя, такую как ffmpeg (для java), чтобы создать видео на основе кадров.

Конвертация PowerPoint в видео

  1. Добавьте это в ваш файл POM:
   <dependency>
     <groupId>net.bramp.ffmpeg</groupId>
     <artifactId>ffmpeg</artifactId>
     <version>0.7.0</version>
   </dependency>
  1. Скачайте ffmpeg здесь.

  2. Запустите код PowerPoint в видео на Java.

Этот код на Java показывает, как конвертировать презентацию (содержащую фигуру и два эффекта анимации) в видео:

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 также поддерживает анимацию для текстов. Поэтому мы анимируем абзацы на объектах, которые будут появляться один за другим (с задержкой, установленной на секунду):

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 для 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 до продолжительности, после чего метод 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 {
                // начальное состояние анимации bitmap
                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
Линии поддерживается поддерживается
Дуги поддерживается поддерживается
Повороты поддерживается поддерживается
Формы поддерживается поддерживается
Циклы поддерживается поддерживается
Пользовательская траектория поддерживается поддерживается