1

我试图找出 Windows Server 2008 中电影文件(mp4 或 wmv)的数据速率。我尝试使用Windows API 代码包以及 C# 中的 Shell32 COM 对象。这在 Windows 7 中运行良好,但在 Windows Server 2008 中没有返回任何信息。

在 Windows 7 资源管理器中,我可以在文件夹中项目的详细信息列表中添加一列,以查看文件属性,例如数据速率、比特率和持续时间。在 Windows Server 2008 中尝试执行此操作时,这些列中没有显示任何内容。如果我使用 Windows API 代码包运行我的程序以找出 Windows 7 机器上文件的数据速率并指向它通过网络分析 Windows Server 2008 机器上的文件,那么我可以获得数据速率属性,但是通过网络查找这些属性比在本地查找要花费更长的时间。

如果有办法在 Windows Server 2008 中使用 C# 找出数据速率,请告诉我!谢谢!

4

3 回答 3

2

媒体信息

1:创建一个C#项目

2:在项目中包含这个(点击我)文件

3:创建一个很好的包装类来提取值:

这是给你的;

public class MediaQuery
{
    public Dictionary<string, string> QueryFile(string filePath)
    {
        MediaInfo mediaInfo = new MediaInfo();
        string version = mediaInfo.Option("Info_Version");
        if (!File.Exists(filePath))
            throw new Exception("File Not Found");
        try
        {
            mediaInfo.Option("Inform", "XML");
            mediaInfo.Option("Complete", "1");
            mediaInfo.Open(filePath);

            string xml = mediaInfo.Inform();
            IEnumerable<XElement> el = XElement.Parse(xml, LoadOptions.None).Elements();
            XElement general = el.FirstOrDefault(e => e.Attribute("type").Value == "General");
            XElement video = el.FirstOrDefault(e => e.Attribute("type").Value == "Video");
            XElement audio = el.FirstOrDefault(e => e.Attribute("type").Value == "Audio");
            Dictionary<string, string> values = new Dictionary<string, string>();
            values = GetValues(general, "General");
            values = GetValues(video, "Video", values);
            values = GetValues(audio, "Audio", values);
            return values;
        }
        catch (Exception ex)
        {
            throw new Exception("Problem Querying File", ex);
        }
    }

    private Dictionary<string, string> GetValues(XElement xElement, string rootType)
    {
        Dictionary<string, string> values = new Dictionary<string, string>();
        return GetValues(xElement, rootType, values);
    }
    private Dictionary<string, string> GetValues(XElement xElement, string rootType, Dictionary<string, string> values)
    {
        foreach (XElement element in xElement.Elements())
        {
            string key = rootType + "/" + element.Name.ToString();
            if (!values.ContainsKey(key))
                values.Add(key, element.Value.ToString());
            else
            {
                int count = 1;
                key = rootType + "/" + element.Name.ToString() + count.ToString();
                while (values.ContainsKey(key))
                {
                    count++;
                    key = rootType + "/" + element.Name.ToString() + count.ToString();
                }
                values.Add(key, element.Value.ToString());
            }
        }
        return values;
    }
}

将该文件粘贴在同一个项目中。

4:下载MediaInfo的当前版本:下载页面。选择最适合您的版本(仅限DLL)。确保 .dll 位于应用程序的执行目录中。

5:用法:

MediaQuery query = new MediaQuery();
Dictionary<string, string> results = query.QueryFile(@"C:\text.mov");
string videoBitRate;

if (results.TryGetValue("Video/Bit_rate", out videoBitRate) == false)
{ 
   throw new Exception("Video bit rate not found"); 
}
else
{
   // Do whatever you want with this....
   Console.writeline("Video bitrate:" + videoBitRate);
}
于 2012-10-02T15:38:03.543 回答
2

您可以尝试使用 ffmpeg 的库。您有一些可用的 C# 包装器。看看这个SO 帖子

于 2012-10-01T19:03:59.640 回答
0

这是一个非常简单的答案:Windows server 2008 没有 mpeg-4 多路复用器,因此使用服务器的默认配置,您无法在计算机上获取任何 mp4 信息。

- 在您的计算机中,您会注意到,如果您将鼠标光标放在视频文件上,您将能够看到基本的文件信息,例如持续时间...

- 在您的服务器上,您可能会发现,如果您对 mp4 媒体文件执行相同操作,您将无法看到此信息...(持续时间和尺寸)

该问题的答案是从开始菜单转到 Windows Server 2008 r2 中管理工具下的服务器管理器。

从那里您需要选择左侧的功能。之后,您需要添加功能并选择 DESKTOP EXPERIENCE 并安装。

这是您需要做的主要事情,您的机器才能读取 mp4 信息。之后,您需要为您的 mp4 媒体文件设置 mime 类型。安装编解码器。

于 2013-10-01T16:29:24.613 回答