为什么 (httpwebresponse) ResponseStream 停止从网络电台读取数据?
Why the (httpwebresponse) ResponseStream stops reading data from internet radio?
我正在使用此代码从 icecast 收音机获取数据,但 ResponseStream 在收到 64K 时停止读取数据。你能帮我解决这个问题吗?
HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://icecast6.play.cz/radio1-128.mp3");
request.AllowReadStreamBuffering = false;
request.Method = "GET";
request.BeginGetResponse(new AsyncCallback(GetShoutAsync), request);
void GetShoutAsync(IAsyncResult res)
{
HttpWebRequest request = (HttpWebRequest) res.AsyncState;
HttpWebResponse response = (HttpWebResponse) request.EndGetResponse(res);
Stream r = response.GetResponseStream();
byte[] data = new byte[4096];
int read;
while ((read = r.Read(data, 0, data.Length)) > 0)
{
Debug.WriteLine(data[0]);
}
}
我在你的代码中没有发现任何明显的问题。除了不使用 async-await 之外,这大大简化了您正在开发的异步代码类型:-)
“ResponseStream 停止读取”是什么意思?
如果连接断开,那么我的第一想法 — 服务器会这样做。使用 wireshark 确认,然后使用 wireshark 将请求的 HTTP header 与例如开始播放该流的 Winamp。我相信您会发现一些重要的区别。
但如果只是暂停,则属正常。
连接后,流媒体服务器通常会向您发送一些初始数据量,然后它们只会在 real-time 中向您发送数据。因此,在您接收到初始缓冲区后,您将只能以流的速率获取数据,即 16 kbytes/sec 对于您的 128 kbit/sec 收音机。
顺便说一句,一些客户端发送“Initial-Burst”HTTP header 请求,但我找不到关于 header 的文档。当我为 WP7 开发我的收音机时,我基本上复制了其他一些 iOS 应用程序的行为。
最后我写了这段代码来解决这个问题,完全有必要使用命名空间:Windows.Web.Http,就像..
Uri url = new Uri("http://icecast6.play.cz/radio1-128.mp3");
HttpResponseMessage response = await httpClient.GetAsync(
url,
HttpCompletionOption.ResponseHeadersRead);
IInputStream inputStream = await response.Content.ReadAsInputStreamAsync();
try
{
ulong totalBytesRead =
IBuffer buffer = new Windows.Storage.Streams.Buffer(100000);
while (buffer.Length > 0);
{
uffer = await inputStream.ReadAsync(
buffer,
buffer.Capacity,
InputStreamOptions.Partial);
//
// Some stuff here...
totalBytesRead += buffer.Length;
Debug.WriteLine(buffer.Length + " " + totalBytesRead);
}
Debug.WriteLine(totalBytesRead);
希望大家喜欢。
我正在使用此代码从 icecast 收音机获取数据,但 ResponseStream 在收到 64K 时停止读取数据。你能帮我解决这个问题吗?
HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://icecast6.play.cz/radio1-128.mp3");
request.AllowReadStreamBuffering = false;
request.Method = "GET";
request.BeginGetResponse(new AsyncCallback(GetShoutAsync), request);
void GetShoutAsync(IAsyncResult res)
{
HttpWebRequest request = (HttpWebRequest) res.AsyncState;
HttpWebResponse response = (HttpWebResponse) request.EndGetResponse(res);
Stream r = response.GetResponseStream();
byte[] data = new byte[4096];
int read;
while ((read = r.Read(data, 0, data.Length)) > 0)
{
Debug.WriteLine(data[0]);
}
}
我在你的代码中没有发现任何明显的问题。除了不使用 async-await 之外,这大大简化了您正在开发的异步代码类型:-)
“ResponseStream 停止读取”是什么意思?
如果连接断开,那么我的第一想法 — 服务器会这样做。使用 wireshark 确认,然后使用 wireshark 将请求的 HTTP header 与例如开始播放该流的 Winamp。我相信您会发现一些重要的区别。
但如果只是暂停,则属正常。
连接后,流媒体服务器通常会向您发送一些初始数据量,然后它们只会在 real-time 中向您发送数据。因此,在您接收到初始缓冲区后,您将只能以流的速率获取数据,即 16 kbytes/sec 对于您的 128 kbit/sec 收音机。 顺便说一句,一些客户端发送“Initial-Burst”HTTP header 请求,但我找不到关于 header 的文档。当我为 WP7 开发我的收音机时,我基本上复制了其他一些 iOS 应用程序的行为。
最后我写了这段代码来解决这个问题,完全有必要使用命名空间:Windows.Web.Http,就像..
Uri url = new Uri("http://icecast6.play.cz/radio1-128.mp3");
HttpResponseMessage response = await httpClient.GetAsync(
url,
HttpCompletionOption.ResponseHeadersRead);
IInputStream inputStream = await response.Content.ReadAsInputStreamAsync();
try
{
ulong totalBytesRead =
IBuffer buffer = new Windows.Storage.Streams.Buffer(100000);
while (buffer.Length > 0);
{
uffer = await inputStream.ReadAsync(
buffer,
buffer.Capacity,
InputStreamOptions.Partial);
//
// Some stuff here...
totalBytesRead += buffer.Length;
Debug.WriteLine(buffer.Length + " " + totalBytesRead);
}
Debug.WriteLine(totalBytesRead);
希望大家喜欢。