将 PowerPoint 转换为视频
通过将您的 PowerPoint 演示文稿转换为视频,您可以获得
- 提高可及性: 所有设备(无论平台如何)默认都配备视频播放器,而不是演示文稿打开应用程序,因此用户更容易打开或播放视频。
- 更广泛的覆盖: 通过视频,您可以接触到大型观众,并针对他们提供可能在演示中显得乏味的信息。大多数调查和统计数据表明,人们观看和消费视频的频率高于其他内容形式,并且通常更喜欢此类内容。
在 Aspose.Slides 中将 PowerPoint 转换为视频
在 Aspose.Slides 22.11 中,我们实现了支持演示文稿转视频的功能。
- 使用 Aspose.Slides 生成一组帧(来自演示文稿幻灯片),以对应特定的 FPS(每秒帧数)
- 使用第三方工具,如 FFMpegCore (ffmpeg),根据帧创建视频。
将 PowerPoint 转换为视频
- 使用 dotnet 添加包命令将 Aspose.Slides 和 FFMpegCore 库添加到您的项目中:
- 运行
dotnet add package Aspose.Slides.NET --version 22.11.0
- 运行
dotnet add package FFMpegCore --version 4.8.0
- 运行
- 在 这里 下载 ffmpeg。
- FFMpegCore 需要您指定下载的 ffmpeg 的路径(例如,解压到 “C:\tools\ffmpeg”):
GlobalFFOptions.Configure(new FFOptions { BinaryFolder = @"c:\tools\ffmpeg\bin",} );
- 运行将 PowerPoint 转换为视频的代码。
这个 C# 代码片段展示了如何将包含图像和两个动画效果的演示文稿转换为视频:
using System.Collections.Generic;
using Aspose.Slides;
using FFMpegCore; // 将使用我们之前提取到 "c:\tools\ffmpeg" 的 FFmpeg 二进制文件
using Aspose.Slides.Animation;
using (Presentation presentation = new Presentation())
{
// 添加一个笑脸形状并给它添加动画效果
IAutoShape smile = presentation.Slides[0].Shapes.AddAutoShape(ShapeType.SmileyFace, 110, 20, 500, 500);
IEffect effectIn = presentation.Slides[0].Timeline.MainSequence.AddEffect(smile, EffectType.Fly, EffectSubtype.TopLeft, EffectTriggerType.AfterPrevious);
IEffect effectOut = presentation.Slides[0].Timeline.MainSequence.AddEffect(smile, EffectType.Fly, EffectSubtype.BottomRight, EffectTriggerType.AfterPrevious);
effectIn.Timing.Duration = 2f;
effectOut.PresetClassType = EffectPresetClassType.Exit;
const int Fps = 33;
List<string> frames = new List<string>();
using (var animationsGenerator = new PresentationAnimationsGenerator(presentation))
using (var player = new PresentationPlayer(animationsGenerator, Fps))
{
player.FrameTick += (sender, args) =>
{
string frame = $"frame_{(sender.FrameIndex):D4}.png";
args.GetFrame().Save(frame);
frames.Add(frame);
};
animationsGenerator.Run(presentation.Slides);
}
// 配置 ffmpeg 二进制文件夹。请参阅此页面: https://github.com/rosenbjerg/FFMpegCore#installation
GlobalFFOptions.Configure(new FFOptions { BinaryFolder = @"c:\tools\ffmpeg\bin", });
// 将帧转换为 webm 视频
FFMpeg.JoinImageSequence("smile.webm", Fps, frames.Select(frame => ImageInfo.FromPath(frame)).ToArray());
}
视频效果
您可以对幻灯片上的对象应用动画并在幻灯片之间使用过渡。
动画和过渡使幻灯片放映更加引人入胜和有趣——它们对视频也有同样的效果。让我们为先前的演示文稿添加另一张幻灯片和过渡代码:
// 添加一个笑脸形状并给它添加动画效果
// ...
// 添加一张新的幻灯片并做动画过渡
ISlide newSlide = presentation.Slides.AddEmptySlide(presentation.Slides[0].LayoutSlide);
newSlide.Background.Type = BackgroundType.OwnBackground;
newSlide.Background.FillFormat.FillType = FillType.Solid;
newSlide.Background.FillFormat.SolidFillColor.Color = Color.Indigo;
newSlide.SlideShowTransition.Type = TransitionType.Push;
Aspose.Slides 还支持文本的动画。因此,我们对对象上的段落进行动画处理,使其逐个出现(延迟设置为一秒):
using System.Collections.Generic;
using Aspose.Slides.Export;
using Aspose.Slides;
using FFMpegCore;
using Aspose.Slides.Animation;
using (Presentation presentation = new Presentation())
{
// 添加文本和动画
IAutoShape autoShape = presentation.Slides[0].Shapes.AddAutoShape(ShapeType.Rectangle, 210, 120, 300, 300);
Paragraph para1 = new Paragraph();
para1.Portions.Add(new Portion("Aspose Slides for .NET"));
Paragraph para2 = new Paragraph();
para2.Portions.Add(new Portion("将 PowerPoint 演示文稿中的文本转换为视频"));
Paragraph para3 = new Paragraph();
para3.Portions.Add(new Portion("逐段出现"));
autoShape.TextFrame.Paragraphs.Add(para1);
autoShape.TextFrame.Paragraphs.Add(para2);
autoShape.TextFrame.Paragraphs.Add(para3);
autoShape.TextFrame.Paragraphs.Add(new Paragraph());
IEffect effect = presentation.Slides[0].Timeline.MainSequence.AddEffect(para1, EffectType.Appear, EffectSubtype.None, EffectTriggerType.AfterPrevious);
IEffect effect2 = presentation.Slides[0].Timeline.MainSequence.AddEffect(para2, EffectType.Appear, EffectSubtype.None, EffectTriggerType.AfterPrevious);
IEffect effect3 = presentation.Slides[0].Timeline.MainSequence.AddEffect(para3, EffectType.Appear, EffectSubtype.None, EffectTriggerType.AfterPrevious);
IEffect effect4 = presentation.Slides[0].Timeline.MainSequence.AddEffect(para3, EffectType.Appear, EffectSubtype.None, EffectTriggerType.AfterPrevious);
effect.Timing.TriggerDelayTime = 1f;
effect2.Timing.TriggerDelayTime = 1f;
effect3.Timing.TriggerDelayTime = 1f;
effect4.Timing.TriggerDelayTime = 1f;
// 将帧转换为视频
const int Fps = 33;
List<string> frames = new List<string>();
using (var animationsGenerator = new PresentationAnimationsGenerator(presentation))
using (var player = new PresentationPlayer(animationsGenerator, Fps))
{
player.FrameTick += (sender, args) =>
{
string frame = $"frame_{(sender.FrameIndex):D4}.png";
args.GetFrame().Save(frame);
frames.Add(frame);
};
animationsGenerator.Run(presentation.Slides);
}
// 配置 ffmpeg 二进制文件夹。请参阅此页面: https://github.com/rosenbjerg/FFMpegCore#installation
GlobalFFOptions.Configure(new FFOptions { BinaryFolder = @"c:\tools\ffmpeg\bin", });
// 将帧转换为 webm 视频
FFMpeg.JoinImageSequence("text_animation.webm", Fps, frames.Select(frame => ImageInfo.FromPath(frame)).ToArray());
}
视频转换类
为了使您能够执行 PowerPoint 转视频的转换任务,Aspose.Slides 提供了 PresentationAnimationsGenerator 和 PresentationPlayer 类。
PresentationAnimationsGenerator 允许您通过其构造函数设置后续生成的视频的帧大小。如果您传递演示文稿的实例,将使用 Presentation.SlideSize
,并生成 PresentationPlayer 使用的动画。
当动画生成时,将为每个随后的动画生成一个 NewAnimation
事件,其中包含 IPresentationAnimationPlayer 参数。后者是表示单个动画播放器的类。
要与 IPresentationAnimationPlayer 交互,将使用 Duration(动画的完整持续时间)属性和 SetTimePosition 方法。每个动画位置在 0 到持续时间 范围内设置,然后 GetFrame
方法将返回该时刻的动画状态对应的 Bitmap。
using (Presentation presentation = new Presentation())
{
// 添加一个笑脸形状并添加动画
IAutoShape smile = presentation.Slides[0].Shapes.AddAutoShape(ShapeType.SmileyFace, 110, 20, 500, 500);
IEffect effectIn = presentation.Slides[0].Timeline.MainSequence.AddEffect(smile, EffectType.Fly, EffectSubtype.TopLeft, EffectTriggerType.AfterPrevious);
IEffect effectOut = presentation.Slides[0].Timeline.MainSequence.AddEffect(smile, EffectType.Fly, EffectSubtype.BottomRight, EffectTriggerType.AfterPrevious);
effectIn.Timing.Duration = 2f;
effectOut.PresetClassType = EffectPresetClassType.Exit;
using (var animationsGenerator = new PresentationAnimationsGenerator(presentation))
{
animationsGenerator.NewAnimation += animationPlayer =>
{
Console.WriteLine($"动画总持续时间: {animationPlayer.Duration}");
animationPlayer.SetTimePosition(0); // 初始动画状态
Bitmap bitmap = animationPlayer.GetFrame(); // 初始动画状态位图
animationPlayer.SetTimePosition(animationPlayer.Duration); // 动画的最终状态
Bitmap lastBitmap = animationPlayer.GetFrame(); // 动画的最后一帧
lastBitmap.Save("last.png");
};
}
}
要使演示文稿中的所有动画同时播放,将使用 PresentationPlayer 类。该类在其构造函数中接受一个 PresentationAnimationsGenerator 实例和用于效果的 FPS,然后调用 FrameTick
事件以播放所有动画:
using (Presentation presentation = new Presentation("animated.pptx"))
{
using (var animationsGenerator = new PresentationAnimationsGenerator(presentation))
using (var player = new PresentationPlayer(animationsGenerator, 33))
{
player.FrameTick += (sender, args) =>
{
args.GetFrame().Save($"frame_{sender.FrameIndex}.png");
};
animationsGenerator.Run(presentation.Slides);
}
}
然后可以将生成的帧编译成视频。请参阅 将 PowerPoint 转换为视频 部分。
支持的动画和效果
进入:
动画类型 | Aspose.Slides | PowerPoint |
---|---|---|
出现 | ||
渐变 | ||
飞入 | ||
浮入 | ||
分裂 | ||
擦除 | ||
形状 | ||
轮子 | ||
随机条 | ||
放大并旋转 | ||
缩放 | ||
旋转 | ||
弹跳 |
强调:
动画类型 | Aspose.Slides | PowerPoint |
---|---|---|
脉动 | ||
颜色脉动 | ||
摇摆 | ||
旋转 | ||
放大/缩小 | ||
去饱和 | ||
变暗 | ||
变亮 | ||
透明度 | ||
对象颜色 | ||
互补色 | ||
线条颜色 | ||
填充颜色 |
退出:
动画类型 | Aspose.Slides | PowerPoint |
---|---|---|
消失 | ||
渐变 | ||
飞出 | ||
浮出 | ||
分裂 | ||
擦除 | ||
形状 | ||
随机条 | ||
缩小并旋转 | ||
缩放 | ||
旋转 | ||
弹跳 |
运动路径:
动画类型 | Aspose.Slides | PowerPoint |
---|---|---|
线条 | ||
弧 | ||
转弯 | ||
形状 | ||
循环 | ||
自定义路径 |
支持的幻灯片过渡效果
微妙:
动画类型 | Aspose.Slides | PowerPoint |
---|---|---|
变形 | ||
渐变 | ||
推送 | ||
拉动 | ||
擦除 | ||
分裂 | ||
揭示 | ||
随机条 | ||
形状 | ||
揭开 | ||
覆盖 | ||
闪烁 | ||
条纹 |
兴奋:
动画类型 | Aspose.Slides | PowerPoint |
---|---|---|
翻倒 | ||
披风 | ||
帘幕 | ||
风 | ||
声望 | ||
破裂 | ||
压碎 | ||
剥离 | ||
翻页 | ||
飞机 | ||
折纸 | ||
溶解 | ||
棋盘 | ||
百叶窗 | ||
时钟 | ||
波纹 | ||
蜂窝 | ||
闪光 | ||
漩涡 | ||
撕裂 | ||
切换 | ||
翻转 | ||
画廊 | ||
立方体 | ||
门 | ||
盒子 | ||
梳子 | ||
缩放 | ||
随机 |
动态内容:
动画类型 | Aspose.Slides | PowerPoint |
---|---|---|
平移 | ||
摩天轮 | ||
传送带 | ||
旋转 | ||
轨道 | ||
穿越 |