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));
}
}
}
}
하지만 문제는 전체 코드가 데모 응용 프로그램에서 잘 작동했기 때문에 코드를 복사하고 참조를 새 프로젝트에 추가하고이 오류를 암시했습니다. – TheZozoOwner
실제로 타입을 시도하지는 않았지만 타입과 같은 이름의 변수를 선언 할 수 있다고 생각하지 않습니다. 'readFullyStream'은 낙타입니다. 라이브러리 작성자가 파스칼 케이스 이름을 지정하지 않고 C# 클래스를 작성하는 것은 거의 불가능합니다. –
문제가 발견되었습니다. 프로젝트에 가져온 클래스가있었습니다. 그것은 해당 파일은 내가 ReadFullyStream.cs에게 INAudioDemoPlugin.cs 필요 물론 Microsoft.ComponentModel.Composition.Initialization.Desktop.dll NAudio.dll NAudio.xml NSpeex.dll System.ComponentModel.Composition .dll – TheZozoOwner