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

Age*_*ith 3 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;
}
Run Code Online (Sandbox Code Playgroud)

要播放文件:

waveOutDevice = new WaveOut();
mainOutputStream = CreateInputStream("C:\\song.mp3");
Run Code Online (Sandbox Code Playgroud)

与普通文件一起正常工作,我将如何处理位于参考资料中的文件?谢谢.

Cor*_*rey 9

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);
Run Code Online (Sandbox Code Playgroud)

其他资源方法在获取流的细节方面有所不同,但除此之外基本相同.如果使用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);
Run Code Online (Sandbox Code Playgroud)

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

在所有情况下,您应该在阅读完之后处理Stream.