上传后获取视频时长

15

最佳获取方式是什么?

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

当您点击上传按钮时,视频会被上传。这个功能完美地工作。

我需要从物理路径中获取视频的持续时间,我尝试过:

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

但它无法运行,我收到了错误:

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

如何获取时长?


2
请参考以下链接获取解决方案:https://social.msdn.microsoft.com/Forums/vstudio/en-US/2d095670-9920-44f3-a386-3cfeceeb14c0/c-get-video-duration?forum=csharpgeneral - Alsamil Mehboob
我尝试过它们,但它们并没有帮助我 :( - user6448640
你将不得不问设计用于显示/处理视频的代码以获取详细信息。文件长度可能永远不是一个指示器。而且,可能有许多替代的视频/音频轨道,甚至对于一个特定的剪辑也可能不是恒定的。我认为惯例是接受“任何类型的视频”,然后在服务器端转换为默认格式。在这样做的同时,您可以作为一个副作用计算长度。将其置于一个形式中还有助于检测重复项(最好使用一些校验和进行检测)。 - Christopher
@irshadjm 不用在意。如果始终是MP4,我会告诉你MP4的哪个字节保存了持续时间(例如:其他程序也检查以了解持续时间)。 - VC.One
显示剩余2条评论
5个回答

9

您可以使用这个 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指南以使其正常工作? - Jeremy Thompson
1
这个项目使用的是.NET Standard 2.0。也许这就是问题所在。根据文档,.NET Standard 受到.NET Framework 4.6.1以上版本的支持(链接),但并不总是适用于它。我会尝试修复这个问题。@JeremyThompson,如果可以的话,请在Github上发布编译错误信息的问题。 - Tomasz Żmuda
1
@TomaszŻmuda 的 VideoInfo 已经过时,正在被 MediaInfo 替换。 - maxp
.Get() 不是 MediaInfo 的一个函数。 - Freerey
1
@Freerey 感谢您的编辑。公共API在一段时间前已经更改。 - Tomasz Żmuda

2

你的代码看起来很好,但如果你能检查媒体信息的属性,比如:链接

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)) );
}

2
使用DirectShow.Net封装库,您可以使用DirectShow API MediaDet对象。方法get_StreamLength 是获取视频长度的方法,可以使用确定性算法将其转换为分钟/小时。要使用此API,请确保在操作系统上安装了MPEG-4依赖项。
或者您可以选择使用{{link1:Media Info}}库从视频文件中获取信息。
请参阅使用DirectShow.NET封装库的实现:{{link2:获取视频长度}}

2
我们有多种方法来获取视频时长,分别是:
方法1:Shell 32 API
方法2:WMPLib(Windows Media Player Library)
方法3:FFMpeg Wrapper 请查看以下链接:
方法1和方法2链接:get-the-length-of-a-video-in-c# 方法3参考链接:video file time duration in ffmpeg 在这三种方法中,我之前都进行了检查,它们都可以用于获取视频属性和时长。但是,在文件属性中一些自定义属性在前两种方法中可能无法显示。
需要注意的是,方法3不适用于共享主机,只适用于专用服务器。

0

以下代码片段可能会对大家有所帮助:

using WMPLib;
// ...your code here...

var player = new WindowsMediaPlayer();
var clip = player.newMedia(VideoFilePath);
Console.WriteLine(TimeSpan.FromSeconds(clip.duration));

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接