Конвертация PowerPoint в видео
Преобразуя вашу презентацию PowerPoint в видео, вы получаете
- Увеличение доступности: Все устройства (независимо от платформы) по умолчанию оснащены видеоплеерами по сравнению с приложениями для открытия презентаций, поэтому пользователям проще открывать или воспроизводить видео.
- Больше охвата: С помощью видео вы можете достичь широкой аудитории и нацелить информацию, которая в противном случае могла бы показаться утомительной в презентации. Большинство опросов и статистики показывают, что люди смотрят и потребляют видео больше, чем другие формы контента, и они в целом предпочитают такой контент.
Конвертация PowerPoint в видео с помощью Aspose.Slides
В Aspose.Slides 22.11 мы реализовали поддержку конвертации презентаций в видео.
- Используйте Aspose.Slides для генерации набора кадров (из слайдов презентации), которые соответствуют определенному FPS (кадров в секунду)
- Используйте стороннюю утилиту, такую как ffmpeg (для Java), для создания видео на основе кадров.
Конвертация PowerPoint в видео
- Добавьте это в ваш POM файл:
<dependency>
<groupId>net.bramp.ffmpeg</groupId>
<artifactId>ffmpeg</artifactId>
<version>0.7.0</version>
</dependency>
```php
-
Скачайте ffmpeg здесь.
-
Запустите 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 для Java"));
$para2 = new Paragraph();
$para2->getPortions()->add(new Portion("конвертировать презентацию PowerPoint с текстом в видео"));
$para3 = new Paragraph();
$para3->getPortions()->add(new Portion("параграф за параграфом"));
$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("Общая продолжительность анимации: %f", $animationPlayer->getDuration()));
$animationPlayer->setTimePosition(0);// начальное состояние анимации
try {
# битмап начального состояния анимации
$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();
}
}
Сгенерированные кадры затем могут быть скомпилированы для создания видео. См. раздел Конвертация PowerPoint в видео.
Поддерживаемые анимации и эффекты
Вход:
Тип анимации | Aspose.Slides | PowerPoint |
---|---|---|
Появление | ||
Затухание | ||
Вход с полета | ||
Вход с параллели | ||
Разделение | ||
Стирание | ||
Форма | ||
Колесо | ||
Случайные полосы | ||
Увеличение и поворот | ||
Приближение | ||
Качание | ||
Удар |
Эмоция:
Тип анимации | Aspose.Slides | PowerPoint |
---|---|---|
Пульсация | ||
Цветовая пульсация | ||
Качание | ||
Вращение | ||
Увеличение/уменьшение | ||
Десатурация | ||
Темнение | ||
Освещение | ||
Прозрачность | ||
Цвет объекта | ||
Дополнительный цвет | ||
Цвет линии | ||
Цвет заполнения |
Выход:
Тип анимации | Aspose.Slides | PowerPoint |
---|---|---|
Исчезновение | ||
Затухание | ||
Выход с полета | ||
Выход с параллели | ||
Разделение | ||
Стирание | ||
Форма | ||
Случайные полосы | ||
Уменьшение и поворот | ||
Приближение | ||
Качание | ||
Удар |
Движущиеся пути:
Тип анимации | Aspose.Slides | PowerPoint |
---|---|---|
Линии | ||
Арки | ||
Повороты | ||
Формы | ||
Циклы | ||
Пользовательский путь |