我正在尝试在windows-runtime上为win8.1和wp8.1的MediaElement编写一个实时的flv流解复用器。
我已经完成了demux代码,flv文件可以正确地分解为h264和aac tag-datas。
当我尝试播放网络文件和流时,我遇到了一个非常奇怪的网络问题:
相同的代码,
打开流的代码:
var uri = new Uri("http://hdl.xxx.com/live/yyyy")
//uri is dymatic
var client = new HttpClient();
var stream = await client.GetStreamAsync(uri);
openStream(stream)
读取数据的代码:
public static byte[] ReadBlocks(this Stream stream, int count)
{
byte[] buffer = new byte[count];
int offset = 0;
int length;
while (offset < count)
{
//a loop statement to guarantee I can get *count* bytes
Debug.WriteLine("read " + (count - offset));
//a debug message show how many bytes do I need
length = stream.Read(buffer, offset, count - offset);
if (length == 0)
{
throw new EndOfStreamException();
}
Debug.WriteLine("got " + length);
//a debug message show how many bytes I got
offset += length;
}
return buffer;
}
例如,当我需要从flv流中获取1024个字节时,我在wp8.1下运行stream.ReadBlocks(1024),调试告诉我:
read 1024
got 768
read 256
然后什么也没发生了。我写了一个额外的计数器,计数器显示一旦服务器发送总共65536个字节,接下来的读取方法将始终被阻塞。
我确信uri可用。我可以使用pc网页浏览器下载一些流数据作为flv文件,这个下载的flv文件也可以在wp8.1下播放。
看起来这个问题只发生在wp8.1下,android和ios不受影响。
这是我的代码问题还是服务器没有正确设置?
从过去的三周开始,我尝试了每个可以打开流的http方法,但仍然被阻塞在65536字节。
有人可以帮帮我吗?答案 0 :(得分:2)
我刚刚解决了同样的问题 - 不要使用System.Net.HttpClient,而是使用Windows.Web.Http.HttpClient
System.Net中的一个使用标题Connection:默认关闭,这会导致流关闭,只读取65 kB。它还包含一个错误,它阻止你将标题重写为Keep-Alive(它会抛出一些无意义的异常)