如何在跨平台 Avalonia 应用程序中可靠地播放 wav 资源?

问题描述 投票:0回答:1

我正在使用 Avalonia 编写一个非常简单的游戏,其中包含一些我更喜欢存储在应用程序资源中的简短声音(程序集资产 - 我只是将它们放在 Avalonia 案例中的 Assets 文件夹中)。经过一些黑客攻击,结合我在互联网上找到的众多解决方案的一部分,我已经通过 Windows 上的有线耳机/扬声器实现了可靠的正确播放(甚至还没有尝试其他平台),但这不适用于蓝牙耳机/扬声器。一些蓝牙设备偶尔会播放一小部分声音,而其他设备则不会播放任何内容。

我不坚持使用NAudio。任何其他无缝跨平台库不需要用户安装额外的外部依赖项,并且开发人员在 Windows 上安装也相当容易,都是可以接受的。我希望该应用程序能够在 Windows、Linux、MacOS、Android 和 iOS 上运行(包括声音),并且可以合理地预期这些平台可以在其上运行的任何硬件。

下面是演示我现在使用的方法的代码。为了更好的理解性,我故意使用冗长的 C# 风格,避免使用大多数现代语法糖。我专门编写这些函数来以隔离的方式重现问题。 IRL 我不会在每次播放声音时都对所有内容进行冗余重新分配,但效果是相同的。

从文件系统播放独立的 wav 文件很简单:

using NAudio.Wave;

private void PlayWaveFile(string waveFilePath)
{
    using (AudioFileReader audioFileReader = new AudioFileReader(waveFilePath))
    {
        using (WaveOutEvent waveOutEvent = new WaveOutEvent())
        {
            waveOutEvent.Init(audioFileReader);

            waveOutEvent.Play();

            while (waveOutEvent.PlaybackState == PlaybackState.Playing)
            {
                Thread.Sleep(10);
            }
        }
    }
}

从资源(我真正感兴趣的)播放相同的内容结果有点棘手:

private void PlayWaveResource(string waveResourceName, string assemblyName)
{
    Uri uri = new($"avares://{assemblyName}/Assets/{waveResourceName}.wav");

    using (Stream assetStream = AssetLoader.Open(uri))
    {
        using (MemoryStream memoryStream = new())
        {
            assetStream.CopyTo(memoryStream);

            memoryStream.Seek(0, 0);

            using (WaveFileReader waveFileReader = new(memoryStream))
            {
                using (WaveOutEvent waveOutEvent = new())
                {
                    waveOutEvent.Init(waveFileReader);

                    waveOutEvent.Play();

                    while (waveOutEvent.PlaybackState == PlaybackState.Playing)
                    {
                        Thread.Sleep(10);
                    }
                }
            }
        }
    }
}

这两个功能在 Windows 上使用经典有线耳机和内置笔记本电脑扬声器时都可以正常工作,但在使用蓝牙耳机/扬声器时则无法使用。

我在 Windows 10.0.19045 x64 上的 VisualStudio CE 2022 17.9.7 中使用 NAudio 2.2.1 与 Avalonia 11.0.10 和 .Net SDK 8.0.205。

.net audio bluetooth naudio avalonia
1个回答
0
投票

我认为你绝对应该尝试 LibVLCSharp 库。查看 NuGet 包 (https://www.nuget.org/packages/LibVLCSharp/) 和主要文档 (https://code.videolan.org/videolan/LibVLCSharp/-/blob/3.x/文档/home.md)。还有一个很好的 Q/A 页面,展示了常见用法 - “How Do I do X”

最近我开发了一个简单的演示项目并写了一篇关于它的博客文章。我很确定您会发现它很有帮助。 基本上我使用 Visual Studio 2022 作为 IDE,Avalonia UI 作为框架,LibVLCSharp 包作为音频 API,并且能够播放基于 URI 的音频文件。也许您将能够在项目中以类似的方式使用资源 URI。 请从 GitHub 下载完整的源代码 (https://github.com/Monsalma/Monsalma.AvaloniaUI/tree/main/Monsalma_AvaloniaAudioTest)。 有一篇博客文章将引导您逐步完成该过程 (https://monsalma.net/avalonia-ui-audio-playback-demo/),因此请务必查看。

© www.soinside.com 2019 - 2024. All rights reserved.