2008-10-02 29 views
10

Tôi muốn tự động chuyển nguồn video trong ứng dụng phát trực tuyến video. Tuy nhiên, các nguồn video khác nhau có kích thước hình ảnh duy nhất. Tôi có thể tạo các tệp SDP riêng lẻ cho mỗi nguồn video, nhưng tôi muốn kết hợp chúng thành một tệp SDP duy nhất để ứng dụng khách xem có thể tự động thay đổi kích thước cửa sổ hiển thị khi nguồn video thay đổi. Dưới đây là hai ví dụ file SDP:Nhiều luồng video H.264 trong một phiên RTP

640x480.sdp:

 
v=0 
o=VideoServerIN IP4 192.168.0.2 
s=VideoStream640x480 
t=0 0 
c=IN IP4 192.168.0.2 
m=video 8000/2 RTP/AVP 96 
a=rtpmap:96 H264/90000 
a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=Z01AM5ZkBQHtCAAAAwAIAAADAYR4wZU=,aO48gJ== 
a=control:trackID=1 

960x480.sdp:

 
v=0 
o=VideoServerIN IP4 192.168.0.2 
s=VideoStream960x480 
t=0 0 
c=IN IP4 192.168.0.2 
m=video 8000/2 RTP/AVP 96 
a=rtpmap:96 H264/90000 
a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=J01AM5WwPA9sBAIA,KO4G8gA= 
a=control:trackID=1 

Làm thế nào những tập tin cá nhân có thể được kết hợp vào một tập tin SDP đơn?

Trả lời

8

Các tham số trong hai ví dụ về sdp của bạn rất gần - tên luồng và bộ tham số sprop khác nhau. Tôi cho rằng bạn không quan tâm đến tên luồng. Nếu bạn cần riêng sprop-tham số-bộ và khách hàng hỗ trợ chuẩn này bạn cũng có thể sử dụng các loại tải trọng động riêng cho từng độ phân giải và có một SDP đơn như sau:

 v=0 
    o=VideoServerIN IP4 192.168.0.2 
    s=VideoStream640x480 
    t=0 0 
    c=IN IP4 192.168.0.2 
    m=video 8000/2 RTP/AVP 96 97 
    a=rtpmap:96 H264/90000 
    a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=Z01AM5ZkBQHtCAAAAwAIAAADAYR4wZU=,aO48gJ== 
    a=rtpmap:97 H264/90000 
    a=fmtp:97 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=J01AM5WwPA9sBAIA,KO4G8gA= 
    a=control:trackID=1 

Tương tự như câu trả lời khác nếu bạn không thực sự cần các tên luồng khác nhau hoặc các bộ tham số sprop khác nhau, bạn sẽ có thể sử dụng SDP đầu tiên của mình và chuyển giữa luồng định dạng. Tôi không biết tải trọng thực sự của H.264 hoặc bộ giải mã cụ thể của bạn đủ để đảm bảo rằng điều này sẽ hoạt động trong các ứng dụng của bạn, nhưng nó rất phổ biến trong các ứng dụng hội nghị truyền hình để cho phép tự động chuyển đổi giữa các độ phân giải mà không báo hiệu thay đổi hoặc yêu cầu động riêng loại tải trọng.

Mặc dù bạn có thể nối hai tài liệu SDP như đã đề cập trong câu trả lời khác nhưng tôi không nghĩ rằng nó sẽ giúp ích trong trường hợp này. H.264 bộ giải mã chỉ có thể làm việc với một tham số sprop-parameter-sets duy nhất tại một thời điểm tôi tin. Vì cả hai SDP sẽ có cùng một loại tải trọng, cổng nguồn, vv người nhận sẽ không biết khi nào nên sử dụng tham số bộ tham số sprop nào. CẬP NHẬT: Lưu ý một số triển khai có được sprops của họ inband và không phải từ SDP (hoặc chỉ ban đầu từ SDP). Nếu áp dụng trong môi trường của SDP sprop-tham số bộ có thể được cập nhật inband

Tài liệu tham khảo:

  1. RFC 3984 RTP Payload Format for H.264 Video
  2. New proposed H.264 RTP Payload Format RFC 6184
  3. RFC 4566 SDP: Session Description Protocol

[Xin lỗi vì đã không đưa ra đầy đủ trích dẫn - cảm thấy tự do để sửa]

+0

Tôi cũng sẽ thả các sprop-tham số-bộ và có chúng trong băng tần và chỉ có dòng phương tiện truyền thông một video. Tất cả các bộ mã hóa h264 sẽ có inband anyway. Sau đó tôi sẽ có một số loại kênh sau nếu bạn muốn khách hàng kiểm soát kích thước video được gửi và chỉ chuyển nguồn cấp dữ liệu khi đang di chuyển. Khách hàng chỉ có thể "phát hiện" khi độ phân giải đã thay đổi và thay đổi kích thước hiển thị của nó. Điều này đã làm việc tốt cho tôi. Vấn đề duy nhất là bạn cần phải cập nhật các tham số SDP nếu kích thước của bạn (bit rate) lớn hơn mức profile được chỉ định (không thể ở 5.1 chúng đang sử dụng). –

2

Tôi đã đi qua RFC (RFC2327 - SDP: Session Description Protocol) và có vẻ như bạn chỉ có thể nối hai tài liệu SDP. Tài liệu nêu rõ ràng:

Khi SDP được truyền tải bởi SAP, chỉ cho phép mô tả một phiên cho mỗi gói. Khi SDP được truyền tải bằng các phương tiện khác, nhiều mô tả phiên SDP có thể được nối với nhau (dòng `v = 'cho biết bắt đầu mô tả phiên chấm dứt mô tả trước đó).

0

Tôi nghĩ điều đó phụ thuộc vào bộ giải mã của bạn. Nếu nó hỗ trợ các thông số thay đổi bên trong luồng, thì nếu bạn có thể yêu cầu bộ mã hóa đặt tiêu đề tương ứng khi thay đổi độ phân giải, bộ giải mã của bạn sẽ tự động chuyển đổi.

Câu hỏi của bạn chính xác là gì? Có phải: Làm cách nào để thay đổi độ phân giải mà không dừng/khởi động lại luồng?

Tôi không nghĩ bạn có thể nói trước với bộ giải mã, dưới đây là độ phân giải tiềm năng mà bạn sẽ thấy với một số phép thuật sdp. Hoặc là bộ giải mã của bạn có thể hiểu thay đổi tham số H264, và sau đó bạn là tốt, hoặc bạn phải ngừng khởi động lại toàn bộ điều, và sau đó năng động sdp là đủ.

Tôi biết rằng ví dụ, VLC có thể phát hiện sự thay đổi mã hóa MP4 (ví dụ di chuyển từ tốc độ bit biến sang tốc độ bit không đổi), nhưng sẽ sụp đổ nếu bạn thay đổi độ phân giải Điều duy nhất bạn có thể làm với sdp là kết hợp mô tả phương tiện khác nhau, ví dụ với loại tải trọng động khác nhau và thuộc tính control-id khác nhau.

0

Bạn có thể thực hiện thay đổi tải trọng động hoặc thay đổi cài đặt tham số trong luồng hoặc SIP re-INVITE.

Thay đổi tải trọng có vấn đề nếu bạn không kiểm soát bộ mã hóa và giải mã, bạn cần đảm bảo đầu kia chấp nhận cả tải trọng và chúng sẽ chuyển tải chính xác (và đủ nhanh cho bạn - không yêu cầu trong vấn đề này).

thay đổi trong luồng có vấn đề nếu gói thông số đặt bị mất. Bạn có thể sử dụng một tập hợp các bộ tham số khác (chuyển đổi từ tham số 1 đến 2 khi bạn thay đổi) để tránh giải mã sai - nếu các tập hợp bị mất, bạn sẽ chỉ nhận được ảnh bị đóng băng hoặc trống. Tôi khuyên bạn nên truyền lại cho họ một vài lần (không quá nhanh).

SIP re-INVITE nằm ngoài băng và bắt tay, và do đó an toàn, nhưng thêm thời gian trễ cho bất kỳ công tắc nào và có thể bị trục trặc tùy thuộc vào người nhận và có thể bị từ chối.

(Lưu ý: Tôi là một tác giả của RFC 3984bis, bản cập nhật để RFC 3984)

Các vấn đề liên quan