当前位置:  开发笔记 > 编程语言 > 正文

使用C#播放流中的音频

如何解决《使用C#播放流中的音频》经验,为你挑选了3个好方法。

C#中是否有一种方法可以直接从System.IO.Stream播放音频(例如MP3),例如从WebRequest返回而不将数据临时保存到磁盘?


与NAudio的解决方案

在NAudio 1.3 的帮助下,可以:

    将URL中的MP3文件加载到MemoryStream中

    完全加载后,将MP3数据转换为波形数据

    使用NAudio的WaveOut类播放波形数据

如果能够播放半载MP3文件本来不错,但由于NAudio库设计,这似乎是不可能的.

这是完成工作的功能:

    public static void PlayMp3FromUrl(string url)
    {
        using (Stream ms = new MemoryStream())
        {
            using (Stream stream = WebRequest.Create(url)
                .GetResponse().GetResponseStream())
            {
                byte[] buffer = new byte[32768];
                int read;
                while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
            }

            ms.Position = 0;
            using (WaveStream blockAlignedStream =
                new BlockAlignReductionStream(
                    WaveFormatConversionStream.CreatePcmStream(
                        new Mp3FileReader(ms))))
            {
                using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
                {
                    waveOut.Init(blockAlignedStream);
                    waveOut.Play();                        
                    while (waveOut.PlaybackState == PlaybackState.Playing )                        
                    {
                        System.Threading.Thread.Sleep(100);
                    }
                }
            }
        }
    }

Mark Heath.. 51

编辑:答案已更新,以反映最近版本的NAudio中的更改

可以使用我编写的NAudio开源.NET音频库.它会在您的PC上查找ACM编解码器以进行转换.NAudio提供的Mp3FileReader目前希望能够在源流中重新定位(它预先构建MP3帧的索引),因此不适合通过网络进行流式传输.但是,您仍然可以使用NAudio中的MP3FrameAcmMp3FrameDecompressor类来动态解压缩流式MP3.

我在我的博客上发表了一篇文章,解释了如何使用NAudio播放MP3流.基本上你有一个线程下载MP3帧,解压缩并存储在一个BufferedWaveProvider.然后另一个线程使用BufferedWaveProvider输入作为回放.



1> Mark Heath..:

编辑:答案已更新,以反映最近版本的NAudio中的更改

可以使用我编写的NAudio开源.NET音频库.它会在您的PC上查找ACM编解码器以进行转换.NAudio提供的Mp3FileReader目前希望能够在源流中重新定位(它预先构建MP3帧的索引),因此不适合通过网络进行流式传输.但是,您仍然可以使用NAudio中的MP3FrameAcmMp3FrameDecompressor类来动态解压缩流式MP3.

我在我的博客上发表了一篇文章,解释了如何使用NAudio播放MP3流.基本上你有一个线程下载MP3帧,解压缩并存储在一个BufferedWaveProvider.然后另一个线程使用BufferedWaveProvider输入作为回放.


[NAudio](https://naudio.codeplex.com)库现在附带一个名为[Mp3StreamingDemo]的示例应用程序(https://naudio.codeplex.com/SourceControl/latest#NAudioDemo/Mp3StreamingDemo/MP3StreamingPanel.cs)这应该提供从网络直播MP3所需的一切.

2> OwenP..:

在声音播放类可以做到这一点.看起来你要做的就是将Stream属性设置为流,然后调用Play.

编辑
我不认为它可以播放MP3文件; 它似乎仅限于.wav.我不确定框架中是否有任何东西可以直接播放MP3文件.我发现的所有内容都涉及使用WMP控件或与DirectX交互.


SoundPlayer与GC有令人讨厌的问题,除非你使用官方的Microsoft解决方法(点击变通办法),否则将随机播放垃圾:http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedidID = 93642

3> 小智..:

低音可以做到这一点.从内存中的Byte []或在您返回数据的直通文件委托中播放,因此您可以在有足够数据开始播放时立即播放.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有