【问题标题】:Get duration of Video after upload上传后获取视频时长
【发布时间】:2018-01-17 06:42:27
【问题描述】:

什么是最好的获取方式?

我有一个用户将上传视频的字段。

当您单击上传按钮时,视频会被上传。这很完美。

我需要物理路径的视频时长,我试过了:

using WMPLib;
WindowsMediaPlayer wmp = new WindowsMediaPlayerClass();
IWMPMedia mediaInfo = wmp.newMedia(Server.MapPath("~/Uploads/test.mp4"));
double duration = mediaInfo.duration;

但它不起作用,我收到错误:

“WMPLib.WindowsMediaPlayerClass”类型没有定义构造函数 无法嵌入互操作类型“WMPLib.WindowsMediaPlayerClass”。

如何捕捉持续时间?

【问题讨论】:

  • 我试过了,但它们没有帮助我:(
  • @irshadjm 您是否尝试通过转到WMPLib 的属性并设置Embeded = True 来显式添加WindowsMediaPlayer Embedded
  • 您将不得不询问旨在显示/处理视频的代码以获取该详细信息。文件长度永远不能作为指标。并且可以有很多替代的视频/音频轨道,对于一个特定的剪辑来说甚至可能不是恒定的。我认为习惯上只接受“任何类型的视频”,然后转换为服务器端的默认格式。这样做时,您可以将长度视为副作用。以一种形式使用它也有助于检测重复项(最好使用一些校验和)。

标签: c# asp.net video duration


【解决方案1】:

借助 DirectShow.Net 包装库,您可以使用 DirectShow API MediaDet 对象。方法get_StreamLength 是以秒为单位获取视频长度的方法,可以使用确定性算法将其转换为分钟/小时。要使用此 API,请确保您的操作系统上已安装 MPEG-4 依赖项。

或者您可以选择Media Info 库来从视频文件中获取信息。

查看使用 DirectShow.NET 包装库的实现:Getting length of video

【讨论】:

    【解决方案2】:

    我们通过多种方式获取视频时长

    方法一:Shell 32 API

    方法二:WMPLib(windows媒体播放器库)

    方法 3:FFMpeg 包装器

    查看以下链接

    方法一和方法二链接get-the-length-of-a-video-in-c#

    方法3参考链接video file time duration in ffmpeg

    在这个用于获取视频属性和持续时间的方法中,我之前检查了所有这三个。它工作正常,文件属性中的一些自定义属性未在前 2 个方法中显示。

    方法 3 不适用于共享主机。它是专用服务器所必需的。

    【讨论】:

      【解决方案3】:

      你可以使用这个 nuget 包:

      Install-Package Xabe.FFMpeg
      

      我正在尝试制作易于使用的跨平台 FFmpeg 包装器。

      您可以在Xabe.FFmpeg找到更多信息

      IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo("videofile.mkv");
      var videoDuration = mediaInfo.VideoStreams.First().Duration;
      

      有关获取视频文件时长的更多信息,请访问: https://ffmpeg.xabe.net/docs.html

      【讨论】:

      • 我尝试了 FFMpeg 项目,代码看起来不错但无法编译,如果您有时间可以提供 GitHub 指南以使其正常工作吗?
      • 此项目在 .NET Standard 2.0 中。也许这就是问题所在。根据文档,4.6.1 (link) 以上的 .NET Framework 支持 .NET Standard,但并非每次都可以使用它。我会尝试解决问题。 @JeremyThompson 如果可以,请在 github 上提出编译错误问题。
      • @TomaszŻmuda VideoInfo 即将被淘汰,正在被MediaInfo 取代。
      • .Get() 不是 MediaInfo 的函数
      • @Freerey 感谢您的编辑。公共 API 前段时间已更改
      【解决方案4】:

      您的代码看起来不错,但如果您可以查看媒体信息的attributes,例如:

      using WMPLib; // this file is called Interop.WMPLib.dll
      WindowsMediaPlayerClass wmp = new WindowsMediaPlayerClass();
      string FilePath = "yourFilePath";
      IWMPMedia mediaInfo = wmp.newMedia(FilePath);
      
      // write duration
      Console.WriteLine("Duration = " + mediaInfo.duration);
      
      // write named attributes
      for (int i=0; i < mediaInfo.attributeCount; i++) 
      {
          Console.WriteLine(mediaInfo.getAttributeName(i) + " = " +  mediaInfo.getItemInfo(mediaInfo.getAttributeName(i)) );
      }
      

      【讨论】:

        【解决方案5】:

        下面的代码 sn-p 可以帮助你们:

        using WMPLib;
        // ...your code here...
        
        var player = new WindowsMediaPlayer();
        var clip = player.newMedia(VideoFilePath);
        Console.WriteLine(TimeSpan.FromSeconds(clip.duration));
        

        并且不要忘记添加 wmp.dll 的引用,这将是 存在于 System32 文件夹中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-09
          • 2015-05-30
          • 2016-11-02
          • 2017-10-10
          • 1970-01-01
          • 2016-02-05
          • 2021-04-28
          相关资源
          最近更新 更多