2012-06-29 4 views
0

Im은 Csharp에서 MP3 스트리밍을 위해 NAudio 데모 응용 프로그램을 사용하려고 시도했습니다. 데모를 테스트 할 때 완벽하게 작동합니다. 그리고 나는 그것을 C# 형식으로 만들려고했지만 오류가 발생합니다. 그것은형식 또는 네임 스페이스 이름 'readFullyStream'을 (를) 찾을 수 없습니다.

"오류 1 형식 또는 네임 스페이스 이름 'readFullyStream은' 찾을 수 없습니다 말한다 (당신은 using 지시문 또는 어셈블리 누락 참조?) C : \ 사용자 \ alioriyadho 문서는 비주얼 스튜디오를 \ \ 2010 \ 프로젝트 \ WindowsFormsApplication5 \ WindowsFormsApplication5 \ 난 오류가 발생 이유를 모르겠어요 89 47 WindowsFormsApplication5 "

Form1.cs를, 내가 모든 참조를 추가하고 그런 식으로 생각합니다.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using NAudio.Wave; 
using System.Net; 
using System.Threading; 
using System.Net.Sockets; 
using System.IO; 
using System.Diagnostics; 
using System.ComponentModel.Composition; 

namespace WindowsFormsApplication5 
{ 
    public partial class MP3StreamingPanel : Form 
    { 
     enum StreamingPlaybackState 
     { 
      Stopped, 
      Playing, 
      Buffering, 
      Paused 
     } 

     public MP3StreamingPanel() 
     { 
      InitializeComponent(); 
      this.volumeSlider1.VolumeChanged += new EventHandler(volumeSlider1_VolumeChanged); 
      this.Disposed += this.MP3StreamingPanel_Disposing; 
     } 

     void volumeSlider1_VolumeChanged(object sender, EventArgs e) 
     { 
      if (this.volumeProvider != null) 
      { 
       this.volumeProvider.Volume = this.volumeSlider1.Volume; 
      } 
     } 

     private BufferedWaveProvider bufferedWaveProvider; 
     private IWavePlayer waveOut; 
     private volatile StreamingPlaybackState playbackState; 
     private volatile bool fullyDownloaded; 
     private HttpWebRequest webRequest; 
     private VolumeWaveProvider16 volumeProvider; 

     delegate void ShowErrorDelegate(string message); 

     private void ShowError(string message) 
     { 
      if (this.InvokeRequired) 
      { 
       this.BeginInvoke(new ShowErrorDelegate(ShowError), message); 
      } 
      else 
      { 
       MessageBox.Show(message); 
      } 
     } 

     private void StreamMP3(object state) 
     { 
      this.fullyDownloaded = false; 
      string url = (string)state; 
      webRequest = (HttpWebRequest)WebRequest.Create(url); 
      HttpWebResponse resp = null; 
      try 
      { 
       resp = (HttpWebResponse)webRequest.GetResponse(); 
      } 
      catch (WebException e) 
      { 
       if (e.Status != WebExceptionStatus.RequestCanceled) 
       { 
        ShowError(e.Message); 
       } 
       return; 
      } 
      byte[] buffer = new byte[16384 * 4]; // needs to be big enough to hold a decompressed frame 

      IMp3FrameDecompressor decompressor = null; 
      try 
      { 
       using (var responseStream = resp.GetResponseStream()) 
       { 
        var readFullyStream = new readFullyStream(responseStream); 
        do 
        { 
         if (bufferedWaveProvider != null && bufferedWaveProvider.BufferLength - bufferedWaveProvider.BufferedBytes < bufferedWaveProvider.WaveFormat.AverageBytesPerSecond/4) 
         { 
          Debug.WriteLine("Buffer getting full, taking a break"); 
          Thread.Sleep(500); 
         } 
         else 
         { 
          Mp3Frame frame = null; 
          try 
          { 
           frame = Mp3Frame.LoadFromStream(readFullyStream); 
          } 
          catch (EndOfStreamException) 
          { 
           this.fullyDownloaded = true; 
           // reached the end of the MP3 file/stream 
           break; 
          } 
          catch (WebException) 
          { 
           // probably we have aborted download from the GUI thread 
           break; 
          } 
          if (decompressor == 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); 
           this.bufferedWaveProvider = new BufferedWaveProvider(decompressor.OutputFormat); 
           this.bufferedWaveProvider.BufferDuration = TimeSpan.FromSeconds(20); // allow us to get well ahead of ourselves 
           //this.bufferedWaveProvider.BufferedDuration = 250; 
          } 
          int decompressed = decompressor.DecompressFrame(frame, buffer, 0); 
          //Debug.WriteLine(String.Format("Decompressed a frame {0}", decompressed)); 
          bufferedWaveProvider.AddSamples(buffer, 0, decompressed); 
         } 

        } while (playbackState != StreamingPlaybackState.Stopped); 
        Debug.WriteLine("Exiting"); 
        // was doing this in a finally block, but for some reason 
        // we are hanging on response stream .Dispose so never get there 
        decompressor.Dispose(); 
       } 
      } 
      finally 
      { 
       if (decompressor != null) 
       { 
        decompressor.Dispose(); 
       } 
      } 
     } 

     private void buttonPlay_Click(object sender, EventArgs e) 
     { 
      if (playbackState == StreamingPlaybackState.Stopped) 
      { 
       playbackState = StreamingPlaybackState.Buffering; 
       this.bufferedWaveProvider = null; 
       ThreadPool.QueueUserWorkItem(new WaitCallback(StreamMP3), textBoxStreamingUrl.Text); 
       timer1.Enabled = true; 
      } 
      else if (playbackState == StreamingPlaybackState.Paused) 
      { 
       playbackState = StreamingPlaybackState.Buffering; 
      } 
     } 

     private void StopPlayback() 
     { 
      if (playbackState != StreamingPlaybackState.Stopped) 
      { 
       if (!fullyDownloaded) 
       { 
        webRequest.Abort(); 
       } 
       this.playbackState = StreamingPlaybackState.Stopped; 
       if (waveOut != null) 
       { 
        waveOut.Stop(); 
        waveOut.Dispose(); 
        waveOut = null; 
       } 
       timer1.Enabled = false; 
       // n.b. streaming thread may not yet have exited 
       Thread.Sleep(500); 
       ShowBufferState(0); 
      } 
     } 

     private void ShowBufferState(double totalSeconds) 
     { 
      labelBuffered.Text = String.Format("{0:0.0}s", totalSeconds); 
      progressBarBuffer.Value = (int)(totalSeconds * 1000); 
     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      if (playbackState != StreamingPlaybackState.Stopped) 
      { 
       if (this.waveOut == null && this.bufferedWaveProvider != null) 
       { 
        Debug.WriteLine("Creating WaveOut Device"); 
        this.waveOut = CreateWaveOut(); 
        waveOut.PlaybackStopped += waveOut_PlaybackStopped; 
        this.volumeProvider = new VolumeWaveProvider16(bufferedWaveProvider); 
        this.volumeProvider.Volume = this.volumeSlider1.Volume; 
        waveOut.Init(volumeProvider); 
        progressBarBuffer.Maximum = (int)bufferedWaveProvider.BufferDuration.TotalMilliseconds; 
       } 
       else if (bufferedWaveProvider != null) 
       { 
        var bufferedSeconds = bufferedWaveProvider.BufferedDuration.TotalSeconds; 
        ShowBufferState(bufferedSeconds); 
        // make it stutter less if we buffer up a decent amount before playing 
        if (bufferedSeconds < 0.5 && this.playbackState == StreamingPlaybackState.Playing && !this.fullyDownloaded) 
        { 
         this.playbackState = StreamingPlaybackState.Buffering; 
         waveOut.Pause(); 
         Debug.WriteLine(String.Format("Paused to buffer, waveOut.PlaybackState={0}", waveOut.PlaybackState)); 
        } 
        else if (bufferedSeconds > 4 && this.playbackState == StreamingPlaybackState.Buffering) 
        { 
         waveOut.Play(); 
         Debug.WriteLine(String.Format("Started playing, waveOut.PlaybackState={0}", waveOut.PlaybackState)); 
         this.playbackState = StreamingPlaybackState.Playing; 
        } 
        else if (this.fullyDownloaded && bufferedSeconds == 0) 
        { 
         Debug.WriteLine("Reached end of stream"); 
         StopPlayback(); 
        } 
       } 

      } 
     } 

     private IWavePlayer CreateWaveOut() 
     { 
      return new WaveOut(); 
      //return new DirectSoundOut(); 
     } 

     private void MP3StreamingPanel_Disposing(object sender, EventArgs e) 
     { 
      StopPlayback(); 
     } 

     private void buttonPause_Click(object sender, EventArgs e) 
     { 
      if (playbackState == StreamingPlaybackState.Playing || playbackState == StreamingPlaybackState.Buffering) 
      { 
       waveOut.Pause(); 
       Debug.WriteLine(String.Format("User requested Pause, waveOut.PlaybackState={0}", waveOut.PlaybackState)); 
       playbackState = StreamingPlaybackState.Paused; 
      } 
     } 

     private void buttonStop_Click(object sender, EventArgs e) 
     { 
      StopPlayback(); 
     } 

     private void waveOut_PlaybackStopped(object sender, StoppedEventArgs e) 
     { 
      Debug.WriteLine("Playback Stopped"); 
      if (e.Exception != null) 
      { 
       MessageBox.Show(String.Format("Playback Error {0}", e.Exception.Message)); 
      } 
     } 
    } 
} 

답변

2

귀하의 문제는 여기에 있습니다 :

   var readFullyStream = new readFullyStream(responseStream); 
       do 

"readFullyStream"new readFullyStream(responseStream)의 요구는 아마 당신의 MP3 라이브러리에있는 어떤 종류의 Type합니다. 대신 선언하려는 변수와 동일한 이름을 사용하고 있습니다.

+0

하지만 문제는 전체 코드가 데모 응용 프로그램에서 잘 작동했기 때문에 코드를 복사하고 참조를 새 프로젝트에 추가하고이 오류를 암시했습니다. – TheZozoOwner

+0

실제로 타입을 시도하지는 않았지만 타입과 같은 이름의 변수를 선언 할 수 있다고 생각하지 않습니다. 'readFullyStream'은 낙타입니다. 라이브러리 작성자가 파스칼 케이스 이름을 지정하지 않고 C# 클래스를 작성하는 것은 거의 불가능합니다. –

+0

문제가 발견되었습니다. 프로젝트에 가져온 클래스가있었습니다. 그것은 해당 파일은 내가 ReadFullyStream.cs에게 INAudioDemoPlugin.cs 필요 물론 Microsoft.ComponentModel.Composition.Initialization.Desktop.dll NAudio.dll NAudio.xml NSpeex.dll System.ComponentModel.Composition .dll – TheZozoOwner

관련 문제