获取媒体文件持续时间的最快方法是啥?

Posted

技术标签:

【中文标题】获取媒体文件持续时间的最快方法是啥?【英文标题】:What is the fastest way to get a media file's duration?获取媒体文件持续时间的最快方法是什么? 【发布时间】: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 对格式的支持相对有限,因此很大程度上取决于您的文件格式。 【参考方案1】:

一些更好的代码(更喜欢 DLL 调用,初始化需要时间),带有减少扫描持续时间的选项:

MediaInfo MI;

public Form1()

    InitializeComponent();
    MI = new MediaInfo();
    MI.Option("ParseSpeed", "0"); // Advanced information (e.g. GOP size, captions detection) not needed, request to scan as fast as possible
    MI.Option("ReadByHuman", "0"); // Human readable strings are not needed, no noeed to spend time on them


private void button1_Click(object sender, EventArgs e)

    MI.Open(textBox1.Text);
    label2.Text = MI.Get(Stream_Video, "Duration"); //Note: prefer Stream_General if you want the duration of the program (here, you select the duration of the video stream)
    MI.Close();

根据您的特定需求(即您不关心很多功能),有多种可能来改进解析时间,但这是直接添加到 MediaInfo 的代码(例如,对于 MP4/QuickTime 文件,仅获取持续时间可以如果我禁用其他功能,则需要不到 200 毫秒),如果您需要速度,请添加 feature request。

Jérôme,MediaInfo 开发人员

【讨论】:

以上是关于获取媒体文件持续时间的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

扁平化深度嵌套的 JSON 以获取 Dataframe 的最快和通用方法是啥?

从命令行获取一组数字的平均值的最快方法是啥?

访问 zip 文件中文件的最快方法是啥?

按列合并多个 csv 文件的最快方法是啥?

在 C# 中浏览 XML 文件的最快方法是啥?

搜索硬盘中所有文件的最快方法是啥?