C#获取音频时长(支持mp3,wma,wav格式)

using Shell32;
using System;
using System.IO;
ShellClass sh = new ShellClass();
Folder dir = sh.NameSpace(Path.GetDirectoryName("MP3绝对路径"));
FolderItem item = dir.ParseName(Path.GetFileName("MP3绝对路径"));
String durationStr = dir.GetDetailsOf(item, 27);    //获取时长字符串(00:00:01)
if (!durationStr.Equals(""))
{
    try {
        String[] durationArray = durationStr.Split(':');    //获取长度  iColumn:27
        int duration = 0;    //时长(毫秒)
        duration += int.Parse(durationArray[0]) * 60 * 60 * 1000;
        duration += int.Parse(durationArray[1]) * 60 * 1000;
        duration += int.Parse(durationArray[2]) * 1000;
    } catch (Exception ex) {
        //log
    }
}

其实代码并不长,但是其中还是遇到了一些挫折,最主要的就是dll的引用问题,顺便也吐槽下,现在搜索技术文章太难了,重复的太多了,而且是各家博客里面都搞一份,基本上搜东西第一篇找到了,后面几篇大部分都是一样的,
如果网站内做查重过滤是不是好一点。

上面代码遇到最大的问题就是Shell32这个命名空间的问题,一开始以为只要引入下就可以了,但是遇到坑了。首先这个Shell32在哪引入?
在这里插入图片描述
引用里面直接搜索是找不到的,把32去掉,会发现有个 Microsoft Shell Controls And Automation
在这里插入图片描述
把这个引入试试
在这里插入图片描述
在这里插入图片描述
引入后会提示“无法嵌入互操作类型"ShellClass"”,这里对C#熟悉的知道,只要改下“嵌入互操作类型即可”。在这里插入图片描述
右键dll“属性”,然后改下类型即可。在这里插入图片描述
现在发现不报错了,于是启起来试试。
运行到这段代码时,报错了。

Folder dir = sh.NameSpace(Path.GetDirectoryName(""));

在这里插入图片描述
无法将类型为“Shell32.ShellClass”的 COM 对象强制转换为接口类型“Shell32.IShellDispatch6”。此操作失败的原因是对 IID 为“{286E6F1B-7113-4355-9562-96B7E9D64C54}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 不支持此接口 (异常来自 HRESULT:0x80004002 (E_NOINTERFACE))。
这个错误,网上有一堆解决方案,就是将Shell32版本升级,因为现在用的是1.0.0.0在这里插入图片描述
这个原因没有深究,挺纳闷的这个问题,为啥一直没解决。然后网上也很难下高版本的dll,都需要…搜索过这个问题的应该知道
我这里就直接贴上来,省的大家去找了,版本是1.2.107.0的。
下载地址
注意,如果就这样把代码放到服务器上了,还是无法获取音频时长的,会发现

dir.GetDetailsOf(item, 27);

获取到的始终都是空的。
解决方法就是服务器上需要添加角色和功能在这里插入图片描述
到达选择功能页面,将优质Windows音频视频体验勾上,然后点击安装。在这里插入图片描述
但是,这里还需要重启服务器才能安装完成。对于线上服务器来说,这不太可能,所以这套方案可以用在,新服务器上,或者服务器重启不影响业务的情况下。
还有种方案就是使用ffmpeg去获取时长信息,通过命令获取文件信息

ffmpeg.exe -i test.mp3

在这里插入图片描述
在将数据截取出来就可以了

mp3Info.Substring(mp3Info.IndexOf("Duration: ") + ("Duration: ").Length, ("00:00:00").Length);
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值