WP8.1 HttpClient Stream只获得65536字节的数据

时间:2014-09-12 03:32:09

标签: stream windows-runtime httpclient flv

我正在尝试在windows-runtime上为win8.1和wp8.1的MediaElement编写一个实时的flv流解复用器。

我已经完成了demux代码,flv文件可以正确地分解为h264和aac tag-datas。

当我尝试播放网络文件和流时,我遇到了一个非常奇怪的网络问题:

相同的代码,

  1. 在win8.1下运行,一切都很好,无论文件或网络流如何(证明demux代码都可以);
  2. 在wp8.1下运行(真正的手机或模拟器),文件很好,网络流很糟糕 - 无论我如何从HttpClient Stream读取字节,目标服务器只给我65536字节的数据,然后连接被阻塞,没有任何响应和错误,甚至没有超时,它只是窒息线程。
  3. 打开流的代码:

    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 个答案:

答案 0 :(得分:2)

我刚刚解决了同样的问题 - 不要使用System.Net.HttpClient,而是使用Windows.Web.Http.HttpClient

System.Net中的一个使用标题Connection:默认关闭,这会导致流关闭,只读取65 kB。它还包含一个错误,它阻止你将标题重写为Keep-Alive(它会抛出一些无意义的异常)