24

好的。实际上,我主要需要 mp4 格式。但是,如果也有可能获得其他类型,那就太好了。我只需要读取文件的持续时间。我怎么能用 C# 4.0 做到这一点?

所以我需要的是这个视频是这样的:13 minutes 12 seconds

我也可以使用 3 个第三方 exe。就像他们将有关文件的信息保存到文本文件中一样。我可以解析那个文本文件。

谢谢你。

4

10 回答 10

15

这个关于 P/Invoke for Shell32 的答案让我想起了Windows API 代码包来访问常见的 Windows Vista/7/2008/2008R2 API。

使用包含的示例中的 PropertyEdit 演示非常容易,找出 Shell32 API 来获取各种媒体文件属性,例如持续时间。

我假设相同的先决条件适用于安装正确的解复用器,但它非常简单,因为它只需要添加对Microsoft.WindowsAPICodePack.dllandMicrosoft.WindowsAPICodePack.Shell.dll和以下代码的引用:

using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;

using (ShellObject shell = ShellObject.FromParsingName(filePath))
{
    // alternatively: shell.Properties.GetProperty("System.Media.Duration");
    IShellProperty prop = shell.Properties.System.Media.Duration; 
    // Duration will be formatted as 00:44:08
    string duration = prop.FormatForDisplay(PropertyDescriptionFormatOptions.None);
}

其他的东西

MPEG-4/AAC 音频媒体文件的一些常见属性:

System.Audio.Format = {00001610-0000-0010-8000-00AA00389B71}
System.Media.Duration = 00:44:08
System.Audio.EncodingBitrate = ?56kbps
System.Audio.SampleRate = ?32 kHz
System.Audio.SampleSize = ?16 bit
System.Audio.ChannelCount = 2 (stereo)
System.Audio.StreamNumber = 1
System.DRM.IsProtected = No
System.KindText = Music
System.Kind = Music

如果您正在寻找可用的元数据,很容易遍历所有属性:

using (ShellPropertyCollection properties = new ShellPropertyCollection(filePath))
{
    foreach (IShellProperty prop in properties)
    {
        string value = (prop.ValueAsObject == null) ? "" : prop.FormatForDisplay(PropertyDescriptionFormatOptions.None);
        Console.WriteLine("{0} = {1}", prop.CanonicalName, value);
    }
}
于 2013-09-16T00:51:00.610 回答
14

您也可以使用 windows 媒体播放器,尽管它不支持您请求的所有文件类型

using WMPLib;

public Double Duration(String file)
    {
        WindowsMediaPlayer wmp = new WindowsMediaPlayerClass();
        IWMPMedia mediainfo = wmp.newMedia(file);
        return mediainfo.duration;
    }
}
于 2012-04-17T12:19:39.943 回答
12

MediaDet您可以通过 DirectShow.NET 包装库使用 DirectShow API对象。有关代码示例,请参阅获取视频长度,get_StreamLength以秒为单位获取持续时间。这假设 Windows 已安装 MPEG-4 解复用器(需要 Windows 7 之前的第三方组件,我相信这同样适用于cezor 的另一个答案,尽管可以免费重新分发组件)。

于 2012-04-17T12:27:22.360 回答
5

恕我直言,您可以使用MediaInfo为您提供有关媒体文件的大量信息。
它有一个 CLI,因此您可以从代码中使用它并获取所需的信息。
你可以看看这个链接

于 2012-04-17T12:09:02.147 回答
4

我认为您正在寻找 FFMPEG - https://ffmpeg.org/

还有一些免费的替代品,您可以在这个问题中阅读它们 - Using FFmpeg in .net?

   FFMpeg.NET
   FFMpeg-Sharp
   FFLib.NET

您可以查看此链接以获取使用 FFMPEG 和查找持续时间的示例 - http://jasonjano.wordpress.com/2010/02/09/a-simple-c-wrapper-for-ffmpeg/

        public VideoFile GetVideoInfo(string inputPath)
        {
            VideoFile vf = null;
            try
            {
                vf = new VideoFile(inputPath);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            GetVideoInfo(vf);
            return vf;
        }
        public void GetVideoInfo(VideoFile input)
        {
            //set up the parameters for video info
            string Params = string.Format("-i {0}", input.Path);
            string output = RunProcess(Params);
            input.RawInfo = output;

            //get duration
            Regex re = new Regex("[D|d]uration:.((\\d|:|\\.)*)");
            Match m = re.Match(input.RawInfo);

            if (m.Success)
            {
                string duration = m.Groups[1].Value;
                string[] timepieces = duration.Split(new char[] { ':', '.' });
                if (timepieces.Length == 4)
                {
                    input.Duration = new TimeSpan(0, Convert.ToInt16(timepieces[0]), Convert.ToInt16(timepieces[1]), Convert.ToInt16(timepieces[2]), Convert.ToInt16(timepieces[3]));
                }
            }
       }
于 2012-04-17T12:09:25.097 回答
3

FFMPEG 项目有一个名为 ffprobe 的工具,它可以为您提供多媒体文件所需的信息,并以格式良好的 JSON 格式输出信息。

这个答案为例。

于 2013-05-29T06:58:39.507 回答
3

也使用 Windows Media Player 组件,我们可以获得视频的持续时间。
以下代码片段可能会对你们有所帮助:

using WMPLib;
// ...
var player = new WindowsMediaPlayer();
var clip = player.newMedia(filePath);
Console.WriteLine(TimeSpan.FromSeconds(clip.duration));

并且不要忘记添加wmp.dll将出现在System32文件夹中的引用。

于 2016-09-02T01:11:00.693 回答
2

我发现NReco.VideoInfo 库是最好的选择,而且比上面的一些库要简单得多。这是一个简单的为库提供文件路径并吐出元数据:

var ffProbe = new FFProbe();
var videoInfo = ffProbe.GetMediaInfo(blob.Uri.AbsoluteUri);
return videoInfo.Duration.TotalMilliseconds;
于 2015-11-13T13:55:54.923 回答
1

我遇到了同样的问题,我们为 ffprobe Alturos.VideoInfo构建了一个包装器。您只需安装nuget软件包即可使用它。还需要ffprobe二进制文件。

PM> install-package Alturos.VideoInfo

例子

var videoFilePath = "myVideo.mp4";

var videoAnalyer = new VideoAnalyzer("ffprobe.exe");
var analyzeResult = videoAnalyer.GetVideoInfo(videoFilePath);

var duration = analyzeResult.VideoInfo.Format.Duration;
于 2019-06-26T21:34:44.487 回答
0
StreamReader errorreader;
string InterviewID = txtToolsInterviewID.Text;

Process ffmpeg = new Process();

ffmpeg.StartInfo.UseShellExecute = false;
ffmpeg.StartInfo.ErrorDialog = false;
ffmpeg.StartInfo.RedirectStandardError = true;

ffmpeg.StartInfo.FileName = Server.MapPath("ffmpeg.exe");
ffmpeg.StartInfo.Arguments = "-i " + Server.MapPath("videos") + "\\226.flv";


ffmpeg.Start();

errorreader = ffmpeg.StandardError;

ffmpeg.WaitForExit();

string result = errorreader.ReadToEnd();

string duration = result.Substring(result.IndexOf("Duration: ") + ("Duration: ").Length, ("00:00:00.00").Length);
于 2016-09-19T10:26:53.790 回答