Verwalten von Video-Frames in Präsentationen mit C++
Einleitung
Videos können dabei helfen, Ideen zu erklären und ein Publikum zu fesseln. Aspose.Slides für C++ ermöglicht das Hinzufügen von Video‑Frames zu Folien, das Anpassen von Wiedergabeeinstellungen, die Verwaltung von Untertiteln und das Extrahieren eingebetteter Videodaten.
PowerPoint unterstützt lokale Videos und Links zu Online‑Videos, wie zum Beispiel YouTube‑Videos.
Um Videodaten und Video‑Frames darzustellen, stellt Aspose.Slides die Schnittstellen IVideo und IVideoFrame sowie weitere relevante Typen bereit.
Erstellen eines eingebetteten Video‑Frames
Wenn die Videodatei, die Sie zu Ihrer Folie hinzufügen möchten, lokal gespeichert ist, können Sie ein Video‑Frame erstellen, um das Video in Ihre Präsentation einzubetten.
Dieses Beispiel bettet ein lokales Video in die erste Folie einer vorhandenen Präsentation ein und speichert das Ergebnis. Die Koordinaten und Abmessungen des Frames sind in Punkt angegeben. Der Stream bleibt geöffnet, bis das Speichern abgeschlossen ist, weil LoadingStreamBehavior::KeepLocked ihn gesperrt hält, solange die Präsentation ihn verwendet.
#include <system/io/file.h>
#include <system/io/file_stream.h>
#include <DOM/Presentation.h>
#include <DOM/ISlide.h>
#include <DOM/IShapeCollection.h>
#include <DOM/IVideoCollection.h>
#include <Export/SaveFormat.h>
#include <LoadingStreamBehavior.h>
#include <system/smart_ptr.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
using namespace System::IO;
auto presentation = MakeObject<Presentation>(u"presentation.pptx");
auto slide = presentation->get_Slide(0);
auto videoStream = File::OpenRead(u"video.mp4");
auto video = presentation->get_Videos()->AddVideo(videoStream, LoadingStreamBehavior::KeepLocked);
slide->get_Shapes()->AddVideoFrame(10, 10, 150, 250, video);
presentation->Save(u"embedded_video.pptx", SaveFormat::Pptx);
presentation->Dispose();
videoStream->Dispose();
Sie können auch einen lokalen Videopfad direkt an AddVideoFrame übergeben. Dieses Beispiel bettet das Video in die erste Folie einer neuen Präsentation ein. Das Video muss bis zum Speichern der Präsentation zugänglich bleiben.
#include <DOM/Presentation.h>
#include <DOM/ISlide.h>
#include <DOM/IShapeCollection.h>
#include <Export/SaveFormat.h>
#include <system/smart_ptr.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
slide->get_Shapes()->AddVideoFrame(50, 150, 300, 150, u"video.avi");
presentation->Save(u"video_from_path.pptx", SaveFormat::Pptx);
presentation->Dispose();
Ein Video‑Frame mit Video aus einer Web‑Quelle erstellen
Microsoft PowerPoint unterstützt Online‑Videos in Präsentationen. Sie können ein Video‑Frame erstellen, das auf ein Online‑Video, etwa ein YouTube‑Video, verweist.
Dieses Beispiel fügt der ersten Folie einen YouTube‑Video‑Link und ein Vorschaubild hinzu. Ersetzen Sie die Video‑Kennung, um ein anderes Video zu verwenden. Die Methode set_PlayMode fordert die automatische Wiedergabe an. Das Herunterladen des Vorschaubildes und das Abspielen des Videos erfordern Internetzugriff. Der Präsentations‑Viewer muss ebenfalls die Online‑Videowiedergabe unterstützen.
#include <net/web_client.h>
#include <DOM/Presentation.h>
#include <DOM/ISlide.h>
#include <DOM/IShapeCollection.h>
#include <DOM/IVideoFrame.h>
#include <Export/SaveFormat.h>
#include <DOM/VideoPlayModePreset.h>
#include <DOM/IImageCollection.h>
#include <DOM/IPictureFillFormat.h>
#include <DOM/ISlidesPicture.h>
#include <system/smart_ptr.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto webClient = MakeObject<System::Net::WebClient>();
String videoId = u"aqz-KE-bpKQ";
auto videoUrl = String::Format(u"https://www.youtube.com/embed/{0}", videoId);
auto videoFrame = slide->get_Shapes()->AddVideoFrame(10, 10, 427, 240, videoUrl);
videoFrame->set_PlayMode(VideoPlayModePreset::Auto);
auto thumbnailUrl = String::Format(u"https://img.youtube.com/vi/{0}/hqdefault.jpg", videoId);
auto thumbnailData = webClient->DownloadData(thumbnailUrl);
auto thumbnail = presentation->get_Images()->AddImage(thumbnailData);
videoFrame->get_PictureFormat()->get_Picture()->set_Image(thumbnail);
presentation->Save(u"online_video.pptx", SaveFormat::Pptx);
presentation->Dispose();
Ein Video im Vollbildmodus abspielen
In einer Schulungspräsentation können Sie eine Software‑Demonstration im Vollbildmodus abspielen, damit das Publikum die Details sehen kann. set_FullScreenMode akzeptiert true, um dieses Verhalten während der Wiedergabe zu aktivieren.
Dieses Beispiel öffnet eine Präsentation, findet das erste IVideoFrame auf der ersten Folie und aktiviert die Vollbild‑Wiedergabe. Die Eingabepräsentation muss mindestens eine Folie mit einem bereits vorhandenen Video‑Frame auf der ersten Folie enthalten.
#include <DOM/Presentation.h>
#include <DOM/ISlide.h>
#include <DOM/IShapeCollection.h>
#include <DOM/IVideoFrame.h>
#include <Export/SaveFormat.h>
#include <system/enumerator_adapter.h>
#include <system/object_ext.h>
#include <system/smart_ptr.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = MakeObject<Presentation>(u"training.pptx");
auto slide = presentation->get_Slide(0);
for (auto&& shape : IterateOver(slide->get_Shapes()))
{
if (ObjectExt::Is<IVideoFrame>(shape))
{
auto videoFrame = ExplicitCast<IVideoFrame>(shape);
videoFrame->set_FullScreenMode(true);
break;
}
}
presentation->Save(u"full_screen_video.pptx", SaveFormat::Pptx);
presentation->Dispose();
Die Vollbild‑Wiedergabe steuert, wie das Video angezeigt wird. Unabhängig davon regelt set_PlayMode, ob es automatisch oder per Klick startet, und set_PlayLoopMode ob es wiederholt wird. Um das Startverhalten zu wählen, setzen Sie den Wiedergabemodus auf VideoPlayModePreset::Auto oder VideoPlayModePreset::OnClick. Das Beispiel behält die vorhandenen Start‑ und Schleife‑Einstellungen bei.
Ein Video nach der Wiedergabe zurückspulen
In einer Schulungspräsentation macht das Zurückspulen eines Demonstrationsvideos an den Anfang das Video wieder bereit für den Präsentierenden. Rufen Sie set_RewindVideo mit true auf, um das Video nach Abschluss der Wiedergabe an den Anfang zurückzusetzen.
Dieses Beispiel öffnet eine Präsentation, findet das erste IVideoFrame auf der ersten Folie und aktiviert das Zurückspulen. Es deaktiviert die Schleife, damit die Wiedergabe beendet werden kann, und setzt die Wiedergabe auf Start per Klick. Die Eingabepräsentation muss mindestens eine Folie mit einem bereits vorhandenen Video‑Frame auf der ersten Folie enthalten.
#include <DOM/Presentation.h>
#include <DOM/ISlide.h>
#include <DOM/IShapeCollection.h>
#include <DOM/IVideoFrame.h>
#include <Export/SaveFormat.h>
#include <system/enumerator_adapter.h>
#include <system/object_ext.h>
#include <DOM/VideoPlayModePreset.h>
#include <system/smart_ptr.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = MakeObject<Presentation>(u"training.pptx");
auto slide = presentation->get_Slide(0);
for (auto&& shape : IterateOver(slide->get_Shapes()))
{
if (ObjectExt::Is<IVideoFrame>(shape))
{
auto videoFrame = ExplicitCast<IVideoFrame>(shape);
videoFrame->set_RewindVideo(true);
videoFrame->set_PlayLoopMode(false);
videoFrame->set_PlayMode(VideoPlayModePreset::OnClick);
break;
}
}
presentation->Save(u"rewind_video.pptx", SaveFormat::Pptx);
presentation->Dispose();
Das Zurückspulen bringt das Video an den Anfang, ohne es erneut zu starten. Im Gegensatz dazu wiederholt das Aktivieren von set_PlayLoopMode die Wiedergabe automatisch. Deaktivieren Sie die Schleife, wenn das Video bis zum Ende laufen und anschließend bereit zum erneuten Abspielen sein soll. set_PlayMode steuert unabhängig davon den automatischen oder klickbasierten Start; dieses Beispiel verwendet VideoPlayModePreset::OnClick, damit der Präsentierende entscheidet, wann die Wiedergabe beginnt. Setzen Sie den Wiedergabemodus nach der Schleifeneinstellung, wie im Beispiel gezeigt. Das Zurückspulen funktioniert unabhängig von set_FullScreenMode.
Ein Video‑Frame trimmen
Verwenden Sie IVideoFrame::set_TrimFromStart und IVideoFrame::set_TrimFromEnd, um zu Beginn oder am Ende eines Videos während der Wiedergabe einen Teil zu überspringen. Beide Werte sind in Millisekunden angegeben. Das Trimmen ändert die Wiedergabe‑Einstellungen, ohne die eingebetteten Videodaten zu verändern.
Trim‑Einstellungen festlegen
Dieses Beispiel bettet ein lokales Video ein und überspringt während der Wiedergabe die ersten 2,5 Sekunden und die letzte Sekunde. Verwenden Sie ein Video, das länger als 3,5 Sekunden ist, damit ein abspielbarer Abschnitt erhalten bleibt.
#include <DOM/Presentation.h>
#include <DOM/ISlide.h>
#include <DOM/IShapeCollection.h>
#include <DOM/IVideoCollection.h>
#include <DOM/IVideoFrame.h>
#include <Export/SaveFormat.h>
#include <system/io/file.h>
#include <system/smart_ptr.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
using namespace System::IO;
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto videoData = File::ReadAllBytes(u"video.mp4");
auto video = presentation->get_Videos()->AddVideo(videoData);
auto videoFrame = slide->get_Shapes()->AddVideoFrame(50, 50, 640, 360, video);
videoFrame->set_TrimFromStart(2500.0f);
videoFrame->set_TrimFromEnd(1000.0f);
presentation->Save(u"video_with_trim.pptx", SaveFormat::Pptx);
presentation->Dispose();
Trim‑Einstellungen auslesen
Dieses Beispiel gibt die Trim‑Werte des ersten Video‑Frames auf der ersten Folie in Millisekunden aus. Die Präsentation muss mindestens eine Folie enthalten. Hat diese Folie keinen Video‑Frame, wird nichts ausgegeben. Das vorherige Beispiel liefert Werte von 2500 und 1000.
#include <DOM/Presentation.h>
#include <DOM/ISlide.h>
#include <DOM/IShapeCollection.h>
#include <DOM/IVideoFrame.h>
#include <system/enumerator_adapter.h>
#include <system/object_ext.h>
#include <system/console.h>
#include <system/smart_ptr.h>
using namespace Aspose::Slides;
using namespace System;
auto presentation = MakeObject<Presentation>(u"video_with_trim.pptx");
auto slide = presentation->get_Slide(0);
for (auto&& shape : IterateOver(slide->get_Shapes()))
{
if (ObjectExt::Is<IVideoFrame>(shape))
{
auto videoFrame = ExplicitCast<IVideoFrame>(shape);
Console::WriteLine(String::Format(u"Trim from start: {0} ms", videoFrame->get_TrimFromStart()));
Console::WriteLine(String::Format(u"Trim from end: {0} ms", videoFrame->get_TrimFromEnd()));
break;
}
}
presentation->Dispose();
Video‑Untertitel verwalten
Aspose.Slides ermöglicht die Verwaltung von Closed‑Captions für Video‑Frames in PowerPoint‑Präsentationen. Untertitel werden im WebVTT‑Format gespeichert und über die Methode IVideoFrame::get_CaptionTracks bereitgestellt.
Untertitel zu einem Video‑Frame hinzufügen
Dieses Beispiel bettet ein lokales Video ein und fügt eine WebVTT‑Untertitelspur mit der Bezeichnung English hinzu. Die Zeitstempel der Untertitel sollten mit dem Video übereinstimmen. Die gespeicherte Präsentation enthält sowohl das Video als auch dessen Untertitel.
#include <DOM/Presentation.h>
#include <DOM/ISlide.h>
#include <DOM/IShapeCollection.h>
#include <DOM/IVideoCollection.h>
#include <DOM/IVideoFrame.h>
#include <Export/SaveFormat.h>
#include <system/io/file.h>
#include <DOM/ICaptionsCollection.h>
#include <system/smart_ptr.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
using namespace System::IO;
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto videoData = File::ReadAllBytes(u"video.mp4");
auto video = presentation->get_Videos()->AddVideo(videoData);
auto videoFrame = slide->get_Shapes()->AddVideoFrame(0, 0, 100, 100, video);
videoFrame->get_CaptionTracks()->Add(u"English", u"track.vtt");
presentation->Save(u"video_with_captions.pptx", SaveFormat::Pptx);
presentation->Dispose();
Die Schnittstelle ICaptionsCollection bietet zudem eine Überladung, mit der Sie Untertitel aus einem Stream hinzufügen können.
Untertitel aus einem Video‑Frame extrahieren
Dieses Beispiel speichert alle Untertitelspuren von Video‑Frames auf der ersten Folie als separate WebVTT‑Dateien. Fortlaufende Nummern sorgen dafür, dass die Ausgabedateien eindeutig bleiben. Die Konsole meldet die Anzahl der extrahierten Spuren. Die Präsentation muss mindestens eine Folie enthalten.
#include <DOM/Presentation.h>
#include <DOM/ISlide.h>
#include <DOM/IShapeCollection.h>
#include <DOM/IVideoFrame.h>
#include <system/io/file.h>
#include <system/enumerator_adapter.h>
#include <system/object_ext.h>
#include <system/console.h>
#include <DOM/ICaptionsCollection.h>
#include <DOM/ICaptions.h>
#include <system/smart_ptr.h>
using namespace Aspose::Slides;
using namespace System;
using namespace System::IO;
auto presentation = MakeObject<Presentation>(u"video_with_captions.pptx");
auto slide = presentation->get_Slide(0);
auto trackCount = 0;
for (auto&& shape : IterateOver(slide->get_Shapes()))
{
if (ObjectExt::Is<IVideoFrame>(shape))
{
auto videoFrame = ExplicitCast<IVideoFrame>(shape);
for (auto&& captionTrack : IterateOver(videoFrame->get_CaptionTracks()))
{
trackCount++;
auto outputPath = String::Format(u"captions_{0}.vtt", trackCount);
File::WriteAllBytes(outputPath, captionTrack->get_BinaryData());
}
}
}
Console::WriteLine(String::Format(u"Caption tracks extracted: {0}", trackCount));
presentation->Dispose();
Jedes ICaptions‑Objekt stellt die Untertitel‑Kennung, das Label, die Binärdaten und den Untertiteltext als UTF‑8‑Zeichenfolge bereit.
Untertitel von einem Video‑Frame entfernen
Dieses Beispiel entfernt alle Untertitel von dem Video‑Frame an der ersten Shape‑Position auf der ersten Folie und speichert das Ergebnis. Es wird angenommen, dass Folie und Shape existieren und dass das Shape ein Video‑Frame ist.
#include <DOM/Presentation.h>
#include <DOM/ISlide.h>
#include <DOM/IShapeCollection.h>
#include <DOM/IVideoFrame.h>
#include <Export/SaveFormat.h>
#include <DOM/ICaptionsCollection.h>
#include <system/smart_ptr.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = MakeObject<Presentation>(u"video_with_captions.pptx");
auto slide = presentation->get_Slide(0);
auto videoFrame = ExplicitCast<IVideoFrame>(slide->get_Shape(0));
videoFrame->get_CaptionTracks()->Clear();
presentation->Save(u"video_without_captions.pptx", SaveFormat::Pptx);
presentation->Dispose();
Wenn Sie nur eine Untertitelspur entfernen müssen, verwenden Sie die Methoden Remove oder RemoveAt anstelle von Clear.
Video aus einer Folie extrahieren
Neben dem Hinzufügen von Videos zu Folien ermöglicht Aspose.Slides das Extrahieren von in Präsentationen eingebetteten Videos.
Dieses Beispiel extrahiert eingebettete Videos von jeder Folie in separate nummerierte Binärdateien. Verknüpfte Videos werden übersprungen, da sie keine eingebetteten Daten besitzen. Die Konsole gibt den MIME‑Typ jedes Videos sowie die Gesamtzahl aus. Die Ausgabe verwendet die generische Erweiterung .bin; passen Sie sie bei Bedarf an den gemeldeten Medientyp an.
#include <DOM/Presentation.h>
#include <DOM/ISlide.h>
#include <DOM/IShapeCollection.h>
#include <DOM/IVideoFrame.h>
#include <DOM/ISlideCollection.h>
#include <DOM/IVideo.h>
#include <system/io/file.h>
#include <system/enumerator_adapter.h>
#include <system/object_ext.h>
#include <system/console.h>
#include <system/smart_ptr.h>
using namespace Aspose::Slides;
using namespace System;
using namespace System::IO;
auto presentation = MakeObject<Presentation>(u"presentation_with_videos.pptx");
auto videoCount = 0;
for (auto&& slide : IterateOver(presentation->get_Slides()))
{
for (auto&& shape : IterateOver(slide->get_Shapes()))
{
if (ObjectExt::Is<IVideoFrame>(shape))
{
auto videoFrame = ExplicitCast<IVideoFrame>(shape);
auto video = videoFrame->get_EmbeddedVideo();
if (video == nullptr)
{
Console::WriteLine(u"Skipped a linked video: no embedded data is available.");
continue;
}
videoCount++;
auto outputPath = String::Format(u"extracted_video_{0}.bin", videoCount);
File::WriteAllBytes(outputPath, video->get_BinaryData());
Console::WriteLine(String::Format(u"Video {0}: {1}", videoCount, video->get_ContentType()));
}
}
}
Console::WriteLine(String::Format(u"Embedded videos extracted: {0}", videoCount));
presentation->Dispose();
FAQ
Welche Video‑Wiedergabe‑Parameter können für ein Video‑Frame geändert werden?
Sie können den Wiedergabemodus (automatisch oder per Klick) und das Looping steuern. Diese Optionen stehen über die Methoden des VideoFrame‑Objekts zur Verfügung.
Hat das Hinzufügen eines Videos Einfluss auf die Größe der PPTX‑Datei?
Ja. Wenn Sie ein lokales Video einbetten, werden die Binärdaten in das Dokument aufgenommen, sodass die Größe der Präsentation proportional zur Dateigröße des Videos wächst. Verlinken Sie ein Online‑Video und fügen ein Vorschaubild hinzu, speichert die Präsentation lediglich den Link und das Vorschaubild, nicht das Videomaterial, sodass die Größensteigerung in der Regel geringer ist.
Kann ich das Video in einem bestehenden Video‑Frame ersetzen, ohne Position und Größe zu ändern?
Ja. Sie können den Video‑Inhalt innerhalb des Frames austauschen, während die Geometrie des Shapes erhalten bleibt; dies ist ein gängiges Szenario zum Aktualisieren von Medien in einem vorhandenen Layout.
Kann der Inhaltstyp (MIME) eines eingebetteten Videos ermittelt werden?
Ja. Ein eingebettetes Video besitzt einen Content‑Type, den Sie auslesen und beispielsweise beim Speichern auf die Festplatte nutzen können.