Konwertuj prezentacje PowerPoint na wideo w C++
Wprowadzenie
Konwertując prezentację PowerPoint na wideo, zyskujesz
- Zwiększenie dostępności: Wszystkie urządzenia (bez względu na platformę) mają domyślnie odtwarzacze wideo, w przeciwieństwie do aplikacji otwierających prezentacje, więc użytkownikom łatwiej jest otworzyć lub odtworzyć wideo.
- Większy zasięg: Dzięki wideo możesz dotrzeć do dużej publiczności i przedstawić informacje, które w tradycyjnej prezentacji mogą wydać się nużące. Większość badań i statystyk wskazuje, że ludzie częściej oglądają i konsumują wideo niż inne formy treści i zazwyczaj wolą właśnie taką formę.
W Aspose.Slides 22.11 wprowadziliśmy obsługę konwersji prezentacji na wideo.
- Użyj Aspose.Slides do wygenerowania zestawu klatek (z slajdów prezentacji) odpowiadających określonemu FPS (klatki na sekundę)
- Użyj zewnętrznego narzędzia, takiego jak
ffmpeg, aby stworzyć wideo na podstawie klatek.
Konwersja prezentacji PowerPoint na wideo
- Pobierz ffmpeg tutaj.
- Dodaj ścieżkę do
ffmpeg.exedo zmiennej środowiskowejPATH. - Uruchom kod konwertujący PowerPoint na wideo.
Poniższy kod C++ pokazuje, jak przekonwertować prezentację (z figurą i dwoma efektami animacji) na wideo:
void OnFrameTick(System::SharedPtr<PresentationPlayer> sender, System::SharedPtr<FrameTickEventArgs> args)
{
System::String fileName = System::String::Format(u"frame_{0}.png", sender->get_FrameIndex());
args->GetFrame()->Save(fileName);
}
void Run()
{
auto presentation = System::MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
// Dodaje kształt uśmiechu, a następnie animuje go
System::SharedPtr<IAutoShape> smile = slide->get_Shapes()->AddAutoShape(ShapeType::SmileyFace, 110.0f, 20.0f, 500.0f, 500.0f);
auto sequence = slide->get_Timeline()->get_MainSequence();
System::SharedPtr<IEffect> effectIn = sequence->AddEffect(smile, EffectType::Fly, EffectSubtype::TopLeft, EffectTriggerType::AfterPrevious);
System::SharedPtr<IEffect> effectOut = sequence->AddEffect(smile, EffectType::Fly, EffectSubtype::BottomRight, EffectTriggerType::AfterPrevious);
effectIn->get_Timing()->set_Duration(2.0f);
effectOut->set_PresetClassType(EffectPresetClassType::Exit);
const int32_t fps = 33;
auto animationsGenerator = System::MakeObject<PresentationAnimationsGenerator>(presentation);
auto player = System::MakeObject<PresentationPlayer>(animationsGenerator, fps);
player->FrameTick += OnFrameTick;
animationsGenerator->Run(presentation->get_Slides());
const System::String ffmpegParameters = System::String::Format(
u"-loglevel {0} -framerate {1} -i {2} -y -c:v {3} -pix_fmt {4} {5}",
u"warning", m_fps, "frame_%d.png", u"libx264", u"yuv420p", "video.mp4");
auto ffmpegProcess = System::Diagnostics::Process::Start(u"ffmpeg", ffmpegParameters);
ffmpegProcess->WaitForExit();
}
Efekty wideo
Możesz stosować animacje do obiektów na slajdach oraz przejścia między slajdami.
Animacje i przejścia czynią pokazy slajdów bardziej angażującymi i interesującymi — tak samo jest z wideo. Dodajmy kolejny slajd i przejście do kodu poprzedniej prezentacji:
// Dodaje kształt uśmiechu i animuje go
// ...
// Dodaje nowy slajd i animowane przejście
System::SharedPtr<ISlide> newSlide = presentation->get_Slides()->AddEmptySlide(presentation->get_Slide(0)->get_LayoutSlide());
System::SharedPtr<IBackground> slideBackground = newSlide->get_Background();
slideBackground->set_Type(BackgroundType::OwnBackground);
auto fillFormat = slideBackground->get_FillFormat();
fillFormat->set_FillType(FillType::Solid);
fillFormat->get_SolidFillColor()->set_Color(System::Drawing::Color::get_Indigo());
newSlide->get_SlideShowTransition()->set_Type(TransitionType::Push);
Aspose.Slides obsługuje również animację tekstu. Animujemy więc akapity na obiektach, które pojawią się kolejno (z opóźnieniem ustawionym na sekundę):
void OnFrameTick(System::SharedPtr<PresentationPlayer> sender, System::SharedPtr<FrameTickEventArgs> args)
{
System::String fileName = System::String::Format(u"frame_{0}.png", sender->get_FrameIndex());
args->GetFrame()->Save(fileName);
}
void Run()
{
auto presentation = System::MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
// Dodaje tekst i animacje
System::SharedPtr<IAutoShape> autoShape = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 210.0f, 120.0f, 300.0f, 300.0f);
System::SharedPtr<Paragraph> para1 = System::MakeObject<Paragraph>();
para1->get_Portions()->Add(System::MakeObject<Portion>(u"Aspose Slides for C++"));
System::SharedPtr<Paragraph> para2 = System::MakeObject<Paragraph>();
para2->get_Portions()->Add(System::MakeObject<Portion>(u"convert PowerPoint Presentation with text to video"));
System::SharedPtr<Paragraph> para3 = System::MakeObject<Paragraph>();
para3->get_Portions()->Add(System::MakeObject<Portion>(u"paragraph by paragraph"));
auto paragraphs = autoShape->get_TextFrame()->get_Paragraphs();
paragraphs->Add(para1);
paragraphs->Add(para2);
paragraphs->Add(para3);
paragraphs->Add(System::MakeObject<Paragraph>());
auto sequence = slide->get_Timeline()->get_MainSequence();
System::SharedPtr<IEffect> effect = sequence->AddEffect(para1, EffectType::Appear, EffectSubtype::None, EffectTriggerType::AfterPrevious);
System::SharedPtr<IEffect> effect2 = sequence->AddEffect(para2, EffectType::Appear, EffectSubtype::None, EffectTriggerType::AfterPrevious);
System::SharedPtr<IEffect> effect3 = sequence->AddEffect(para3, EffectType::Appear, EffectSubtype::None, EffectTriggerType::AfterPrevious);
System::SharedPtr<IEffect> effect4 = sequence->AddEffect(para3, EffectType::Appear, EffectSubtype::None, EffectTriggerType::AfterPrevious);
effect->get_Timing()->set_TriggerDelayTime(1.0f);
effect2->get_Timing()->set_TriggerDelayTime(1.0f);
effect3->get_Timing()->set_TriggerDelayTime(1.0f);
effect4->get_Timing()->set_TriggerDelayTime(1.0f);
// Konwertuje klatki na wideo
const int32_t fps = 33;
auto animationsGenerator = System::MakeObject<PresentationAnimationsGenerator>(presentation);
auto player = System::MakeObject<PresentationPlayer>(animationsGenerator, fps);
player->FrameTick += OnFrameTick;
animationsGenerator->Run(presentation->get_Slides());
const System::String ffmpegParameters = System::String::Format(
u"-loglevel {0} -framerate {1} -i {2} -y -c:v {3} -pix_fmt {4} {5}",
u"warning", m_fps, "frame_%d.png", u"libx264", u"yuv420p", "video.mp4");
auto ffmpegProcess = System::Diagnostics::Process::Start(u"ffmpeg", ffmpegParameters);
ffmpegProcess->WaitForExit();
}
Klasy konwersji wideo
Aby umożliwić konwersję PowerPoint na wideo, Aspose.Slides udostępnia klasy PresentationAnimationsGenerator oraz PresentationPlayer.
PresentationAnimationsGenerator pozwala ustawić rozmiar klatek wideo (które zostanie później utworzone) poprzez konstruktor. Jeśli przekażesz instancję prezentacji, zostanie użyty Presentation.SlideSize i zostaną wygenerowane animacje, które wykorzystuje PresentationPlayer.
Podczas generowania animacji dla każdej kolejnej animacji wywoływane jest zdarzenie NewAnimation z parametrem IPresentationAnimationPlayer. To ostatnia klasa reprezentująca odtwarzacz pojedynczej animacji.
Do pracy z IPresentationAnimationPlayer używa się właściwości get_Duration (pełny czas trwania animacji) oraz metody SetTimePosition. Każda pozycja animacji jest ustawiana w zakresie 0‑do‑czas trwania, a metoda GetFrame zwraca bitmapę odpowiadającą stanowi animacji w danym momencie.
void OnNewAnimation(System::SharedPtr<IPresentationAnimationPlayer> animationPlayer)
{
System::Console::WriteLine(u"Total animation duration: {0}", animationPlayer->get_Duration());
animationPlayer->SetTimePosition(0);
// początkowy stan animacji
System::SharedPtr<System::Drawing::Bitmap> bitmap = animationPlayer->GetFrame();
// bitmapa początkowego stanu animacji
animationPlayer->SetTimePosition(animationPlayer->get_Duration());
// ostateczny stan animacji
System::SharedPtr<System::Drawing::Bitmap> lastBitmap = animationPlayer->GetFrame();
// ostatnia klatka animacji
lastBitmap->Save(u"last.png");
}
void Run()
{
auto presentation = System::MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
// Dodaje kształt uśmiechu i animuje go
System::SharedPtr<IAutoShape> smile = slide->get_Shapes()->AddAutoShape(ShapeType::SmileyFace, 110.0f, 20.0f, 500.0f, 500.0f);
auto sequence = slide->get_Timeline()->get_MainSequence();
System::SharedPtr<IEffect> effectIn = sequence->AddEffect(smile, EffectType::Fly, EffectSubtype::TopLeft, EffectTriggerType::AfterPrevious);
System::SharedPtr<IEffect> effectOut = sequence->AddEffect(smile, EffectType::Fly, EffectSubtype::BottomRight, EffectTriggerType::AfterPrevious);
effectIn->get_Timing()->set_Duration(2.0f);
effectOut->set_PresetClassType(EffectPresetClassType::Exit);
auto animationsGenerator = System::MakeObject<PresentationAnimationsGenerator>(presentation);
animationsGenerator->NewAnimation += OnNewAnimation;
}
Aby wszystkie animacje w prezentacji odtwarzały się jednocześnie, używa się klasy PresentationPlayer. Klasa ta przyjmuje w konstruktorze instancję PresentationAnimationsGenerator oraz FPS dla efektów, a następnie wywołuje zdarzenie FrameTick dla wszystkich animacji, aby je odtworzyć:
void OnFrameTick(System::SharedPtr<PresentationPlayer> sender, System::SharedPtr<FrameTickEventArgs> args)
{
System::String fileName = System::String::Format(u"frame_{0}.png", sender->get_FrameIndex());
args->GetFrame()->Save(fileName);
}
void Run()
{
auto presentation = System::MakeObject<Presentation>(u"animated.pptx");
auto animationsGenerator = System::MakeObject<PresentationAnimationsGenerator>(presentation);
auto player = System::MakeObject<PresentationPlayer>(animationsGenerator, 33);
player->FrameTick += OnFrameTick;
animationsGenerator->Run(presentation->get_Slides());
}
Wygenerowane klatki można następnie złożyć w wideo. Zobacz sekcję Convert PowerPoint to Video.
Obsługiwane animacje i efekty
Wejście:
| Typ animacji | Aspose.Slides | PowerPoint |
|---|---|---|
| Pojawienie się | ![]() |
![]() |
| Zanikanie | ![]() |
![]() |
| Przelot | ![]() |
![]() |
| Unoszenie | ![]() |
![]() |
| Rozdzielenie | ![]() |
![]() |
| Zetrzycie | ![]() |
![]() |
| Kształt | ![]() |
![]() |
| Koło | ![]() |
![]() |
| Losowe paski | ![]() |
![]() |
| Rozrastaj i obróć | ![]() |
![]() |
| Zbliżenie | ![]() |
![]() |
| Obrót w miejscu | ![]() |
![]() |
| Odbicie | ![]() |
![]() |
Nacisk:
| Typ animacji | Aspose.Slides | PowerPoint |
|---|---|---|
| Pulsowanie | ![]() |
![]() |
| Pulsowanie koloru | ![]() |
![]() |
| Drżenie | ![]() |
![]() |
| Obrót | ![]() |
![]() |
| Rozrastaj/kurcz | ![]() |
![]() |
| Desaturacja | ![]() |
![]() |
| Przyciemnianie | ![]() |
![]() |
| Rozjaśnianie | ![]() |
![]() |
| Przezroczystość | ![]() |
![]() |
| Kolor obiektu | ![]() |
![]() |
| Kolor dopełniający | ![]() |
![]() |
| Kolor linii | ![]() |
![]() |
| Kolor wypełnienia | ![]() |
![]() |
Wyjście:
| Typ animacji | Aspose.Slides | PowerPoint |
|---|---|---|
| Zniknięcie | ![]() |
![]() |
| Zanikanie | ![]() |
![]() |
| Wylot | ![]() |
![]() |
| Unoszenie na zewnątrz | ![]() |
![]() |
| Rozdzielenie | ![]() |
![]() |
| Zetrzycie | ![]() |
![]() |
| Kształt | ![]() |
![]() |
| Losowe paski | ![]() |
![]() |
| Kurcz i obróć | ![]() |
![]() |
| Zbliżenie | ![]() |
![]() |
| Obrót w miejscu | ![]() |
![]() |
| Odbicie | ![]() |
![]() |
Ścieżki ruchu:
| Typ animacji | Aspose.Slides | PowerPoint |
|---|---|---|
| Linie | ![]() |
![]() |
| Łuki | ![]() |
![]() |
| Skręty | ![]() |
![]() |
| Kształty | ![]() |
![]() |
| Pętle | ![]() |
![]() |
| Ścieżka niestandardowa | ![]() |
![]() |
FAQ
Czy możliwe jest konwertowanie prezentacji chronionych hasłem?
Tak, Aspose.Slides umożliwia pracę z prezentacjami chronionymi hasłem. Podczas przetwarzania takich plików należy podać właściwe hasło, aby biblioteka mogła uzyskać dostęp do zawartości prezentacji.
Czy Aspose.Slides wspiera zastosowanie w rozwiązaniach chmurowych?
Tak, Aspose.Slides może być integrowany w aplikacjach i usługach chmurowych. Biblioteka jest zaprojektowana do pracy w środowiskach serwerowych, zapewniając wysoką wydajność i skalowalność przy przetwarzaniu plików wsadowo.
Czy istnieją ograniczenia rozmiaru prezentacji podczas konwersji?
Aspose.Slides radzi sobie z prezentacjami praktycznie każdego rozmiaru. Jednak przy bardzo dużych plikach mogą być potrzebne dodatkowe zasoby systemowe i czasami zaleca się optymalizację prezentacji w celu poprawy wydajności.

