【发布时间】:2016-03-06 01:20:46
【问题描述】:
我正在开发一个程序,该程序扫描放置文件夹中的文件,并将它们注册到另一个需要文件持续时间的系统。到目前为止我能找到的最佳解决方案是使用 MediaInfo 从标题中获取持续时间,但由于某种原因,它往往需要几秒钟才能返回结果。
假设我有一个包含 1,000 个文件路径的列表,我想获取每个路径的持续时间,但获取持续时间需要 15 秒。对列表进行线性迭代只需要 4 个多小时,甚至并行运行 8 个任务也需要半个小时。根据我的测试,这将是最好的情况。
我尝试过使用 MediaInfo DLL 以及调用 .exe,两者的处理时间似乎相似。
DLL 代码:
MediaInfo MI;
public Form1()
{
InitializeComponent();
MI = new MediaInfo();
}
private void button1_Click(object sender, EventArgs e)
{
MI.Open(textBox1.Text);
MI.Option("Inform", "Video;%Duration%");
label2.Text = MI.Inform();
MI.Close();
}
可执行代码:
Process proc = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "MediaInfo.exe",
Arguments = $"--Output=Video;%Duration% \"{textBox1.Text}\"",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
}
};
StringBuilder line = new StringBuilder();
proc.Start();
while (!proc.StandardOutput.EndOfStream)
{
line.Append(proc.StandardOutput.ReadLine());
}
label2.Text = line.ToString();
需要注意的是,正在处理的文件位于网络驱动器上,但我已经测试了检索本地文件的持续时间,它只快了几秒钟。 请注意,此程序必须在 Windows Server 2003 R2 上运行,这意味着仅 .net 4.0。我将要处理的大部分文件都是 .mov,但我不能仅限于此。
【问题讨论】:
-
查看了原生 Win32 popsys API,这是 explorer 用来显示持续时间的
-
Windows API CodePack 封装了 propsys,非常易于使用。只需 3-4 行即可获得 TimeSpan
-
这似乎是一个不错的选择,但我忘了说这个程序需要在 Windows Server 2003 R2 上运行,根据那个链接,它似乎不适用于 popsys。
-
此外,原生 Windows 对格式的支持相对有限,因此很大程度上取决于您的文件格式。