我正在尝试在windows-runtime上为win8.1和wp8.1的MediaElement编写一个实时的flv流解复用器 .
我已经完成了demux代码,flv文件可以正确地解复用为h264和aac tag-datas .
当我尝试播放网络文件和流时,我遇到了一个非常奇怪的网络问题:
相同的代码,
-
在win8.1下运行,一切都很好,无论文件或网络流如何(证明demux代码没问题);
-
在wp8.1下运行(真正的手机或模拟器),文件很好,网络流坏 - 无论我如何从HttpClient Stream读取字节,目标服务器只给我65536字节数据,然后连接被阻塞,没有任何响应和错误,甚至没有超时,它只是扼杀线程 .
打开流的代码:
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字节 .
有人可以帮帮我吗?
1 回答
我刚刚解决了同样的问题 - 不要使用System.Net.HttpClient,而是使用Windows.Web.Http.HttpClient
System.Net中的一个使用 Headers Connection:默认关闭,这会导致流关闭,只读取65 kB . 它还包含一个错误,它会阻止您将标头覆盖为Keep-Alive(它会抛出一些无意义的异常)