ビデオの関係は、SlidePartのExternalReleationshipsコレクションに保存されます。
Powerpointは、次の方法でビデオ(外部ファイル)をプレゼンテーションに埋め込みます(簡略化)。
- ビデオを含むスライドの
Video
ap:timing(class)タグ内にap :video(class)タグを作成します。Timing
p:videoタグには、p:cMediaNode(クラスCommonMediaNode
)という子が含まれています。
p:cMediaNodeには、p:tgtEl(クラスTargetElement
)という子が含まれています。
ShapeTarget
この場合も、p:cMediaNodeには、ビデオに関連付けられた画像形状のIDを指すp:spTgt(クラス)という子が含まれています。図形のIDがNonVisualDrawingProperties
Id
メンバーに保存されます。したがって、ビデオはこれらのIDを介して画像の形状に接続されます。
さらに、画像の形状には、a:videoFile(クラスVideoFromFile
)という子が含まれています。クラスVideoFromFileにはLink
、外部関係のIDを指すというメンバーがあります。
OpenXMLSDK2.0生産性向上ツールをダウンロードすることを強くお勧めします。このツールを使用すると、プレゼンテーションファイルの生成されたXMLを検査できます。
次のコードは、特定のプレゼンテーションのすべてのスライドのすべてのビデオを列挙します。ビデオごとに、外部ファイルへのURIが印刷されます。これは、特定の動画に関連する外部の関係を見つけることによって行われます。
using (var doc = PresentationDocument.Open("c:\\temp\\presentation.pptx", false))
{
var presentation = doc.PresentationPart.Presentation;
foreach (SlideId slideId in presentation.SlideIdList)
{
SlidePart slidePart = doc.PresentationPart.GetPartById(slideId.RelationshipId) as SlidePart;
if (slidePart == null || slidePart.Slide == null)
{
continue;
}
Slide slide = slidePart.Slide;
var videos = slide.Descendants<Video>();
Console.Out.WriteLine("Found videos for slide ID: {0}", slideId.Id);
foreach (Video video in videos)
{
ShapeTarget shapeTarget = video.Descendants<ShapeTarget>().FirstOrDefault();
Console.Out.WriteLine("ShapeTargetId = {0}", shapeTarget.ShapeId);
var videoFromFile = slide.CommonSlideData.ShapeTree.Descendants<Picture>().
Where<Picture>(p => p.NonVisualPictureProperties.Descendants<NonVisualDrawingProperties>().FirstOrDefault().Id == shapeTarget.ShapeId).
FirstOrDefault().Descendants<VideoFromFile>().FirstOrDefault();
Console.Out.WriteLine("Releationship ID: {0}", videoFromFile.Link);
var externalReleationship =
slidePart.ExternalRelationships.Where(er => er.Id == videoFromFile.Link).FirstOrDefault();
if(externalReleationship == null) // Then it must be embedded
{
ReferenceRelationship rr = slidePart.GetReferenceRelationship(videoFromFile.Link);
if (rr != null)
{
Console.Out.WriteLine(rr.Uri.OriginalString);
}
}
else
{
Console.Out.WriteLine("Path to video file: {0}", externalReleationship.Uri.AbsolutePath);
}
}
}
}
もちろん、a:videoFile(クラスVideoFromFile
)タグを直接列挙することもできます。以下のコードを参照してください。
foreach (SlideId slideId in presentation.SlideIdList)
{
SlidePart slidePart = doc.PresentationPart.GetPartById(slideId.RelationshipId) as SlidePart;
if (slidePart == null || slidePart.Slide == null)
{
continue;
}
Slide slide = slidePart.Slide;
var videos = slide.CommonSlideData.ShapeTree.Descendants<VideoFromFile>();
foreach (VideoFromFile video in videos)
{
Console.Out.WriteLine("Releationship ID: {0}", video.Link);
var externalReleationship =
slidePart.ExternalRelationships.Where(er => er.Id == video.Link).FirstOrDefault();
if(externalReleationship == null)
{
ReferenceRelationship rr = slidePart.GetReferenceRelationship(videoFromFile.Link);
if (rr != null)
{
Console.Out.WriteLine(rr.Uri.OriginalString);
}
}
else
{
Console.Out.WriteLine("Path to video file: {0}", externalReleationship.Uri.AbsolutePath);
}
}
}