【问题标题】:C# Play MP3 file using NAudio from ResourceC# 使用资源中的 NAudio 播放 MP3 文件
【发布时间】:2013-08-20 03:48:04
【问题描述】:

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

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

【问题讨论】:

    标签: c# resources stream naudio


    【解决方案1】:

    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 后将其丢弃。

    【讨论】:

    • 谢谢我的朋友,完美运行!播放完毕后如何妥善处理?
    • @AgentSmith 检测播放结束(可能使用WaveOutPlaybackStopped 事件)并在mp3readermp3file 上调用Dispose 方法。 Mp3FileReader 不会释放您提供的流,因此您需要同时调用 Dispose
    【解决方案2】:

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

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

    【讨论】:

    • 那不使用naudio,就像指定的问题一样。
    猜你喜欢
    • 1970-01-01
    • 2011-01-30
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多