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

  1. Pobierz ffmpeg tutaj.
  2. Dodaj ścieżkę do ffmpeg.exe do zmiennej środowiskowej PATH.
  3. 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ę nieobsługiwane obsługiwane
Zanikanie obsługiwane obsługiwane
Przelot obsługiwane obsługiwane
Unoszenie obsługiwane obsługiwane
Rozdzielenie obsługiwane obsługiwane
Zetrzycie obsługiwane obsługiwane
Kształt obsługiwane obsługiwane
Koło obsługiwane obsługiwane
Losowe paski obsługiwane obsługiwane
Rozrastaj i obróć nieobsługiwane obsługiwane
Zbliżenie obsługiwane obsługiwane
Obrót w miejscu obsługiwane obsługiwane
Odbicie obsługiwane obsługiwane

Nacisk:

Typ animacji Aspose.Slides PowerPoint
Pulsowanie nieobsługiwane obsługiwane
Pulsowanie koloru nieobsługiwane obsługiwane
Drżenie obsługiwane obsługiwane
Obrót obsługiwane obsługiwane
Rozrastaj/kurcz nieobsługiwane obsługiwane
Desaturacja nieobsługiwane obsługiwane
Przyciemnianie nieobsługiwane obsługiwane
Rozjaśnianie nieobsługiwane obsługiwane
Przezroczystość nieobsługiwane obsługiwane
Kolor obiektu nieobsługiwane obsługiwane
Kolor dopełniający nieobsługiwane obsługiwane
Kolor linii nieobsługiwane obsługiwane
Kolor wypełnienia nieobsługiwane obsługiwane

Wyjście:

Typ animacji Aspose.Slides PowerPoint
Zniknięcie nieobsługiwane obsługiwane
Zanikanie obsługiwane obsługiwane
Wylot obsługiwane obsługiwane
Unoszenie na zewnątrz obsługiwane obsługiwane
Rozdzielenie obsługiwane obsługiwane
Zetrzycie obsługiwane obsługiwane
Kształt obsługiwane obsługiwane
Losowe paski obsługiwane obsługiwane
Kurcz i obróć nieobsługiwane obsługiwane
Zbliżenie obsługiwane obsługiwane
Obrót w miejscu obsługiwane obsługiwane
Odbicie obsługiwane obsługiwane

Ścieżki ruchu:

Typ animacji Aspose.Slides PowerPoint
Linie obsługiwane obsługiwane
Łuki obsługiwane obsługiwane
Skręty obsługiwane obsługiwane
Kształty obsługiwane obsługiwane
Pętle obsługiwane obsługiwane
Ścieżka niestandardowa obsługiwane obsługiwane

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.