2012-04-03 37 views
21

Trong khi tôi nhận ra rằng AirPlay có độ trễ/độ trễ vốn có, tôi tự hỏi liệu có cách nào cho ứng dụng iPhone (hiện tại giả định) phát hiện độ trễ đó là gì không. Nếu vậy, giá trị độ trễ có thể chính xác đến mức nào? Tôi tò mò hơn về việc liệu một ứng dụng có thể "biết" độ trễ AirPlay của riêng nó, thay vì chỉ đơn giản là giảm thiểu nó.Phát hiện độ trễ AirPlay

+3

Gửi một blip rồi nghe âm thanh trở lại qua micrô? – trapper

+0

Tôi đang tìm thời gian chờ của loa trước. Chỉ mất bao lâu để tín hiệu đi qua mạng. Việc chờ loa và truyền âm sẽ thêm độ trễ bổ sung mà tôi không nhất thiết phải quan tâm. Cảm ơn! –

Trả lời

4

Câu trả lời ngắn gọn là: không, Apple không cung cấp cách để thực hiện việc này. Giả sử bạn cần ứng dụng của mình được chấp thuận trong App Store, bạn sắp hết may mắn. Nếu bạn có thể chạy ứng dụng của mình trên một thiết bị đã được bẻ khóa, bạn có thể tìm kiếm các API không có giấy tờ để cho phép bạn làm được nhiều hơn.

Nếu bạn cần ứng dụng của mình có sẵn trong App Store của Apple, hầu hết mọi thứ bạn có thể thực hiện theo mạng được nêu trong ứng dụng mẫu "Khả năng hiển thị".

Cách duy nhất tôi có thể nghĩ để có được một dự đoán tốt là sử dụng Bonjour để xác định máy chủ lưu trữ (xem mã mẫu tại đây https://developer.apple.com/library/ios/#samplecode/BonjourWeb/Introduction/Intro.html) và sau đó ping máy chủ.

Tuy nhiên:

  • Nếu có nhiều hơn 1 trạm Airplay bạn sẽ cần phải đoán hoặc yêu cầu mà người dùng được kết nối với, hoặc có thể mất trung bình.
  • Thiết bị này có thể không đáp ứng với một ping ở tất cả (Apple TV và Airport Express cả phản ứng ping, không chắc chắn về các thiết bị bên thứ 3.)
  • Các ping có thể không phản ánh độ trễ thực tế của âm thanh

Thay vì dành quá nhiều thời gian về vấn đề này, bạn nên làm theo hướng dẫn của Apple để chuẩn bị âm thanh của bạn cho AirPlay và làm phong phú thêm ứng dụng của bạn cho AirPlay: http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AirPlayGuide/PreparingYourMediaforAirPlay/PreparingYourMediaforAirPlay.html#//apple_ref/doc/uid/TP40011045-CH4-SW1

Hope this helps! :)

34

Độ trễ không đến từ mạng jitter, mà đúng hơn là do thiết bị nguồn (iPhone của bạn) quyết định.

câu chuyện dài ngắn:

  • Đó là luôn luôn chính xác 2s (xuống đến phần nghìn giây) với các thiết bị của Apple.
  • Không có cách nào để tinh chỉnh nó với API công khai.

Độ trễ âm thanh cần phải rất chính xác để nhiều đầu ra có thể phát đồng bộ.

Một số giải thích về thực hiện AirPlay của:

  • Giao thức bắt đầu với một vài RTSP lệnh. Trong quá trình bắt tay này, nguồn phát ra rtpTime, thời gian bắt đầu phát lại cũng là thời gian chờ của bạn. Giá trị điển hình là 88200 = 2s x 44100 Hz.
  • Các thiết bị AirPlay có thể đồng bộ hóa đồng hồ của chúng với nguồn bằng NTP để giảm thiểu độ trễ của mạng.
  • Trong khi phát lại, nguồn sẽ gửi định kỳ gói SYNC để điều chỉnh độ trễ âm thanh và đảm bảo rằng tất cả các thiết bị vẫn được đồng bộ hóa.

Có thể thay đổi độ trễ nếu bạn sử dụng triển khai tùy chỉnh, nhưng Apple thường từ chối chúng.

Kiểm tra điều này writeup để biết thêm thông tin. Bạn cũng có thể đọc số unofficial protocol documentation.

+0

Cảm ơn bạn đã liên kết Laurent. Tôi đã đấu tranh với vấn đề độ trễ này và bình luận 2 giây của bạn sắp xếp rất nhiều. Có vẻ như AVPlayer over Airplay không có độ trễ này nhưng có những hạn chế khác. – amergin

+0

Tham khảo tuyệt vời! Xóa một số bí ẩn không cần thiết xung quanh một tính năng có thể SO tuyệt vời hơn nhiều với kiểm soát nhiều hơn. –

0

Bạn có thể truy vấn hiện tại độ trễ âm thanh phần cứng iOS bằng cách -[AVAudioSession outputLatency],

Theo tài liệu cho outputLatency:

Sử dụng một thiết bị AirPlay kích hoạt cho nội dung âm thanh của bạn có thể dẫn đến một sự chậm trễ 2 giây. Kiểm tra độ trễ này trong nội dung trò chơi.

Và theo kinh nghiệm của tôi, giá trị này thay đổi khi chuyển đổi thiết bị đầu ra, ví dụ:

  • Loa: ~ 10ms
  • Bluetooth: ~ 100 + ms
  • AirPlay: 2s