Конвертировать презентации PowerPoint в видео на PHP

Преобразовав вашу презентацию 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>
```php

  1. Скачайте ffmpeg здесь.

  2. Запустите PHP‑код для конвертации PowerPoint в видео.

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

  $presentation = new Presentation();
  try {
    # Добавляет форму улыбки и анимирует её
    $smile = $presentation->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::SmileyFace, 110, 20, 500, 500);
    $mainSequence = $presentation->getSlides()->get_Item(0)->getTimeline()->getMainSequence();
    $effectIn = $mainSequence->addEffect($smile, EffectType::Fly, EffectSubType::TopLeft, EffectTriggerType::AfterPrevious);
    $effectOut = $mainSequence->addEffect($smile, EffectType::Fly, EffectSubType::BottomRight, EffectTriggerType::AfterPrevious);
    $effectIn->getTiming()->setDuration(2.0);
    $effectOut->setPresetClassType(EffectPresetClassType::Exit);
    $fps = 33;

    class FrameTick {
      function invoke($sender, $arg) {
            try {
                $frame = sprintf("frame_%04d.png", $sender->getFrameIndex());
                $arguments->getFrame()->save($frame, ImageFormat::Png);
                $frames->add($frame);
                } catch (JavaException $e) {
                  }
             }
    }

    $frames = new Java("java.util.ArrayList");
    $animationsGenerator = new PresentationAnimationsGenerator($presentation);
    try {
      $player = new PresentationPlayer($animationsGenerator, $fps);
      try {
        $frameTick = java_closure(new FrameTick(), null, java("com.aspose.slides.PresentationPlayerFrameTick"));
        $player->setFrameTick($frameTick);
        $animationsGenerator->run($presentation->getSlides());
      } finally {
        if (!java_is_null($player)) {
          $player->dispose();
        }
      }
    } finally {
      if (!java_is_null($animationsGenerator)) {
        $animationsGenerator->dispose();
      }
    }
    # Настраивает каталог бинарных файлов ffmpeg. См. эту страницу: https://github.com/rosenbjerg/FFMpegCore#installation
    $ffmpeg = new Java("net.bramp.ffmpeg.builder.FFmpeg", "path/to/ffmpeg");
    $ffprobe = new Java("net.bramp.ffmpeg.builder.FFprobe", "path/to/ffprobe");
    $builder = (new Java("net.bramp.ffmpeg.builder.FFmpegBuilder"))->addExtraArgs("-start_number", "1")->setInput("frame_%04d.png")->addOutput("output.avi")->setVideoFrameRate(FFmpeg->FPS_24)->setFormat("avi")->done();
    $executor = new Java("net.bramp.ffmpeg.builder.FFmpegExecutor", $ffmpeg, $ffprobe);
    $executor->createJob($builder)->run();
  } catch (JavaException $e) {
    $e->printStackTrace();
  }

Видеоэффекты

Вы можете применять анимацию к объектам на слайдах и использовать переходы между слайдами.

Анимации и переходы делают слайдшоу более захватывающими и интересными — и то же самое происходит с видео. Добавим ещё один слайд и переход в код для предыдущей презентации:

  # Добавляет форму улыбки и анимирует её
  # ...
  # Добавляет новый слайд и анимированный переход
  $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(java("java.awt.Color")->MAGENTA);
  $newSlide->getSlideShowTransition()->setType(TransitionType::Push);

Aspose.Slides также поддерживает анимацию текста. Поэтому мы анимируем абзацы на объектах, которые будут появляться один за другим (с задержкой в одну секунду):

  $presentation = new Presentation();
  try {
    # Добавляет текст и анимацию
    $autoShape = $presentation->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 210, 120, 300, 300);
    $para1 = new Paragraph();
    $para1->getPortions()->add(new Portion("Aspose Slides for Java"));
    $para2 = new Paragraph();
    $para2->getPortions()->add(new Portion("convert PowerPoint Presentation with text to video"));
    $para3 = new Paragraph();
    $para3->getPortions()->add(new Portion("paragraph by paragraph"));
    $paragraphCollection = $autoShape->getTextFrame()->getParagraphs();
    $paragraphCollection->add($para1);
    $paragraphCollection->add($para2);
    $paragraphCollection->add($para3);
    $paragraphCollection->add(new Paragraph());
    $mainSequence = $presentation->getSlides()->get_Item(0)->getTimeline()->getMainSequence();
    $effect1 = $mainSequence->addEffect($para1, EffectType::Appear, EffectSubType::None, EffectTriggerType::AfterPrevious);
    $effect2 = $mainSequence->addEffect($para2, EffectType::Appear, EffectSubType::None, EffectTriggerType::AfterPrevious);
    $effect3 = $mainSequence->addEffect($para3, EffectType::Appear, EffectSubType::None, EffectTriggerType::AfterPrevious);
    $effect4 = $mainSequence->addEffect($para3, EffectType::Appear, EffectSubType::None, EffectTriggerType::AfterPrevious);
    $effect1->getTiming()->setTriggerDelayTime(1.0);
    $effect2->getTiming()->setTriggerDelayTime(1.0);
    $effect3->getTiming()->setTriggerDelayTime(1.0);
    $effect4->getTiming()->setTriggerDelayTime(1.0);
    $fps = 33;

    class FrameTick {
      function invoke($sender, $arg) {
            try {
                $frame = sprintf("frame_%04d.png", $sender->getFrameIndex());
                $arguments->getFrame()->save($frame, ImageFormat::Png);
                $frames->add($frame);
                } catch (JavaException $e) {
                  }
             }
    }

    $frames = new Java("java.util.ArrayList");
    $animationsGenerator = new PresentationAnimationsGenerator($presentation);
    try {
      $player = new PresentationPlayer($animationsGenerator, $fps);
      try {
        $frameTick = java_closure(new FrameTick(), null, java("com.aspose.slides.PresentationPlayerFrameTick"));
        $player->setFrameTick($frameTick);
        $animationsGenerator->run($presentation->getSlides());
      } finally {
        if (!java_is_null($player)) {
          $player->dispose();
        }
      }
    } finally {
      if (!java_is_null($animationsGenerator)) {
        $animationsGenerator->dispose();
      }
    }
    # Настраивает папку бинарных файлов ffmpeg. См. эту страницу: https://github.com/rosenbjerg/FFMpegCore#installation
    $ffmpeg = new Java("net.bramp.ffmpeg.builder.FFmpeg", "path/to/ffmpeg");
    $ffprobe = new Java("net.bramp.ffmpeg.builder.FFprobe", "path/to/ffprobe");
    $builder = (new Java("net.bramp.ffmpeg.builder.FFmpegBuilder"))->addExtraArgs("-start_number", "1")->setInput("frame_%04d.png")->addOutput("output.avi")->setVideoFrameRate(FFmpeg->FPS_24)->setFormat("avi")->done();
    $executor = new Java("net.bramp.ffmpeg.builder.FFmpegExecutor", $ffmpeg, $ffprobe);
    $executor->createJob($builder)->run();
  } catch (JavaException $e) {
    $e->printStackTrace();
  }

Классы конвертации видео

Чтобы вы могли выполнять задачи по конвертации PowerPoint в видео, Aspose.Slides предоставляет классы PresentationAnimationsGenerator и PresentationPlayer.

Класс PresentationAnimationsGenerator позволяет задать размер кадра для будущего видео через конструктор. Если передать экземпляр презентации, будет использован Presentation.SlideSize, и он генерирует анимацию, которую использует PresentationPlayer.

При генерации анимаций создаётся событие NewAnimation для каждой последующей анимации, которое содержит параметр IPresentationAnimationPlayer. Этот параметр представляет класс, отвечающий за воспроизведение отдельной анимации.

Для работы с IPresentationAnimationPlayer используются свойство Duration (полная продолжительность анимации) и метод SetTimePosition. Каждая позиция задаётся в диапазоне от 0 до длительности, после чего метод GetFrame возвращает BufferedImage, соответствующее состоянию анимации в данный момент:

use aspose\slides\Presentation;
use aspose\slides\PresentationPlayer;
use aspose\slides\PresentationAnimationsGenerator;
use aspose\slides\ImageFormat;
use aspose\slides\ShapeType;
use aspose\slides\EffectType;
use aspose\slides\EffectSubtype;
use aspose\slides\EffectTriggerType;
use aspose\slides\EffectPresetClassType;

class PresentationAnimationPlayer {
    function invoke($animationPlayer) {
        echo(sprintf("Animation total duration: %f", $animationPlayer->getDuration()));
        $animationPlayer->setTimePosition(0);// начальное состояние анимации
        try {
            # bitmap начального состояния анимации
            $animationPlayer->getFrame()->save("firstFrame.png", ImageFormat::Png);
        } catch (JavaException $e) {
        }
        $animationPlayer->setTimePosition($animationPlayer->getDuration());// конечное состояние анимации
        try {
            # последний кадр анимации
            $animationPlayer->getFrame()->save("lastFrame.png", ImageFormat::Png);
        } catch (JavaException $e) {
        }
    }
}
$presentation = new Presentation();
try {
    # Добавляет форму улыбки и анимирует её
    $smile = $presentation->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::SmileyFace, 110, 20, 500, 500);
    $mainSequence = $presentation->getSlides()->get_Item(0)->getTimeline()->getMainSequence();
    $effectIn = $mainSequence->addEffect($smile, EffectType::Fly, EffectSubtype::TopLeft, EffectTriggerType::AfterPrevious);
    $effectOut = $mainSequence->addEffect($smile, EffectType::Fly, EffectSubtype::BottomRight, EffectTriggerType::AfterPrevious);
    $effectIn->getTiming()->setDuration(2.0);
    $effectOut->setPresetClassType(EffectPresetClassType::Exit);
    $animationsGenerator = new PresentationAnimationsGenerator($presentation);
    $presentationAnimation=java_closure(new PresentationAnimationPlayer(), null, java("com.aspose.slides.PresentationAnimationsGeneratorNewAnimation"));
    try {
        $animationsGenerator->setNewAnimation($presentationAnimation);
    } finally {
        if (!java_is_null($animationsGenerator)) {
            $animationsGenerator->dispose();
        }
    }
} finally {
    if (!java_is_null($presentation)) {
        $presentation->dispose();
    }
}

Чтобы все анимации в презентации воспроизводились одновременно, используется класс PresentationPlayer. Этот класс принимает экземпляр PresentationAnimationsGenerator и FPS для эффектов в конструкторе, а затем вызывает событие FrameTick для всех анимаций, чтобы они были воспроизведены:


class FrameTick {
      function invoke($sender, $arg) {
            try {
                $arguments->getFrame()->save("frame_" . $sender->getFrameIndex() . ".png", ImageFormat::Png);
                } catch (JavaException $e) {
                  }
             }
    }

  $presentation = new Presentation("animated.pptx");
  try {
    $animationsGenerator = new PresentationAnimationsGenerator($presentation);
    try {
      $player = new PresentationPlayer($animationsGenerator, 33);
      try {
        $frameTick = java_closure(new FrameTick(), null, java("com.aspose.slides.PresentationPlayerFrameTick"));
        $player->setFrameTick($frameTick);
        $animationsGenerator->run($presentation->getSlides());
      } finally {
        if (!java_is_null($player)) {
          $player->dispose();
        }
      }
    } finally {
      if (!java_is_null($animationsGenerator)) {
        $animationsGenerator->dispose();
      }
    }
  } finally {
    if (!java_is_null($presentation)) {
      $presentation->dispose();
    }
  }

Затем сгенерированные кадры можно собрать в видеоролик. См. раздел Convert PowerPoint to Video.

Поддерживаемые анимации и эффекты

Entrance:

Тип анимации Aspose.Slides PowerPoint
Appear не поддерживается поддерживается
Fade поддерживается поддерживается
Fly In поддерживается поддерживается
Float In поддерживается поддерживается
Split поддерживается поддерживается
Wipe поддерживается поддерживается
Shape поддерживается поддерживается
Wheel поддерживается поддерживается
Random Bars поддерживается поддерживается
Grow & Turn не поддерживается поддерживается
Zoom поддерживается поддерживается
Swivel поддерживается поддерживается
Bounce поддерживается поддерживается

Emphasis:

Тип анимации Aspose.Slides PowerPoint
Pulse не поддерживается поддерживается
Color Pulse не поддерживается поддерживается
Teeter поддерживается поддерживается
Spin поддерживается поддерживается
Grow/Shrink не поддерживается поддерживается
Desaturate не поддерживается поддерживается
Darken не поддерживается поддерживается
Lighten не поддерживается поддерживается
Transparency не поддерживается поддерживается
Object Color не поддерживается поддерживается
Complementary Color не поддерживается поддерживается
Line Color не поддерживается поддерживается
Fill Color не поддерживается поддерживается

Exit:

Тип анимации Aspose.Slides PowerPoint
Disappear не поддерживается поддерживается
Fade поддерживается поддерживается
Fly Out поддерживается поддерживается
Float Out поддерживается поддерживается
Split поддерживается поддерживается
Wipe поддерживается поддерживается
Shape поддерживается поддерживается
Random Bars поддерживается поддерживается
Shrink & Turn не поддерживается поддерживается
Zoom поддерживается поддерживается
Swivel поддерживается поддерживается
Bounce поддерживается поддерживается

Motion Paths:

Тип анимации Aspose.Slides PowerPoint
Lines поддерживается поддерживается
Arcs поддерживается поддерживается
Turns поддерживается поддерживается
Shapes поддерживается поддерживается
Loops поддерживается поддерживается
Custom Path поддерживается поддерживается

FAQ

Можно ли конвертировать презентации, защищённые паролем?

Да, Aspose.Slides позволяет работать с презентациями, защищёнными паролем. При обработке таких файлов необходимо указать правильный пароль, чтобы библиотека могла получить доступ к содержимому презентации.

Поддерживает ли Aspose.Slides использование в облачных решениях?

Да, Aspose.Slides можно интегрировать в облачные приложения и сервисы. Библиотека разработана для работы в серверных окружениях, обеспечивая высокую производительность и масштабируемость при пакетной обработке файлов.

Есть ли ограничения по размеру презентаций при конвертации?

Aspose.Slides способна обрабатывать презентации практически любого размера. Однако при работе с очень большими файлами может потребоваться дополнительный объём системных ресурсов, и иногда рекомендуется оптимизировать презентацию для повышения производительности.