MSWMM(Windowsムービーメーカーのプロジェクトファイル)のファイルフォーマットが公開されていないように思えたので調べてみました。
一応、Windowsムービーメーカー6.0(Windows Vistaに同梱)で作ったファイルで調べました。
XML部分の抽出プログラム(C#)
XML部分はMovieMaker要素をルートとして、UTF-16の文字コードで記録されています。
メタデータと呼べるものかどうかは分かりませんが、とりあえずメタデータという名前で読み込んでます。
抽出したXMLの例(この動画の編集プロジェクトから抽出。131KB)
using System;
using System.IO;
using System.Text;
namespace MifuminLib
{
public class MSWMMReader
{
enum ReadState
{
BeforeXML,
HeadOfXML,
ReadingXML
};
public string Metadata { get; protected set; }
public MSWMMReader(string fileName)
{
Read(fileName);
}
private void Read(string fileName)
{
using (Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, 1024 * 1024))
{
Read(stream);
}
}
private void Read(Stream stream)
{
using (BinaryReader br = new BinaryReader(stream))
{
ReadState rs = ReadState.BeforeXML;
StringBuilder sb = new StringBuilder(1024 * 1024);
try
{
while (true)
{
short ch = br.ReadInt16();
switch (rs)
{
case ReadState.BeforeXML:
// メタデータ登場前
if (ch == '<')
{
// メタデータの始まりかもしれない
sb.Append((char)ch);
rs = ReadState.HeadOfXML;
}
break;
case ReadState.HeadOfXML:
// メタデータ候補登場
sb.Append((char)ch);
if ("<MovieMaker".StartsWith(sb.ToString(), StringComparison.CurrentCultureIgnoreCase))
{
if ("<MovieMaker".Equals(sb.ToString(), StringComparison.CurrentCultureIgnoreCase))
{
// メタデータであることが確定
rs = ReadState.ReadingXML;
}
}
else
{
// 実はメタデータではなかった
sb.Clear();
rs = ReadState.BeforeXML;
}
break;
case ReadState.ReadingXML:
// メタデータの内容
sb.Append((char)ch);
if (ch == '>' && sb.ToString().EndsWith("</MovieMaker>", StringComparison.CurrentCultureIgnoreCase))
{
// メタデータ終了
Metadata = sb.ToString();
return;
}
break;
default:
break;
}
}
}
catch (Exception) { }
}
}
}
}