我正在尝试在 Windows 运行时为 win8.1 和 wp8.1 的 MediaElement 编写一个实时 flv 流解复用器。
我已经完成了解复用代码,flv 文件可以正确解复用为 h264 和 aac 标签数据。
当我尝试播放网络文件和流时,我遇到了一个非常奇怪的网络问题:
相同的代码,
- 在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字节,流的下一个Read方法将始终被阻塞。
我确定 uri 可用。我可以使用pc网络浏览器将一些流数据下载为flv文件,并且下载的flv文件也可以在wp8.1下播放。
貌似这个问题只出现在wp8.1下,android和ios不受影响。
那么这是我的代码问题还是实际上服务器设置不正确?
从过去三周开始,我尝试了所有可以打开流的 http 方法,但仍然被 65536 字节阻塞。
有人可以帮我吗?