使用NAudio播放来自Android设备的音频字节流

时间:2013-06-09 08:31:40

标签: sockets audio stream playback naudio

出于测试目的,我已经实现了c#代码只是为了播放缓冲区的单个片段(通过在while循环中执行它我可以读取来自socket和play的整个数据) 我使用了这三个版本的nAudio(v1.2,v1.3,v1.7)这三个版本在该上下文中给出了不同的错误,我已将它们列在下面(我也很困惑为什么会发生这种情况)。 我附上了我的源代码。

使用NAudio 1.3

  • FormatException未处理。
  • 描述 - 未识别的MP3块
  • 错误行: - 使用(WaveStream blockAlignedStream =                         新的BlockAlignReductionStream(                             WaveFormatConversionStream.CreatePcmStream(                                 新的Mp3FileReader(ms))))
使用NAudio 1.6时

  • InvaliedOperationException未处理
  • 描述 - 在采样率为16000的情况下使用一个采样率为48000的mp3 .Mp3FileReader不支持采样率更改。
  • 错误行 - 相同行

当使用NAudio 1.7

  • NullReferenceException未处理
  • discription - 对象引用未设置为对象的实例。
  • eror line -same line

我使用1.7代替1.6,因为它支持采样率变化(在源中提到)。然后我得到上面的错误。 每次我得到错误行相同的行。 由于我是C#和.net平台的新手,我需要你帮助纠正这个问题。谢谢你,期待着回应。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using NAudio.Wave;
using System.IO;
using System.Threading;

namespace audioTest2
{
    class Program
    {
        public static void Main()
        {

                while (true)
                {
                    Console.WriteLine("Waiting for broadcast");


                    UdpClient listener = new UdpClient(5000);
                    IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, 5000);
                    byte[] buffer = listener.Receive(ref groupEP);
                    using (Stream ms = new MemoryStream())
                    {

                        buffer = listener.Receive(ref groupEP);
                        Console.WriteLine("read : " + buffer.Length);
                        ms.Write(buffer,0,buffer.Length);

                        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);
                                }
                            }
                        }

                    }
                }
            }

        }

}

1 个答案:

答案 0 :(得分:0)

我强烈建议您查看NAudio源代码附带的MP3流媒体演示(在NAudioDemo项目中)。在阅读MP3文件时,您不需要WaveFormatConversionStreamBlockAlignReduction流,您应该避免使用函数回调 - 请改用WaveOutEvent。此外,Mp3FileReader类是为您可以重新定位的整个MP3文件而设计的。您需要的方法是在MP3帧到达时解析它们,单独解码它们,并以某种方式缓冲音频(例如使用{ {1}})。