C# 使用资源中的 NAudio 播放 MP3 文件

标签 c# resources stream naudio

我有一个 Windows 窗体应用程序,我在其中尝试使用 NAudio 库简单地播放资源中的 MP3 文件。

我相信需要做的是以某种方式流式传输文件,这是 NAudio 的示例,不幸的是它接受文件路径字符串作为参数。

private WaveStream CreateInputStream(string fileName)
{
    WaveChannel32 inputStream;
    if (fileName.EndsWith(".mp3"))
    {
        WaveStream mp3Reader = new Mp3FileReader(fileName);
        inputStream = new WaveChannel32(mp3Reader);
    }
    else
    {
        throw new InvalidOperationException("Unsupported extension");
    }
    volumeStream = inputStream;
    return volumeStream;
}

播放文件:

waveOutDevice = new WaveOut();
mainOutputStream = CreateInputStream("C:\\song.mp3");

正常文件工作正常,我将如何处理位于资源中的文件? 谢谢。

最佳答案

Mp3FileReader 类可以从文件名或 System.IO.Stream 构造。所以你需要的是将 MP3 资源作为流读取。如何执行此操作取决于您如何添加资源。

使用 Properties/Resources.resx 文件添加的资源(通过应用程序属性对话框管理)可通过 Properties.Resources 对象访问。已知资源类型(图像等)应在此处用其适当的类型表示,但 MP3 文件可作为 byte[] 访问。您可以从资源创建一个 MemoryStream 并使用它来构建 Mp3FileReader,如下所示:

MemoryStream mp3file = new MemoryStream(Properties.Resources.MP3file);
Mp3FileReader mp3reader = new Mp3FileReader(mp3file);

其他资源方法在如何获取流的细节上有所不同,但除此之外基本相同。如果使用 Embedded Resource 构建操作将 MP3 文件添加到项目中,则可以使用以下命令:

public Stream GetResourceStream(string filename)
{
    Assembly asm = Assembly.GetExecutingAssembly();
    string resname = asm.GetName().Name + "." + filename;
    return asm.GetManifestResourceStream(resname);
}

...
Stream mp3file = GetResourceStream("some file.mp3");
Mp3FileReader mp3reader = new Mp3FileReader(mp3file);

WPF 资源再次不同,使用 pack:... uri 格式和 Application.GetResourceStream

当然,在所有情况下,您都应该在读完 Stream 后将其释放。

关于C# 使用资源中的 NAudio 播放 MP3 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18295309/

相关文章:

java - Java 8/NIO 中是否有任何机制可以替换大文件的行而不将其加载到内存中?

c# - 为什么将 Dispose 用作常规方法不好?

c# - 困惑 : ASP. NET Core 2 不是托管代码,但 ASP.Net Core Runtime 是做什么用的?

amazon-web-services - Terraform - 它会删除现有资源 AWS

C# .NET 资源

c++ - 使用流的命令行浮点输入和输出

c# - 图片框的图像缩放

c# - 列出 <class> 按字母顺序排列,同时将某些项目保持在顶部?

Android: 字符串资源,多个同名字符串

stream - Common Lisp 与读字节/写字节的斗争