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.

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

  • Полное завершение клиентского приложения приводит к тому же поведению, что и 30-секундное ожидание (, по сути, принудительно закрывающее соединение ).
  • Закрытие соединения HttpWebRequest или TcpClient вручную приводит к такому же поведению (в середине сеанса воспроизведения ).
  • Независимо от того, как долго я удерживаю точку останова, чтобы предотвратить вызов GetResponse (), время ожидания видео всегда истекает через 30 секунд после того, как WebRequest начинает отправлять сообщение.
  • Использование другого источника (IIS, внешнего веб-сервера )для видео не меняет поведение.
  • Даже после того, как видео кэшируется на AppleTV и не воспроизводится повторно -, тайм-аут все равно возникает.

Я почти уверен, что запрос клиента должен оставаться на связи во время «воспроизведения» видео, и, насколько мне известно, я закодировал его для этого. Я действительно в своем уме.Я пробовал все, что мог придумать, включая выполнение запроса как в виде 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 секунд, что приводит к отключению.

5
задан ExcaliburVT 9 August 2012 в 00:55
поделиться