使用 NAudio 从内存流中播放 .wma

Posted

技术标签:

【中文标题】使用 NAudio 从内存流中播放 .wma【英文标题】:Play .wma from memory stream using NAudio 【发布时间】:2015-03-24 21:16:42 【问题描述】:

我正在 Visual Studio 2013 中开发一个需要播放 .wav、.mp3 和 .wma 格式的音频文件的 C# 应用程序。 .wav 和 mp3 文件播放没有问题。但是,.wma 文件似乎需要额外的处理,我无法找到解决方案。

以下是项目文件顶部的 using 语句:

using NAudio;
using NAudio.Wave;
using NAudio.FileFormats.Wav;
using NAudio.FileFormats.Mp3;
using NAudio.WindowsMediaFormat;
using NAudio.MediaFoundation;

这是播放的代码:

    private void PlayIntroScreenAudio()
    
        Player.Stop();
        byte[] IntroAudioInBytes = Convert.FromBase64String(GameInfo.IntroScreenAudio);
        MemoryStream msIntroAudiostream = new MemoryStream(IntroAudioInBytes, 0, IntroAudioInBytes.Length);
        msIntroAudioStream.Write(IntroAudioInBytes, 0, IntroAudioInBytes.Length);
        msIntroAudioStream.Seek(0, SeekOrigin.Begin);
        msIntroAudioStream.Position = 0;

        if (GameInfo.IntroScreenAudioFileExt == ".wav")
        
            WaveFileReader wfr = new WaveFileReader(msIntroAudioStream);
            Player.Init(wfr);
        
        else if (GameInfo.IntroScreenAudioFileExt == ".mp3")
        
            Mp3FileReader mp3rdr = new Mp3FileReader(msIntroAudioStream);
            Player.Init(mp3rdr);
        
        else if (GameInfo.IntroScreenAudioFileExt == ".wma")
        
            WMAFileReader wmafr = new WMAFileReader(msIntroAudioStream);
            Player.Init(wmafr);
        
        Player.Play();
        IntroAudioIsPlaying = true;
        FinalScoreAudioIsPlaying = QuestionAudioIsPlaying = CARAudioIsPlaying = IARAudioIsPlaying = false;
        btnPlayIntroScreenAudio.Image = Properties.Resources.btnStopIcon;
        btnPlayFinalScoreAudio.Image = btnPlayQuestionAudio.Image = btnPlayCorrectResponseAudio.Image =
            btnPlayIncorrectResponseAudio.Image = Properties.Resources.btnPlayIcon;
        Player.PlaybackStopped += Player_PlaybackStopped;
    

您可能会猜到,我在“(msIntroAudioStream)”下看到了一条摇摆不定的线。我尝试在括号内添加 ".ToString(),但 VS 说这是错误的,因为 wmafr 无法从字符串中读取。播放 .wma 文件还需要什么其他代码?

【问题讨论】:

我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。 我添加了标签,但没有添加到标题中。这是怎么发生的? 我的意思是标题末尾有“C#”。它似乎和标签中的 C# 标签说的一样。 实际上,John,我添加了“C#”以便其他人知道我正在使用什么语言,因为 Visual Studio 也处理其他语言。很抱歉,如果这造成任何混乱。 这正是标签的用途,所以在未来,请不要在标题中包含此类信息,而是使用标签。 【参考方案1】:

WMAFileReader 仅支持来自文件的输入,它需要一个字符串来表示其构造函数参数中的文件路径。

如果您想使用WMAFileReader,则必须先将您的MemoryStream 写入文件,然后将路径提供给WMAFileReader

奇怪的是,WMAFileReader 没有将Stream 作为参数的构造函数,但Mp3FileReaderWaveFileReader 都可以。

【讨论】:

以上是关于使用 NAudio 从内存流中播放 .wma的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中从内存流中播放 MP3?

在 UWP 中播放流中的音频

使用 NAudio 从 MP3 广播流中获取元数据

从 WPF 中的内存流(不包含 wav 标头)播放

如何使用内存流、NAudio 和 LameMP3 将音频 aiff 转换为 MP3

从内存流中读取存储的 PDF