我有一个 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/