Конвертация 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. Запустите код Java для конвертации PowerPoint в видео.

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