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

时间:2013-08-18 03:10:18

标签: 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");

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

2 个答案:

答案 0 :(得分:8)

可以使用文件名或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);

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

在所有情况下,当你完成阅读后,你应该处理它。

答案 1 :(得分:1)

使用http://media.io/将其转换为.wav 那么你需要做的就是

(new System.Media.SoundPlayer(ProjectName.Properties.Resources.wavfilename)).Play();