Convertir les présentations PowerPoint en vidéo en C++

Vue d’ensemble

En convertissant votre présentation PowerPoint en vidéo, vous obtenez

  • Amélioration de l’accessibilité : Tous les appareils (indépendamment du système) sont fournis par défaut avec des lecteurs vidéo, contrairement aux applications d’ouverture de présentations, ce qui facilite l’ouverture ou la lecture des vidéos.
  • Portée accrue : Grâce aux vidéos, vous pouvez toucher un large public et leur fournir des informations qui pourraient autrement sembler fastidieuses dans une présentation. La plupart des enquêtes et statistiques indiquent que les gens regardent et consomment davantage les vidéos que les autres formes de contenu, et ils préfèrent généralement ce type de contenu.

Dans Aspose.Slides 22.11, nous avons ajouté la prise en charge de la conversion de présentations en vidéo.

  • Utilisez Aspose.Slides pour générer un ensemble de cadres (à partir des diapositives) correspondant à un certain FPS (images par seconde).
  • Utilisez un utilitaire tiers comme ffmpeg pour créer une vidéo à partir de ces cadres.

Convertir une présentation PowerPoint en vidéo

  1. Téléchargez ffmpeg ici.
  2. Ajoutez le chemin vers ffmpeg.exe à la variable d’environnement PATH.
  3. Exécutez le code de conversion PowerPoint → vidéo.

Ce code C++ montre comment convertir une présentation (contennant une figure et deux effets d’animation) en vidéo :

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);

    // Ajoute une forme souriante puis l'anime
    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();
}

Effets vidéo

Vous pouvez appliquer des animations aux objets des diapositives et utiliser des transitions entre les diapositives.

Les animations et les transitions rendent les diaporamas plus attrayants et intéressants — et il en va de même pour les vidéos. Ajoutons une diapositive supplémentaire et une transition au code de la présentation précédente :

// Ajoute une forme sourire et l'anime

// ...

// Ajoute une nouvelle diapositive et une transition animée

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 prend également en charge l’animation du texte. Nous animons ainsi les paragraphes sur des objets, qui apparaîtront les uns après les autres (avec un délai d’une seconde) :

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);

    // Ajoute du texte et des animations
    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);

    // Convertit les cadres en vidéo
    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();
}

Classes de conversion vidéo

Pour vous permettre d’effectuer des conversions PowerPoint → vidéo, Aspose.Slides fournit les classes PresentationAnimationsGenerator et PresentationPlayer.

PresentationAnimationsGenerator vous permet de définir la taille du cadre vidéo (qui sera créée ultérieurement) via son constructeur. Si vous transmettez une instance de présentation, Presentation.SlideSize sera utilisée et il génère les animations que PresentationPlayer exploite.

Lorsque les animations sont générées, un événement NewAnimation est déclenché pour chaque animation successive, contenant le paramètre IPresentationAnimationPlayer. Ce dernier représente un lecteur pour une animation individuelle.

Pour travailler avec IPresentationAnimationPlayer, on utilise la propriété get_Duration (durée totale de l’animation) et la méthode SetTimePosition. Chaque position d’animation est définie dans l’intervalle 0 à durée, puis la méthode GetFrame renvoie un Bitmap correspondant à l’état de l’animation à ce moment‑là.

void OnNewAnimation(System::SharedPtr<IPresentationAnimationPlayer> animationPlayer)
{
    System::Console::WriteLine(u"Total animation duration: {0}", animationPlayer->get_Duration());

    animationPlayer->SetTimePosition(0);
    // état initial de l'animation
    System::SharedPtr<System::Drawing::Bitmap> bitmap = animationPlayer->GetFrame();
    // bitmap de l'état initial de l'animation

    animationPlayer->SetTimePosition(animationPlayer->get_Duration());
    // état final de l'animation
    System::SharedPtr<System::Drawing::Bitmap> lastBitmap = animationPlayer->GetFrame();
    // dernière image de l'animation
    lastBitmap->Save(u"last.png");
}

void Run()
{
    auto presentation = System::MakeObject<Presentation>();
    auto slide = presentation->get_Slide(0);

    // Ajoute une forme sourire et l'anime
    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;
}

Pour faire jouer toutes les animations d’une présentation simultanément, on utilise la classe PresentationPlayer. Cette classe reçoit une instance de PresentationAnimationsGenerator et le FPS des effets dans son constructeur, puis déclenche l’événement FrameTick pour toutes les animations afin de les lire :

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());
}

Ensuite, les cadres générés peuvent être assemblés pour produire une vidéo. Voir la section Convert PowerPoint to Video.

Animations et effets pris en charge

Entrée :

Type d’animation Aspose.Slides PowerPoint
Apparaître not supported supported
Fondu supported supported
Vol entrant supported supported
Flottement entrant supported supported
Division supported supported
Effacement supported supported
Forme supported supported
Roue supported supported
Barres aléatoires supported supported
Croître et tourner not supported supported
Zoom supported supported
Pivot supported supported
Rebond supported supported

Accentuation :

Type d’animation Aspose.Slides PowerPoint
Impulsion not supported supported
Impulsion de couleur not supported supported
Oscillation supported supported
Rotation supported supported
Agrandir/Rétrécir not supported supported
Désaturation not supported supported
Assombrir not supported supported
Éclaircir not supported supported
Transparence not supported supported
Couleur de l’objet not supported supported
Couleur complémentaire not supported supported
Couleur de ligne not supported supported
Couleur de remplissage not supported supported

Sortie :

Type d’animation Aspose.Slides PowerPoint
Disparaître not supported supported
Fondu supported supported
Vol sortant supported supported
Flottement sortant supported supported
Division supported supported
Effacement supported supported
Forme supported supported
Barres aléatoires supported supported
Rétrécir et tourner not supported supported
Zoom supported supported
Pivot supported supported
Rebond supported supported

Chemins de mouvement :

Type d’animation Aspose.Slides PowerPoint
Lignes supported supported
Arcs supported supported
Virages supported supported
Formes supported supported
Boucles supported supported
Chemin personnalisé supported supported

FAQ

Est‑il possible de convertir des présentations protégées par mot de passe ?

Oui, Aspose.Slides permet de travailler avec des présentations protégées par mot de passe. Lors du traitement de ces fichiers, vous devez fournir le mot de passe correct afin que la bibliothèque puisse accéder au contenu de la présentation.

Aspose.Slides prend‑il en charge une utilisation dans des solutions cloud ?

Oui, Aspose.Slides peut être intégré aux applications et services cloud. La bibliothèque est conçue pour fonctionner dans des environnements serveur, garantissant haute performance et évolutivité pour le traitement par lots de fichiers.

Existe‑t‑il des limitations de taille pour les présentations lors de la conversion ?

Aspose.Slides peut gérer des présentations de taille pratiquement illimitée. Cependant, avec des fichiers très volumineux, des ressources système supplémentaires peuvent être nécessaires et il est parfois recommandé d’optimiser la présentation afin d’améliorer les performances.