使用 C++ 管理演示文稿中的音频
创建音频帧
Aspose.Slides for C++ 允许您向幻灯片添加音频文件。这些音频文件以音频帧的形式嵌入到幻灯片中。
- 创建 Presentation 类的实例。
- 通过索引获取幻灯片的引用。
- 加载您希望嵌入到幻灯片中的音频文件流。
- 将嵌入的音频帧(包含音频文件)添加到幻灯片中。
- 设置 PlayMode 和由 IAudioFrame 对象公开的
Volume。 - 保存修改后的演示文稿。
以下 C++ 代码演示如何向幻灯片添加嵌入的音频帧:
// 实例化一个表示演示文稿文件的 Presentation 类
auto pres = System::MakeObject<Presentation>();
// 获取第一张幻灯片
auto sld = pres->get_Slides()->idx_get(0);
// 加载 wav 音频文件到流
auto fstr = System::MakeObject<FileStream>(u"sampleaudio.wav", FileMode::Open, FileAccess::Read);
// 添加音频帧
auto audioFrame = sld->get_Shapes()->AddAudioFrameEmbedded(50.0f, 150.0f, 100.0f, 100.0f, fstr);
// 设置音频的播放模式和音量
audioFrame->set_PlayMode(AudioPlayModePreset::Auto);
audioFrame->set_Volume(AudioVolumeMode::Loud);
// 将 PowerPoint 文件写入磁盘
pres->Save(u"AudioFrameEmbed_out.pptx", SaveFormat::Pptx);
更改音频帧缩略图
当您向演示文稿添加音频文件时,音频会以带有标准默认图像的帧形式显示(请参阅下节中的图像)。您可以更改音频帧的缩略图(设置您喜欢的图像)。
以下 C++ 代码演示如何更改音频帧的缩略图或预览图像:
auto presentation = System::MakeObject<Presentation>();
auto slide = presentation->get_Slides()->idx_get(0);
// 向幻灯片添加音频帧,并指定位置和大小。
auto audioStream = System::MakeObject<System::IO::FileStream>(u"sample2.mp3",
System::IO::FileMode::Open, System::IO::FileAccess::Read);
auto audioFrame = slide->get_Shapes()->AddAudioFrameEmbedded(150.0f, 100.0f, 50.0f, 50.0f, audioStream);
// 向演示文稿资源添加图像。
auto imageStream = System::IO::File::OpenRead(u"eagle.jpeg");
auto audioImage = presentation->get_Images()->AddImage(imageStream);
// 为音频帧设置图像。
audioFrame->get_PictureFormat()->get_Picture()->set_Image(audioImage); // <-----
// 将修改后的演示文稿保存到磁盘
presentation->Save(u"example_out.pptx", Aspose::Slides::Export::SaveFormat::Pptx);
更改音频播放选项
Aspose.Slides for C++ 允许您更改控制音频播放或属性的选项。例如,您可以调整音频的音量、将音频设为循环播放,甚至隐藏音频图标。
Microsoft PowerPoint 中的 音频选项 窗格:

与 Aspose.Slides AudioFrame 方法对应的 PowerPoint 音频选项:
- 开始 下拉列表对应 AudioFrame::set_PlayMode 方法
- 音量 对应 AudioFrame::set_Volume 方法
- 跨幻灯片播放 对应 AudioFrame::set_PlayAcrossSlides 方法
- 循环直到停止 对应 AudioFrame::set_PlayLoopMode 方法
- 演示时隐藏 对应 AudioFrame::set_HideAtShowing 方法
- 播放后倒带 对应 AudioFrame::set_RewindAudio 方法
PowerPoint 编辑 选项对应 Aspose.Slides AudioFrame 的属性:
- 淡入 对应 AudioFrame.set_FadeInDuration 方法
- 淡出 对应 AudioFrame.set_FadeOutDuration 方法
- 裁剪音频开始时间 对应 AudioFrame.set_TrimFromStart 方法
- 裁剪音频结束时间 的值等于音频时长减去 AudioFrame.set_TrimFromEnd 方法的值
PowerPoint 音频控制面板上的 音量控制 对应 AudioFrame.set_VolumeValue 方法。它允许您以百分比方式更改音频音量。
以下是更改音频播放选项的方法:
- 创建 或获取音频帧。
- 为您想要调整的音频帧属性设置新值。
- 保存修改后的 PowerPoint 文件。
以下 C++ 代码演示如何调整音频选项的操作:
auto pres = System::MakeObject<Presentation>(u"AudioFrameEmbed_out.pptx");
// 获取一个形状
auto shape = pres->get_Slides()->idx_get(0)->get_Shapes()->idx_get(0);
// 将形状转换为 AudioFrame 形状
auto audioFrame = System::ExplicitCast<AudioFrame>(shape);
// 将播放模式设置为单击播放
audioFrame->set_PlayMode(AudioPlayModePreset::OnClick);
// 将音量设置为低
audioFrame->set_Volume(AudioVolumeMode::Low);
// 设置音频跨幻灯片播放
audioFrame->set_PlayAcrossSlides(true);
// 禁用音频循环
audioFrame->set_PlayLoopMode(false);
// 在放映期间隐藏 AudioFrame
audioFrame->set_HideAtShowing(true);
// 播放后将音频倒带至开始
audioFrame->set_RewindAudio(true);
// 将 PowerPoint 文件保存到磁盘
pres->Save(u"AudioFrameEmbed_changed.pptx", SaveFormat::Pptx);
以下 C++ 示例展示如何添加带嵌入音频的新音频帧、对其进行裁剪并设置淡入淡出时长:
auto pres = MakeObject<Presentation>();
auto slide = pres->get_Slide(0);
auto audioData = File::ReadAllBytes(u"sampleaudio.mp3");
auto audio = pres->get_Audios()->AddAudio(audioData);
auto audioFrame = slide->get_Shapes()->AddAudioFrameEmbedded(50, 50, 100, 100, audio);
// Sets the trimming start offset to 1.5 seconds
audioFrame->set_TrimFromStart(1500);
// Sets the trimming end offset to 2 seconds
audioFrame->set_TrimFromEnd(2000);
// Sets the fade-in duration to 200 ms
audioFrame->set_FadeInDuration(200);
// Sets the fade-out duration to 500 ms
audioFrame->set_FadeOutDuration(500);
pres->Save(u"AudioFrameTrimFade_out.pptx", SaveFormat::Pptx);
pres->Dispose();
以下代码示例展示如何检索带嵌入音频的音频帧并将其音量设置为 85%:
auto pres = MakeObject<Presentation>(u"AudioFrameEmbed_out.pptx");
// 获取音频帧形状
auto audioFrame = ExplicitCast<IAudioFrame>(pres->get_Slide(0)->get_Shape(0));
// 将音频音量设置为 85%
audioFrame->set_VolumeValue(85);
pres->Save(u"AudioFrameValue_out.pptx", SaveFormat::Pptx);
pres->Dispose();
管理音频字幕
Aspose.Slides 允许您通过 get_CaptionTracks 方法向音频帧添加闭合字幕。此方法返回一个 ICaptionsCollection,您可以使用它添加 WebVTT 字幕轨道、遍历现有轨道,并在需要时将其移除。
添加音频字幕
使用 get_CaptionTracks 方法将一个或多个字幕轨道附加到音频帧。以下示例中,先向幻灯片添加音频文件,然后从 .vtt 文件加载新的字幕轨道。
auto presentation = MakeObject<Presentation>();
auto audioData = File::ReadAllBytes(u"audio.mp3");
auto audio = presentation->get_Audios()->AddAudio(audioData);
auto slide = presentation->get_Slide(0);
auto audioFrame = slide->get_Shapes()->AddAudioFrameEmbedded(10, 10, 50, 50, audio);
// Add a new caption track from a WebVTT file.
audioFrame->get_CaptionTracks()->Add(u"New track", u"track.vtt");
presentation->Save(u"audio_with_captions.pptx", SaveFormat::Pptx);
presentation->Dispose();
提取音频字幕
您可以遍历与音频帧关联的字幕轨道并将其保存为 .vtt 文件。每个字幕轨道都暴露其二进制数据和唯一标识符,可在导出字幕时使用。
auto presentation = MakeObject<Presentation>(u"audio_with_captions.pptx");
auto slide = presentation->get_Slide(0);
for (auto&& shape : slide->get_Shapes())
{
if (ObjectExt::Is<IAudioFrame>(shape))
{
auto audioFrame = ExplicitCast<IAudioFrame>(shape);
for (auto&& captionTrack : audioFrame->get_CaptionTracks())
{
// 将每个字幕轨道保存为 .vtt 文件。
auto fileName = captionTrack->get_CaptionId().ToString() + u".vtt";
File::WriteAllBytes(fileName, captionTrack->get_BinaryData());
}
}
}
presentation->Dispose();
移除音频字幕
要从音频帧中移除字幕,请使用 ICaptionsCollection 提供的方法,例如 Clear、Remove 或 RemoveAt。下面的示例移除音频帧中的所有字幕轨道。
auto presentation = MakeObject<Presentation>(u"audio_with_captions.pptx");
auto slide = presentation->get_Slide(0);
auto audioFrame = ExplicitCast<IAudioFrame>(slide->get_Shape(0));
// 删除音频帧中的所有字幕轨道。
audioFrame->get_CaptionTracks()->Clear();
presentation->Save(u"audio_without_captions.pptx", SaveFormat::Pptx);
presentation->Dispose();
提取音频
Aspose.Slides 允许您提取幻灯片放映转场使用的声音。例如,您可以提取特定幻灯片使用的声音。
- 创建 Presentation 类的实例并加载包含音频的演示文稿。
- 通过索引获取相关幻灯片的引用。
- 访问该幻灯片的放映转场。
- 提取音频的字节数据。
以下 C++ 代码演示如何提取幻灯片中使用的音频:
String presName = u"AudioSlide.pptx";
// 实例化一个表示演示文稿文件的 Presentation 类
auto pres = System::MakeObject<Presentation>(presName);
// 访问所需的幻灯片
auto slide = pres->get_Slides()->idx_get(0);
// 获取幻灯片的放映过渡效果
auto transition = slide->get_SlideShowTransition();
// 将声音提取为字节数组
auto audio = transition->get_Sound()->get_BinaryData();
Console::WriteLine(String(u"Length: ") + audio->get_Length());
常见问题
我可以在多个幻灯片中复用同一音频资源而不会增大文件大小吗?
可以。将音频一次性添加到演示文稿的共享 audio collection 中,然后创建引用该资产的其他音频帧。这样可避免媒体数据重复,保持演示文稿大小受控。
我可以在不重新创建形状的情况下替换现有音频帧中的声音吗?
可以。对于链接的声音,更新 link path 以指向新文件。对于嵌入的声音,将 embedded audio 对象替换为演示文稿的另一个 audio collection 中的音频。帧的格式和大多数播放设置保持不变。
裁剪会改变演示文稿中存储的底层音频数据吗?
不会。裁剪仅调整播放范围。原始音频字节保持不变,可通过嵌入音频或演示文稿的音频集合访问。