TcpClient oder HttpWebRequest für Apple TV, das nach 30 Sekunden endet?
Ich arbeite daran, eine Bibliothek in C # zu erstellen, um mithilfe des Airplay-Protokolls Fotos und Videos an mein Apple TV zu senden (speziell für Generation 3, aber das sollte hoffentlich keine Rolle spielen).
Alle Befehle für Airplay lauten wie folgt auf Port 70:http://nto.github.com/AirPlay.html
Es ist mir gelungen, sowohl Fotos als auch Videos auf Apple TV wiederzugeben, aber egal, was ich mache, Apple TV gibt nur Videos im Wert von 30 Sekunden wieder. Es sieht so aus, als würde mein C # -Client, der den Wiedergabebefehl ausgibt, nach 30 Sekunden die Verbindung trennen, wodurch AppleTV die Wiedergabesitzung beendet.
Gründe warum ich das denke:
Das vollständige Beenden der Client-App bewirkt dasselbe Verhalten wie das Warten von 30 Sekunden (im Wesentlichen das Schließen der Verbindung erzwingen).Das manuelle Schließen der HttpWebRequest- oder TcpClient-Verbindung führt zu demselben Verhalten (in der Mitte einer Wiedergabesitzung).Unabhängig davon, wie lange ich den Haltepunkt halte, um zu verhindern, dass GetResponse () das Video aufruft, tritt eine Zeitüberschreitung von 30 Sekunden auf, nachdem WebRequest mit dem Senden der Nachricht begonnen hat.Durch die Verwendung einer anderen Quelle (IIS, externer Webserver) für das Video wird das Verhalten nicht geändert.Auch nachdem das Video auf dem AppleTV zwischengespeichert wurde und nicht erneut gestreamt wird, tritt immer noch eine Zeitüberschreitung auf.Ich bin mir ziemlich sicher, dass die Client-Anfrage während des gesamten "Abspielens" des Videos in Verbindung bleiben muss, und nach meinem besten Wissen habe ich es dafür codiert. Ich bin wirklich am Ende meines Wissens. Ich habe alles versucht, was mir einfällt, einschließlich der Ausführung der Anforderung als HttpWebRequest und als unformatierter TcpClient (beide funktionieren, aber beide haben eine Zeitüberschreitung), Festlegen der Zeitüberschreitungen für Empfangen / Senden auf verrückte Zahlen und Schleifen des Lesens des Tcp-Streams um sicherzustellen, dass es "Aktivität" gibt.
Es ist, als würde AppleTV von mir erwarten, dass ich eine "Hey, spiele weiter" -Nachricht sende, aber ich habe so etwas noch von keiner Quelle im Web gesehen. Ich hoffe, dass dies einfach etwas Dummes ist, das ich aufgrund meines Mangels an HTTP / TCP-Kenntnissen nicht tue.
Hier ist mein Code:
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
Hinweis: Mit Telnet kann ich über Port 7000 eine Verbindung zum AppleTV herstellen und den folgenden Befehl einfügen, der das gesamte Video abspielt:
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
Ich verwende den Cassini-Webserver auf Port 82, aber dies funktioniert auch mit IIS. Dies ist ein weiterer Beweis dafür, dass der .Net-Stack nach 30 Sekunden etwas unter der Haube tut, was zu einer Unterbrechung führt.