3

我有一个 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");

适用于普通文件,我将如何处理位于资源中的文件?谢谢你。

4

2 回答 2

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);

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

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 后处理它。

于 2013-08-19T00:31:35.547 回答
0

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

(new System.Media.SoundPlayer(ProjectName.Properties.Resources.wavfilename)).Play();
于 2013-12-07T12:10:16.867 回答