Hantera videoramar i presentationer med C++
Introduktion
Videor kan hjälpa till att förklara idéer och engagera en publik. Aspose.Slides för C++ låter dig lägga till videoramar i bilder, justera uppspelningsinställningar, hantera undertexter och extrahera inbäddade videodata.
PowerPoint stödjer lokala videor och länkar till online‑videor, såsom YouTube‑videor.
För att representera videodata och videoramar tillhandahåller Aspose.Slides gränssnitten IVideo , IVideoFrame , och andra relevanta typer.
Skapa en inbäddad videoram
Om videofilen du vill lägga till på din bild lagras lokalt kan du skapa en videoram för att bädda in videon i din presentation.
Detta exempel bäddar in en lokal video på den första bilden i en befintlig presentation och sparar resultatet. Ramens koordinater och dimensioner är i points. Strömmen förblir öppen tills sparandet är klart eftersom LoadingStreamBehavior::KeepLocked låser den medan presentationen använder den.
#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();
Du kan också skicka en lokal videoväg direkt till AddVideoFrame. Detta exempel bäddar in videon på den första bilden i en ny presentation. Videon måste förbli tillgänglig tills presentationen sparas.
#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();
Skapa en videoram med video från en webbkälla
Microsoft PowerPoint stödjer online‑videor i presentationer. Du kan skapa en videoram som länkar till en online‑video, till exempel en YouTube‑video.
Detta exempel lägger till en YouTube‑videolänk och miniatyrbild på den första bilden. Ersätt video‑identifieraren för att använda en annan video. Metoden set_PlayMode begär automatisk uppspelning. Nedladdning av miniatyrbilden och uppspelning av videon kräver internetåtkomst. Presentationsvisaren måste också stödja online‑uppspelning av video.
#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();
Spela upp en video i helskärmsläge
I en utbildningspresentation kan du spela upp en programdemonstration i helskärmsläge så publiken kan se detaljerna. set_FullScreenMode accepterar true för att aktivera detta beteende under uppspelning.
Detta exempel öppnar en presentation, hittar den första IVideoFrame på den första bilden och aktiverar helskärmsuppspelning. Indatapresentationen måste innehålla minst en bild med en befintlig videoram på den första bilden.
#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();
Helskärmsuppspelning styr hur videon visas. Oberoende styr set_PlayMode om den startar automatiskt eller vid klick, och set_PlayLoopMode om den upprepas. För att välja startbeteende, ställ in uppspelningsläget till VideoPlayModePreset::Auto or VideoPlayModePreset::OnClick. Exemplet bevarar de befintliga start- och loop‑inställningarna.
Spola tillbaka en video efter uppspelning
I en utbildningspresentation gör att återföra en demonstrationsvideo till början den redo för presentatören att spela upp igen. Anropa set_RewindVideo med true för att återföra videon till början efter att uppspelning avslutats.
Detta exempel öppnar en presentation, hittar den första IVideoFrame på den första bilden och aktiverar spolning tillbaka. Det inaktiverar loopning så att uppspelning kan avslutas och sätter uppspelning att starta vid klick. Indatapresentationen måste innehålla minst en bild med en befintlig videoram på den första bilden.
#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();
Spolning tillbaka för videon till början utan att starta den igen. I motsats till detta får aktivering av set_PlayLoopMode uppspelning att upprepas automatiskt. Håll loopning inaktiverad när du vill att videon ska avslutas och vara redo att spelas igen. set_PlayMode styr oberoende om uppspelning sker automatiskt eller vid klick; detta exempel använder VideoPlayModePreset::OnClick så presentatören kontrollerar när uppspelning startar. Ställ in uppspelningsläget efter loop‑inställningen, som visas i exemplet. Spolning tillbaka fungerar oberoende av set_FullScreenMode.
Trimma en videoram
Använd IVideoFrame::set_TrimFromStart och IVideoFrame::set_TrimFromEnd för att hoppa över en del i början eller slutet av en video under uppspelning. Båda värdena är i millisekunder. Trimning ändrar uppspelningsinställningarna utan att ändra den inbäddade videon.
Ställ in triminställningar
Detta exempel bäddar in en lokal video och hoppar över de första 2,5 sekunderna och den sista sekunden under uppspelning. Använd en video längre än 3,5 sekunder så att ett spelbart segment återstår.
#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();
Läs triminställningar
Detta exempel skriver ut trimvärdena för den första videoramen på den första bilden i millisekunder. Presentationen måste innehålla minst en bild. Om den bilden inte har någon videoram skrivs inget ut. Föregående exempel ger värdena 2500 och 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();
Hantera videoundertexter
Aspose.Slides låter dig hantera stängda undertexter för videoramar i PowerPoint-presentationer. Undertexter lagras i WebVTT-format och exponeras via metoden IVideoFrame::get_CaptionTracks .
Lägg till undertexter i en videoram
Detta exempel bäddar in en lokal video och lägger till ett WebVTT‑undertextspår med beteckningen English. Undertextens tidsstämplar bör matcha videon. Den sparade presentationen innehåller både video och dess undertexter.
#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();
Gränssnittet ICaptionsCollection erbjuder också en överlagring som låter dig lägga till undertexter från en ström.
Extrahera undertexter från en videoram
Detta exempel sparar alla undertextspår från videoramar på den första bilden som separata WebVTT‑filer. Sekventiella nummer håller utskriftsfilerna distinkta. Konsolen rapporterar antalet extraherade spår. Presentationen måste innehålla minst en bild.
#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();
Varje ICaptions‑objekt exponerar undertextens identifierare, etikett, binär data och undertextens text som en UTF‑8‑sträng.
Ta bort undertexter från en videoram
Detta exempel tar bort alla undertexter från videoramen på den första formens position på den första bilden och sparar resultatet. Det förutsätter att bilden och formen finns och att formen är en videoram.
#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();
Om du bara behöver ta bort ett undertextspår, använd metoderna Remove eller RemoveAt i stället för Clear .
Extrahera video från en bild
Förutom att lägga till videor på bilder låter Aspose.Slides dig extrahera videor som är inbäddade i presentationer.
Detta exempel extraherar inbäddade videor från varje bild till separata, numrerade binära filer. Länkade videor hoppas över eftersom de saknar inbäddad data. Konsolen skriver ut varje videos MIME‑typ och det totala antalet. Utdata använder den generiska filändelsen .bin; ändra den för att matcha den rapporterade mediatypen vid behov.
#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();
Vanliga frågor
Vilka videouppspelningsparametrar kan ändras för en videoram?
Du kan styra uppspelningsläget (auto eller vid klick) och loopning. Dessa alternativ är tillgängliga via objektets metoder i VideoFrame .
Påverkar tillägg av en video PPTX‑filens storlek?
Ja. När du bäddar in en lokal video inkluderas den binära data i dokumentet, så presentationens storlek ökar proportionellt mot filstorleken. När du länkar till en online‑video och lägger till en miniatyr sparar presentationen länken och förhandsbilden istället för videodata, så storleksökningen är vanligtvis mindre.
Kan jag ersätta videon i en befintlig videoram utan att ändra dess position och storlek?
Ja. Du kan byta ut video‑innehållet i ramen samtidigt som du bevarar formens geometri; detta är ett vanligt scenario för att uppdatera media i en befintlig layout.
Kan innehållstypen (MIME) för en inbäddad video bestämmas?
Ja. En inbäddad video har en innehållstyp som du kan läsa och använda, till exempel när du sparar den till disk.