You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET Maui跨平台环境下可靠读取MP3文件时长?

.NET MAUI 跨平台读取MP3文件时长的可靠方案

方案一:使用跨平台音频解析库 TagLibSharp

TagLibSharp是成熟的跨平台音频元数据解析库,支持MP3等多种格式,无需播放文件即可直接读取时长,兼容MAUI所有目标平台(Windows、iOS、Android)。

实现步骤:

  1. 安装NuGet包:TagLibSharp
  2. 编写读取时长的代码:
using TagLib;

public TimeSpan GetMp3Duration(string filePath)
{
    using var audioFile = TagLib.File.Create(filePath);
    return audioFile.Properties.Duration;
}

该方法直接从MP3文件的元数据或编码信息中解析时长,无需依赖MediaElement的播放事件,调用即可同步获取结果。

方案二:平台特定原生实现

如果需要更精细化控制,可通过MAUI的依赖服务,针对不同平台调用原生API实现,避免跨平台库的潜在兼容性问题:

1. 定义统一接口

public interface IMp3DurationReader
{
    TimeSpan GetDuration(string filePath);
}

2. 各平台实现

Windows平台(使用NAudio)

using NAudio.Wave;

public class WindowsMp3DurationReader : IMp3DurationReader
{
    public TimeSpan GetDuration(string filePath)
    {
        using var mp3Reader = new Mp3FileReader(filePath);
        return mp3Reader.TotalTime;
    }
}

iOS平台(使用AVFoundation原生API)

NAudio仅适配Windows平台,在iOS上会因依赖缺失崩溃,需改用苹果原生的AVFoundation框架:

using AVFoundation;
using Foundation;

public class IosMp3DurationReader : IMp3DurationReader
{
    public TimeSpan GetDuration(string filePath)
    {
        var fileUrl = NSUrl.FromFilename(filePath);
        var audioAsset = AVAsset.FromUrl(fileUrl);
        return TimeSpan.FromSeconds(audioAsset.Duration.Seconds);
    }
}

Android平台(使用MediaMetadataRetriever)

using Android.Media;

public class AndroidMp3DurationReader : IMp3DurationReader
{
    public TimeSpan GetDuration(string filePath)
    {
        using var retriever = new MediaMetadataRetriever();
        retriever.SetDataSource(filePath);
        if (long.TryParse(retriever.ExtractMetadata(MetadataKey.Duration), out var durationMs))
        {
            return TimeSpan.FromMilliseconds(durationMs);
        }
        return TimeSpan.Zero;
    }
}

3. 注册依赖服务

在Program.cs中注册对应平台的实现:

builder.Services.AddSingleton<IMp3DurationReader>(sp =>
{
    return DeviceInfo.Platform switch
    {
        DevicePlatform.Windows => new WindowsMp3DurationReader(),
        DevicePlatform.iOS => new IosMp3DurationReader(),
        DevicePlatform.Android => new AndroidMp3DurationReader(),
        _ => throw new NotSupportedException("当前平台不支持读取MP3时长")
    };
});

4. 使用方式

通过依赖注入获取IMp3DurationReader实例,调用GetDuration方法即可:

private readonly IMp3DurationReader _durationReader;

// 构造函数注入
public YourViewModel(IMp3DurationReader durationReader)
{
    _durationReader = durationReader;
}

// 读取时长
var duration = _durationReader.GetDuration(selectedMp3Path);

关于NAudio在iOS崩溃的说明

NAudio是Windows平台专属的音频处理库,底层依赖Windows音频系统API,未对iOS平台适配,因此在iOS设备上运行时会因找不到依赖的系统组件崩溃,iOS平台必须使用原生AVFoundation框架实现音频元数据读取。

内容的提问来源于stack exchange,提问作者John Strudwick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:35:06