【问题标题】:How to access video file info in c#如何在c#中访问视频文件信息
【发布时间】:2017-01-01 18:53:30
【问题描述】:

我正在从一个文件夹中读取 .mp4 文件 目前我正在使用 FileInfo 来提取名称 FileInfo 仅限于电影包含的一些细节。 我还需要提取其他信息,例如 标题 字幕 注释 类型 董事 生产者

DirectoryInfo dirInfo = new DirectoryInfo(@"..\bin\Debug\Folder");
FileInfo[] fileNames = dirInfo.GetFiles("*.mp4");
foreach (FileInfo fi in fileNames)
{
    string movieName = fi.Name.Split('.')[0]; // returns the file name
    VideoFile newVideo = new VideoFile(movieName); // insert name in object
            director.ListVid.Add(newVideo); // add object to a director object - aka another list
}
 listVideoDirector.Add(director); //add director object to list

我的 videoFile 对象有更多属性。我需要从实际文件中提取它们

【问题讨论】:

  • 嗯...我应该缩小问题的范围。有一个外壳扩展。它包含诸如 System.Media.SubTitle 之类的内容。但我找不到他们
  • 一张图片可能不包含所有的 exif 数据。这取决于将哪些扩展写入图像的应用程序(和人)。例如,相机会自动输入像素数和自动编号标题(人们可以手动更改以描述图片),但并不总是字幕。

标签: c# file video visual-studio-2015


【解决方案1】:

我用过库 FFProbe

下载库:https://www.nrecosite.com/downloads/video_info_free.zip

例如:

string path = "Video path";
NReco.VideoInfo.FFProbe ffProbe = new NReco.VideoInfo.FFProbe();
MediaInfo videoInfo = ffProbe.GetMediaInfo(path ); 

TimeSpan videoDuration = videoInfo.Duration;

if (videoInfo.Streams[index].CodecType.ToLower() == "video")
{
 int iWidth = videoInfo.Streams[index].Width;
 int iHeight = videoInfo.Streams[index].Height;
 string sVideoFrameRate = videoInfo.Streams[index].FrameRate.ToString();
 string sVideoCodecName = videoInfo.Streams[index].VideoCodecName;
  //...
}
else if(videoInfo.Streams[index].CodecType.ToLower() == "audio")
{
   string sAudioCodecName = videoInfo.Streams[index].CodecName;
  //...
}

【讨论】:

  • 嘿,找不到 ffprobe.exe 之类的错误?如何解决。
  • 听起来你需要下载这可能调用的 ffprobe。编辑:我只是在命令提示符下键入“ffprobe”并得到输出,这意味着它必须是 ffmpeg 标准包的一部分。试试这个:ffmpeg.org
【解决方案2】:

您可以使用 ffmpeg(ffmpeg.exe 或 ffprobe.exe)从视频或音频文件中提取元数据(它支持几乎所有已知格式)。 FFMpeg 可以使用 System.Diagnostics.Process 从 C# 代码执行,视频文件元数据应从控制台输出解析(您可以重定向标准输出并将其作为字符串读取)。

作为编写执行 ffprobe 的自定义代码的替代方法,您可以使用现有的 .NET 包装器之一,该包装器将通过一行代码返回结果(例如 NReco VideoInfo——我是这个库的作者)。

【讨论】:

  • 我试过了,但失败了 :) 我的参考文献中有 NReco。
  • var ffProbe = new FFProbe(); var videoInfo = ffProbe.GetMediaInfo(fi.FullName);字符串 info1 = null;字符串 info2 = null; foreach(videoInfo.FormatTags 中的 var 标签){ info1 = tag.Key; info2 = 标签。值; } //字符串 info4 = info1.Split(' ')[0]; // 流派字符串genre = info2.Split(' ')[0];
  • 嗯,这可不好。问题是我试图获取信息的方式是错误的,我认为。如果我说 split[0],它只返回流派,如果我说 split[1]。我得到一个空引用异常
  • 具体视频文件中可能会遗漏一些信息 - 您需要在运行时检查标签的可用性。您还可以检查 MediaInfo.Result 属性 (XPathDocument) 以获取 ffprobe 返回的所有信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多