如何在.NET Maui跨平台环境下可靠读取MP3文件时长?
.NET MAUI 跨平台读取MP3文件时长的可靠方案
方案一:使用跨平台音频解析库 TagLibSharp
TagLibSharp是成熟的跨平台音频元数据解析库,支持MP3等多种格式,无需播放文件即可直接读取时长,兼容MAUI所有目标平台(Windows、iOS、Android)。
实现步骤:
- 安装NuGet包:
TagLibSharp - 编写读取时长的代码:
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
相关产品推荐
相关产品推荐

