TcpClient или HttpWebRequest для Apple TV заканчивается через 30 секунд?

Я работаю над созданием библиотеки в C # для использования протокола Airplay для отправки фотографий и видео на мой Apple TV (особенно работаю с поколением 3, но, надеюсь, это не должно иметь значения).

https://airlib.codeplex.com/

Все команды для Airplay являются HTTP на порту 70 согласно этой спецификации: http://nto.github.com/AirPlay.html

Мне удалось воспроизвести на Apple TV фото и видео, но независимо от того, что я делаю, AppleTV будет воспроизводить видео только на 30 секунд. Похоже, что мой клиент C #, который выдает команду воспроизведения, отключается прямо через 30 секунд, что заставляет AppleTV завершить сеанс воспроизведения.

Причины, почему я так думаю:

Terminating the client app completely produces the same behavior as waiting 30 seconds (essentially forcing the connection to close). Manually closing the HttpWebRequest or TcpClient connection produces the same behavior (Midway through a play session). Regardless of how long I hold the breakpoint to prevent the GetResponse() call the video always times out 30 seconds after the WebRequest begins sending the message. Using a different source (IIS, external webserver) for the video does not change the behavior. Even after the video has cached on the AppleTV and does not re-stream the timeout still occurs.

Я почти уверен, что клиентский запрос должен оставаться на связи в течение всей "игры" видео, и, насколько мне известно, я кодировал его, чтобы сделать это. Я действительно в своем уме. Я перепробовал все, что мог придумать, включая выполнение запроса как в виде HttpWebRequest, так и в виде необработанного TcpClient (который работает, но оба тайм-аута), устанавливая тайм-ауты получения / отправки в сумасшедшие числа, и зацикливая чтение потока Tcp чтобы гарантировать, что есть "активность".

Как будто AppleTV ожидает, что я отправлю «эй, продолжай играть» сообщение, но я еще не видел ничего подобного из любого источника в Интернете. Я надеюсь, что это просто что-то глупое, что я не делаю из-за моего отсутствия знаний Http / Tcp.

Вот мой код:

    Uri url = "http://somevideo.com/video.mov";
    float startPosition = 0;        
    TcpClient tcpClient = new TcpClient("192.168.1.20",7000);
    tcpClient.ReceiveTimeout = 100000;
    tcpClient.SendTimeout = 100000;

    //get the client stream to read data from.
    NetworkStream clientStream = tcpClient.GetStream();

     string body = 
    "Content-Location: " + url + "\n" +
    "Start-Position: " + startPosition + "\n";

    string request = "POST /play HTTP/1.1\n" + 
    "User-Agent: MediaControl/1.0\n" +
    "Content-Type: text/parameters\n" +
    "Content-Length: " + Encoding.ASCII.GetBytes(body).Length + "\n" +           
    "X-Apple-Session-ID:" + _sessionGuid.ToString() + "\n\n";

    sendMessage(clientStream, request);
    sendMessage(clientStream, body);

    byte[] myReadBuffer = new byte[1024];
    StringBuilder myCompleteMessage = new StringBuilder();
    int numberOfBytesRead = 0;

    //incoming message might be bigger than the buffer
    do
    {
        try
        {
            numberOfBytesRead = clientStream.Read(myReadBuffer, 0, myReadBuffer.Length);
            myCompleteMessage.Append(Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
            Thread.Sleep(10);//let the iOS device catch up sending data
        }
        catch (System.IO.IOException) { }
    } while (tcpClient.Connected); //check if it's connected before checking for data available, as maybe the program might get quit and the sockets closed halfway through a read

Примечание: используя telnet, я могу подключиться к AppleTV через порт 7000 и вставить эту команду, которая воспроизводит все видео:

POST /play HTTP/1.1
User-Agent: MediaControl/1.0
Content-Type: text/parameters
Content-Length: 89
X-Apple-Session-ID:fb6d816a-a5ad-4e8f-8830-9642b6e6eb35

Content-Location: http://192.168.1.11:82/2012/2012_03_11/IMG_1328.MOV
Start-Position: 0

Я запускаю веб-сервер Cassini через порт 82, но это также работает с IIS. Это является еще одним доказательством того, что стек .Net в течение 30 секунд делает что-то скрытое, что вызывает отключение.

Ответы на вопрос(1)

Ваш ответ на вопрос