找不到类型或命名空间名称“readFullyStream”
Posted
技术标签:
【中文标题】找不到类型或命名空间名称“readFullyStream”【英文标题】:The type or namespace name 'readFullyStream' could not be found 【发布时间】:2012-06-29 15:17:35 【问题描述】:我尝试在 Csharp 中使用 NAudio 演示应用程序进行 MP3 流媒体播放,当我测试他们的演示程序时,它运行良好。我试图以 c# 形式创建它,但出现错误。它说
"错误 1 类型或命名空间名称 'readFullyStream' 不能 找到(您是否缺少 using 指令或程序集 参考?) c:\users\alioriyadho\documents\visual studio 2010\Projects\WindowsFormsApplication5\WindowsFormsApplication5\Form1.cs 89 47 WindowsFormsApplication5"
我不知道为什么会出错,我添加了所有引用并这样认为。
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.0s", 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));
【问题讨论】:
【参考方案1】:你的问题在这里:
var readFullyStream = new readFullyStream(responseStream);
do
new readFullyStream(responseStream)
中的“readFullyStream”需要是某种Type
,可能位于您的 MP3 库中。相反,您使用的名称与您尝试声明的变量相同。
【讨论】:
但问题是整个代码在他们的演示应用程序上运行得非常好,我只是复制代码并将引用添加到一个新项目并收到此错误。 我真的不认为你可以声明一个与类型同名的变量,虽然我还没有真正尝试过。readFullyStream
是驼峰式的;库编写者不太可能编写一个 C# 类而不给它一个 PascalCased 名称。
我发现了问题,我必须将一个类导入到项目中。我需要的那些文件是 ReadFullyStream.cs INAudioDemoPlugin.cs,当然还有 Microsoft.ComponentModel.Composition.Initialization.Desktop.dll NAudio.dll NAudio.xml NSpeex.dll System.ComponentModel.Composition.dll
类名真的是camelCased吗?作为记录,将实例变量命名为与其声明的类型相同是一个非常糟糕的主意。即使它有效,但对于必须阅读您的代码的任何人来说,它都会感到非常困惑。以上是关于找不到类型或命名空间名称“readFullyStream”的主要内容,如果未能解决你的问题,请参考以下文章