Tôi đang sử dụng WebRTC
để gửi video từ máy chủ đến trình duyệt của khách hàng (sử dụng số WebRTC API
và máy chủ MCU WebRTC
như Kurento).Đồng bộ hóa dữ liệu với video bằng WebRTC
Trước khi gửi cho khách hàng mỗi khung video chứa siêu dữ liệu (như phụ đề hoặc bất kỳ nội dung đăng ký nào khác). Tôi đang tìm một cách để gửi siêu dữ liệu này cho khách hàng sao cho nó vẫn được đồng bộ hóa (đến thời điểm nó thực sự là được trình bày). Ngoài ra, tôi muốn có thể truy cập dữ liệu này từ phía máy khách (bằng Javascript).
Một số tùy chọn Tôi nghĩ về:
- gửi các dữ liệu do WebRTC DataChannel. Nhưng tôi không biết làm thế nào để đảm bảo dữ liệu được đồng bộ hóa trên cơ sở mỗi khung hình. Nhưng tôi không thể tìm thấy một cách để đảm bảo dữ liệu được gửi bởi kênh dữ liệu và kênh video được đồng bộ hóa (một lần nữa, tôi hy vọng sẽ nhận được mức độ chính xác của một khung hình duy nhất).
- Gửi dữ liệu theo cách thủ công cho khách hàng theo cách nào đó (WebRTC DataChannel, websockets, v.v.) với dấu thời gian phù hợp với dấu thời gian của video. Tuy nhiên, ngay cả khi Kurento hoặc các máy chủ trung gian khác giữ lại thông tin dấu thời gian trong video, theo câu trả lời sau đây, không có cách áp dụng để nhận được dấu thời gian video từ javascript: How can use the webRTC Javascript API to access the outgoing audio RTP timestamp at the sender and the incoming audio RTP timestamp at the receiver?. Tôi đã nghĩ đến việc sử dụng sự kiện
timeupdate
của phần tử video chuẩn, nhưng tôi không konw nếu nó sẽ hoạt động với mức độ chính xác của khung hình và tôi không chắc nó có nghĩa gì trong video trực tiếp như trong WebRTC. - Gửi dữ liệu theo cách thủ công và đính kèm dữ liệu vào video theo cách khác như
TextTrack
. Sau đó, sử dụngonenter
vàonexit
để đọc đồng bộ: http://www.html5rocks.com/en/tutorials/track/basics/. Nó vẫn đòi hỏi các dấu thời gian chính xác, và tôi không chắc chắn làm thế nào để biết các dấu thời gian là gì và nếu Kurento vượt qua chúng. - Sử dụng API thống kê của WebRTC để đếm số khung theo cách thủ công (sử dụng
getstats
) và hy vọng rằng thông tin được cung cấp bởi API này là chính xác.
Cách tốt nhất để làm điều đó là gì và cách giải quyết các vấn đề tôi đã đề cập theo cách nào?
CHỈNH SỬA: Đồng bộ hóa chính xác (ở độ phân giải không quá một khung) siêu dữ liệu với khung thích hợp là bắt buộc.
Bạn sẽ không bao giờ nhận được luồng đồng bộ hoàn hảo nếu bạn tách chúng ra. Bạn có thể thực hiện một hệ thống đệm để đảm bảo không có tiến bộ về phía trước cho đến khi có bộ đệm chấp nhận được có sẵn trong cả hai luồng. Đặt cược tốt nhất của bạn là quên khung hoàn hảo để khớp khung hình, nếu bạn muốn sau đó mã hóa nó thành luồng video dưới dạng video khi đang di chuyển. Ngoài âm thanh và đồ họa, tôi không thể nghĩ tại sao bạn lại cần độ chính xác cao như vậy. Một trong những bạn quên những điều thời gian hoàn hảo sẽ đơn giản hơn rất nhiều. – Blindman67
Cảm ơn, điểm tốt. Dù sao thì câu hỏi là về cách làm điều đó theo lập trình, giả sử rằng tôi có thể đảm bảo rằng luồng siêu dữ liệu đã được tiếp cận với trình duyệt trước luồng video. Đề xuất của bạn để mã hóa lại video có vẻ tốt đẹp, nhưng tôi vẫn cần phải khớp với thời gian của luồng video và luồng siêu dữ liệu - Tôi thậm chí không chắc chắn rằng máy chủ trung lưu giữ dấu thời gian trình bày. – MaMazav
Luồng truyền thông cung cấp một số trợ giúp. Nếu bạn đang sử dụng video HTML5, bạn có thể sử dụng bộ đệm để trả về một đối tượng TimeRanges để cho bạn biết những gì đã được đệm. Giao diện HTMLMediaElement cung cấp currentTime như một thuộc tính ghi đọc. Bạn có thể sử dụng nó để có thời gian tính bằng giây của video. Để có được số khung hiện tại 'frameNumber = Math.floor (videoElement.currentTime/frameRate);' Viết tới currentTime sẽ khiến video tìm kiếm thời gian đó. – Blindman67