gpt4 book ai didi

c# - 使用 .net 6 在 Linux 上用 C# 读取音频文件持续时间

转载 作者:行者123 更新时间:2023-12-03 07:59:20 26 4
gpt4 key购买 nike

我有一个 asp.net core API,最近从 .net5 更新到 .net6。有一段代码应该读取音频文件的持续时间。似乎适用于以前版本的代码是这样的:


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: 无法打开共享对象文件: LibVLCSharp.Shared.Core.Native.XInitThreads() 处没有此类文件或目录在 LibVLCSharp.Shared.Core.InitializeDesktop(字符串 libvlcDirectoryPath)在 LibVLCSharp.Shared.Helpers.MarshalUtils.CreateWithOptions(String[] options, Func`3 create)

是否有任何干净的方法可以在所有平台上读取音频文件的持续时间?不用说,NAudio 在 Windows 上的工作方式就像一个魅力,VLC 也是如此(带有适当的 nuget 包)。

最佳答案

我鼓励您查看atldotnet 。它是一个小型、维护良好的完全托管代码/跨平台库,没有任何外部依赖项,并且可以在我的所有测试用例中准确检测音频文件持续时间(比 ffmpeg 更准确)。支持最常见的音频格式。

    var t = new Track(audioFilePath);    
// Works the same way on any supported format (MP3, FLAC, WMA, SPC...)
System.Console.WriteLine("Duration (ms) : " + t.DurationMs);

关于c# - 使用 .net 6 在 Linux 上用 C# 读取音频文件持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74934138/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com