2015-05-27 43 views
1

我基于我的统一游戏里面的NAudio Demo modified for streaming a Shoutcast脚本工作。团结与n音讯RadioStreaming

我试图同时使用更新循环从MonoBehvaiour类删除原来,在我这个脚本流的时候,我只得到一些噪音,但不是音乐。

我通常会得到一个错误,而与格式

MmException相关执行:AcmNotPossible调用acmStreamConvert NAudio.MmException.Try(MmResult结果,System.String功能) NAudio.Wave.Compression.AcmStreamHeader .Convert(的Int32 bytesToConvert, System.Int32 & sourceBytesConverted) NAudio.Wave.Compression.AcmStream.Convert(的Int32 bytesToConvert, System.Int32 & sourceBytesConverted) NAudio.Wave.AcmMp3FrameDecompressor.DecompressFram Ë (NAudio.Wave.Mp3Frame框架,System.Byte [] DEST,的Int32 destOffset)

我与不同的无线电试图上网,但我总是得到这个错误。我不知道发生了什么...任何帮助吗?

public class NAudioStreamer : MonoBehaviour { 

    private IWavePlayer mWaveOutDevice; 


    private WaveStream mMainOutputStream; 
    private WaveChannel32 mVolumeStream; 
    private VolumeWaveProvider16 volumeProvider; 



    private string m_Url = "http://37.59.32.115:8122/"; 


    enum StreamingPlaybackState 
    { 
     Stopped, 
     Playing, 
     Buffering, 
     Paused 
    } 

    private volatile StreamingPlaybackState playbackState = StreamingPlaybackState.Stopped; 


    private bool fullyDownloaded = false; 
    public bool m_Play = false; 
    float timer; 

    void Update() 
    { 
     if (m_Play) 
     { 
      playbackState = StreamingPlaybackState.Buffering; 
      StreamMP3(m_Url); 
      m_Play = false; 
     } 

     switch (playbackState) 
     { 
      case StreamingPlaybackState.Buffering: 
      case StreamingPlaybackState.Playing: 
       StreamMP3(m_Url); 
       break; 

      default:   
       break; 
     } 

    } 

    HttpWebRequest webRequest; 
    BufferedWaveProvider bufferedWaveProvider = null; 
    byte[] buffer = new byte[16384 * 4]; 


    private void StreamMP3(string lUrl) 
    { 
     this.fullyDownloaded = false; 
     webRequest = (HttpWebRequest)WebRequest.Create(lUrl); 

     int metaInt = 0; // blocksize of mp3 data 

     webRequest.Headers.Clear(); 
     webRequest.Headers.Add("GET", "/ HTTP/1.0"); 

     webRequest.Headers.Add("Icy-MetaData", "1"); 
     webRequest.UserAgent = "WinampMPEG/5.09"; 

     HttpWebResponse resp = null; 
     try 
     { 
      resp = (HttpWebResponse)webRequest.GetResponse(); 
     } 
     catch(WebException e) 
     { 
      if (e.Status != WebExceptionStatus.RequestCanceled) 
      { 
       Debug.LogError(e.Message); 
      } 
      return; 
     } 
     // needs to be big enough to hold a decompressed frame 

     try 
     { 
      // read blocksize to find metadata block 
      metaInt = Convert.ToInt32(resp.GetResponseHeader("icy-metaint")); 

     } 
     catch 
     { 
     } 

     IMp3FrameDecompressor decompressor = null; 

     try 
     { 
      using (var responseStream = resp.GetResponseStream()) 
      { 

       ReadFullyStream readFullyStream = new ReadFullyStream(responseStream); 
       //do 
       { 
        if (bufferedWaveProvider != null && bufferedWaveProvider.BufferLength - bufferedWaveProvider.BufferedBytes < bufferedWaveProvider.WaveFormat.AverageBytesPerSecond/4) 
        { 
         Debug.LogError("Buffer getting full, taking a break"); 
         Thread.Sleep(500); 
        } 
        else 
        { 
         Mp3Frame frame = null; 
         try 
         { 

          frame = Mp3Frame.LoadFromStream(readFullyStream, true); 



         } 
         catch (EndOfStreamException) 
         { 
          this.fullyDownloaded = true; 
          Debug.LogError("reached the end of the MP3 file/stream"); 
          // reached the end of the MP3 file/stream 
//       break; 
         } 
         catch (WebException) 
         { 
          // probably we have aborted download from the GUI thread 
//       break; 
         } 
         if (decompressor == null && frame != null) 
         { 
          // don't think these details matter too much - just help ACM select the right codec 
          // however, the buffered provider doesn't know what sample rate it is working at 
          // until we have a frame 
          WaveFormat waveFormat = new Mp3WaveFormat(frame.SampleRate, frame.ChannelMode == ChannelMode.Mono ? 1 : 2, frame.FrameLength, frame.BitRate); 
          decompressor = new AcmMp3FrameDecompressor(waveFormat); 
          if(bufferedWaveProvider == null) 
          { 
           this.bufferedWaveProvider = new BufferedWaveProvider(decompressor.OutputFormat); 
           this.bufferedWaveProvider.BufferDuration = TimeSpan.FromSeconds(20); // allow us to get well ahead of ourselves 
          } 

         } 

         int decompressed = decompressor.DecompressFrame(frame, buffer, 0); 

         if(bufferedWaveProvider != null) 
         { 
          bufferedWaveProvider.AddSamples(buffer, 0, decompressed); 

         } 
        } 
       } 

       if (this.mWaveOutDevice == null && this.bufferedWaveProvider != null) 
       { 
        Debug.Log("Creating WaveOut Device"); 
        this.mWaveOutDevice = new WaveOut(); 
        this.volumeProvider = new VolumeWaveProvider16(bufferedWaveProvider); 
        this.volumeProvider.Volume = 100.0f; 
        mWaveOutDevice.Init(volumeProvider); 

       } 
       else if (bufferedWaveProvider != null) 
       { 
        double bufferedSeconds = bufferedWaveProvider.BufferedDuration.TotalSeconds; 
        if(bufferedSeconds > 0.2f && playbackState == StreamingPlaybackState.Buffering) 
        { 
         Debug.Log("PLaying music..."); 
         mWaveOutDevice.Play(); 
         playbackState = StreamingPlaybackState.Playing; 
        } 

       } 
      } 
     } 
     finally 
     { 
      if (decompressor != null) 
      { 
       decompressor.Dispose(); 
      } 
     } 
    } 
} 

回答

1

的ACM误差或者是指有在机器上没有ACM MP3解码器,或者可能损坏的帧已经被接收(或一些专辑封面误解为帧)。这是后者,你可以捕获错误并忽略它。如果是前者,则需要安装解码器,或使用不同的MP3帧解压缩器。 (可能是NLayer one)。