【发布时间】:2023-01-30 10:40:07
【问题描述】:
我有一个最近从 .net5 更新到 .net6 的 asp.net 核心 API。 有一段代码应该读取音频文件的持续时间。似乎适用于以前版本的代码是这样的:
try
{
//
// NAudio -- Windows only
//
using var fileReader = new AudioFileReader(filePath);
return Convert.ToInt32(Math.Ceiling(fileReader.TotalTime.TotalSeconds));
}
catch (DllNotFoundException)
{
try
{
//
// LibVLCSharp is crossplatform
//
using var libVLC = new LibVLC();
using var media = new Media(libVLC, filePath, FromType.FromPath);
MediaParsedStatus parsed = Task.Run(async () => await media.Parse(MediaParseOptions.ParseNetwork, timeout: 2000).ConfigureAwait(false)).Result;
if (parsed != MediaParsedStatus.Done) throw new ArgumentException("Could not read audio file");
if (!media.Tracks.Any(t => t.TrackType == TrackType.Audio) || (media.Duration <= 100)) throw new ArgumentException("Could not read audio from file");
return Convert.ToInt32(Math.Ceiling(TimeSpan.FromMilliseconds(media.Duration).TotalSeconds));
}
catch (Exception ex) when (ex is DllNotFoundException || ex is LibVLCSharp.Shared.VLCException)
{
try
{
using var fileReader = new Mp3FileReader(filePath);
return Convert.ToInt32(Math.Ceiling(fileReader.TotalTime.TotalSeconds));
}
catch (InvalidOperationException)
{
throw new ArgumentException("Could not read audio file");
}
}
}
该应用程序部署在 Linux 上,我不知道代码的哪一部分进行了准确的计算(我假设是 VLC 部分),但是自从更新到 .NET6 后,所有这些都失败了,并且自从上次回退是NAudio,我们得到以下异常:
无法加载共享库“Msacm32.dll”或其依赖项之一。
我正在使用 Windows,但我尝试使用 WSL 运行该应用程序,但我也无法运行 VLC 部分 - 它总是抛出以下异常(即使在安装 vlc 和 vlc dev SDK 之后):
无法创建 LibVLC。确保您已完成以下操作:
- 为您的目标平台安装了来自 nuget 的最新 LibVLC。 无法加载共享库“libX11”或其依赖项之一。为了帮助诊断加载问题,请考虑设置 LD_DEBUG 环境变量:liblibX11: cannot open shared object file: No such file or directory at LibVLCSharp.Shared.Core.Native.XInitThreads() 在 LibVLCSharp.Shared.Core.InitializeDesktop(字符串 libvlcDirectoryPath) 在 LibVLCSharp.Shared.Helpers.MarshalUtils.CreateWithOptions(字符串 [] 选项,Func`3 创建)
有什么干净的方法可以在所有平台上读取音频文件的持续时间吗? 不用说,NAudio 在 Windows 上的工作就像一个魅力,VLC 也是如此(使用适当的 nuget 包)。
【问题讨论】:
标签: c# windows-subsystem-for-linux naudio libvlcsharp