我正在尝试从文件中读取元数据。我只需要视频->长度属性,但是我找不到一种简单的方法来读取此信息。
我认为这将是相当容易的,因为它在资源管理器中默认可见,然而这看起来比我预期的要复杂得多。我最近使用的是:
Microsoft.DirectX.AudioVideoPlayback.Video video = new Microsoft.DirectX.AudioVideoPlayback.Video(str);
double duration = video.Duration;然而,这抛出了一个LoaderLock异常,我不知道如何处理它。
有什么想法吗?
发布于 2009-08-16 15:20:37
其中许多详细信息都是由外壳程序提供的,因此您可以通过添加对COM库"Microsoft shell Controls and Automation“(Shell32)的引用,然后使用Folder.GetDetailsOf方法查询扩展的详细信息来完成此操作。
我最近正在寻找这个,在MSDN C#通用论坛上偶然发现了this very question。我最终将其作为FileInfo的一个扩展方法来编写:
public static Dictionary<string, string> GetDetails(this FileInfo fi)
{
Dictionary<string, string> ret = new Dictionary<string, string>();
Shell shl = new ShellClass();
Folder folder = shl.NameSpace(fi.DirectoryName);
FolderItem item = folder.ParseName(fi.Name);
for (int i = 0; i < 150; i++)
{
string dtlDesc = folder.GetDetailsOf(null, i);
string dtlVal = folder.GetDetailsOf(item, i);
if (dtlVal == null || dtlVal == "")
continue;
ret.Add(dtlDesc, dtlVal);
}
return ret;
}如果你正在寻找特定的条目,你可以做一些类似的事情,尽管找出这些条目的索引(我相信长度是索引27 )并查询它们会快得多。请注意,我没有对索引是否可以更改做过多研究(我怀疑),这就是我采用字典方法的原因。
发布于 2009-08-10 20:24:07
看看这个链接到几个ffmpeg .Net实现的SO问题- Solid FFmpeg wrapper for C#/.NET。ffmpeg适用于大多数视频格式/编解码器。这样你就不需要担心编解码器安装在机器上了。
发布于 2009-08-12 20:15:45
我只想评论Mikael的帖子,但我还没有足够的代表来做这件事。我同意他关于使用ffmpeg的观点,这样你就不需要安装编解码器了。你可以解析"ffmpeg -i your_filename“的输出,它只会转储一些关于视频的信息,包括视频的持续时间。
我不知道您使用的是什么编解码器,但一些容器实际上并不在元数据中存储持续时间(这在流容器中很常见,因为持续时间是未知的)。我不知道ffmpeg是如何处理这件事的,但它似乎以某种方式找到了它(也许是通过解析整个文件的时间码)。
https://stackoverflow.com/questions/1256841
复制相似问题