Tôi đang làm việc để tạo Thư viện trong C# để sử dụng giao thức Airplay để gửi Ảnh và Video tới Apple TV của tôi (Cụ thể là làm việc với Thế hệ 3 nhưng hy vọng rằng điều này không quan trọng đối với điều này).TcpClient hoặc HttpWebRequest với Apple TV kết thúc sau 30 giây?
Tất cả các lệnh cho Airplay là HTTP trên cổng 70 theo spec này: http://nto.github.com/AirPlay.html
tôi đã thành công trong việc nhận được cả hình ảnh và video để chơi trên TV Apple, nhưng không có vấn đề những gì tôi làm AppleTV sẽ chỉ chơi 30 giây giá trị của video. Có vẻ như máy khách C# của tôi phát ra lệnh play đang ngắt kết nối ngay lúc 30 giây, điều này làm cho AppleTV kết thúc phiên chơi.
lý do tại sao tôi nghĩ rằng đây:
- Chấm dứt ứng dụng client hoàn toàn tạo ra hành vi tương tự như chờ đợi 30 giây (thực chất là ép buộc kết nối để đóng).
- Đóng thủ công kết nối HttpWebRequest hoặc TcpClient tạo ra cùng một hành vi (Midway qua một phiên chơi).
- Bất kể khoảng thời gian tôi giữ điểm dừng để ngăn chặn GetResponse() gọi video luôn luôn hết 30 giây sau khi WebRequest bắt đầu gửi tin nhắn.
- Sử dụng nguồn khác (IIS, máy chủ web bên ngoài) cho video không thay đổi hành vi.
- Ngay cả sau khi video đã được lưu vào bộ nhớ cache trên AppleTV và không phát lại, thời gian chờ vẫn xảy ra.
Tôi khá chắc chắn rằng yêu cầu của khách hàng cần kết nối trong suốt quá trình "phát" video và theo hiểu biết tốt nhất của tôi, tôi đã mã hóa nó để thực hiện điều đó. Tôi thực sự đang ở trí thông minh của tôi kết thúc. Tôi đã thử tất cả mọi thứ mà tôi có thể nghĩ đến bao gồm cả yêu cầu cả HttpWebRequest và TcpClient (cả hai đều hoạt động nhưng cả hai đều hết thời gian), thiết lập thời gian nhận/gửi thành số điên và lặp lại luồng đọc của luồng Tcp để đảm bảo rằng có "hoạt động".
Có vẻ như AppleTV đang chờ tôi gửi thông báo "này, tiếp tục chơi", nhưng tôi vẫn chưa thấy bất cứ điều gì giống như vậy từ bất kỳ nguồn nào trên web. Tôi hy vọng rằng điều này chỉ đơn giản là một cái gì đó ngu ngốc mà tôi không làm dựa trên sự thiếu kiến thức Http/Tcp của tôi.
Đây là mã của tôi:
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
Lưu ý: sử dụng telnet Tôi có thể kết nối với AppleTV trên cổng 7000 và dán vào lệnh này mà đóng toàn bộ video:
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
tôi đang chạy Cassini Webserver trên cổng 82, nhưng điều này cũng làm việc với IIS. Điều này cung cấp thêm bằng chứng cho thấy ngăn xếp Net đang làm điều gì đó dưới mui xe tại 30 giây gây ra một ngắt kết nối.
Việc sử dụng tiêu đề Keep-Alive có giải quyết được điều này có thể không? –
Đó thực sự là điều đầu tiên tôi thử, không may là không giúp được gì. Ý tưởng tuyệt vời mặc dù! – ExcaliburVT
Có thể quá muộn cho bạn nhưng hữu ích cho người khác: triển khai "reverse HTTP" cho phiên của bạn hoặc chỉ thăm dò ý kiến "/ scrub" để giữ cho quá trình phát lại hoạt động - cũng rất hữu ích để có được thời lượng và vị trí của bộ phim. – coyer