2013-08-18 87 views
2

我有一个Windows Forms应用程序,我试图使用NAudio库从资源中简单地播放MP3文件。C#使用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"); 

工作正常,我将如何去那个位于资源文件? 谢谢。

回答

5

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。

+0

谢谢你我的朋友为.wav,完美的作品!如何在演奏完后妥善处理? –

+0

@AgentSmith检测播放结束(可能使用'WaveOut'的'PlaybackStopped'事件)并在'mp3reader'和'mp3file'上调用'Dispose'方法。 'Mp3FileReader'不会处理你提供的流,所以你需要在两者上调用'Dispose'。 – Corey

1

转换它使用http://media.io/ 然后所有的u需要做的是

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