Cấu trúc của MPD MPEG-DASH



MPEG-DASH Media Presentation Description (MPD) là dạng XML document chứa thông tin về các phân đoạn media, các mối quan hệ và thông tin cần thiết để chọn giữa chúng và các siêu dữ liệu khác có thể được client cần.
Bài post này mô tả các phần quan trọng nhất của MPD, bắt đầu từ top-level (Period) và đến bottom level (Segment).

Period

Period nằm trong top-level của MPD cấp cao nhất, mô tả phần nội dung với thời gian bắt đầu và thời lượng là bao nhiêu. Period có thể được sử dụng cho scence (cảnh) hoặc chapter (chương) để tách biệt phần quảng cáo khỏi nội dung chương trình.

Adaptation Sets

Adaptation Set chứa luồng media hoặc tập hợp các luồng media. Trong trường hợp đơn giản nhất, một Period có thể có một Adaptation Set chứa tất cả nội dung âm thanh và hình ảnh, nhưng để giảm băng thông, mỗi luồng có thể được chia vào trong một Adaptation khác nhau. Một trường hợp phổ biến là một bộ Adaptive Video và nhiều bộ Adaptive Audio (giống như option có nhiều ngôn ngữ). Adaptive có thể chứa phụ đề (subtitle) hoặc metadata tùy biến.
Adaptation Set thường được lựa chọn bởi người dùng hoặc bởi các tác nhân người dùng (trình duyệt web hoặc TV) bằng cách sử dụng tùy chọn của người dùng (như ngôn ngữ hoặc nhu cầu truy cập của họ).

Representations

Representation cho phép bộ Adaptive chứa cùng một nội dung được mã hóa theo các cách khác nhau. Trong hầu hết các trường hợp, Representation sẽ được cung cấp ở screen size và bandwidth. Điều này cho phép client yêu cầu nội dung chất lượng cao nhất mà có thể phát mà không cần chờ buffer, không lãng phí băng thông với các pixel không cần thiết (ví dụ TV 720p không cần nội dung 1080p). Representation cũng có thể được mã hóa bằng các codec khác nhau, cho phép hỗ trợ client với các codec được hỗ trợ khác nhau (như xảy ra trong trình duyệt, với một số hỗ trợ MPEG-4 AVC / h.264 và một số VP8 hỗ trợ) hoặc để cung cấp Representation chất lượng cao hơn cho các client mới hơn trong khi vẫn hỗ trợ client cũ (ví dụ cung cấp cả h.264 và h.265). Nhiều codec cũng có thể hữu ích trên các thiết bị chạy bằng pin, Representation thường được chọn tự động, nhưng một số player cho phép người dùng ghi đè các option (đặc biệt là độ phân giải). Người dùng có thể chọn đưa ra option Representation của riêng mình nếu họ không muốn lãng phí băng thông trong một video (có thể họ chỉ quan tâm đến âm thanh) hoặc nếu họ sẵn sàng dừng video để đổi lại chất lượng chuẩn high quality.

SubRepresentation

SubRepresentation chứa thông tin chỉ áp dụng cho một luồng phương tiện trong Representation. Ví dụ: nếu một Representations có chứa cả âm thanh và video, thì sẽ có một SubRepftimeation để cung cấp thêm thông tin bổ sung là chỉ áp dụng cho âm thanh. Thông tin bổ sung này có thể là các codec cụ thể, tỷ lệ lấy mẫu (sampling rate), nhúng các subtitle (embeded subtitle). SubRepftimeations cũng cung cấp thông tin cần thiết để trích xuất một luồng từ một bộ chứa đa kênh hoặc để trích xuất một phiên bản chất lượng thấp hơn của luồng (như chỉ các I-frame, rất hữu ích trong chế độ chuyển tiếp nhanh – fast-forward mode).

Media Segment

Media Segment là các file media mà client DASH phát, nói chung bằng cách phát chúng qua lại nếu như chúng là cùng một file (mặc dù có thể phức tạp hơn khi chuyển đổi giữa các Representation). Các định dạng sẽ được đề cập chi tiết hơn bởi bài đăng của tôi trên hồ sơ, nhưng hai bộ chứa được mô tả bởi MPEG là Định dạng tệp phương tiện cơ sở ISO - ISO Base Media File Format (ISOBMFF), tương tự như định dạng bộ chứa MPEG-4 và MPEG-TS. WebM trong DASH được mô tả trong một tài liệu trên wiki của dự án WebM .
Location của media segment có thể được chỉ định bằng BaseURL cho single-segment của Representation, mộ danh sách các phân đoạn (SegmentList) hoặc mẫu segment (SegmentTemplate). Thông tin áp dụng cho tất cả các segment có thể được tìm thấy trong SegmentBase. Thời gian bắt đầu và thời lượng bắt đầu một segment có thể được mô tả bằng SegmentTimeline (đặc biệt quan trọng đối với phát trực tiếp, do đó client có thể nhanh chóng xác định phân đoạn mới nhất). Thông tin này cũng có thể xuất hiện ở các mức cao hơn trong MPD, trong trường hợp đó thông tin cung cấp là mặc định trừ khi bị ghi đè bởi thông tin thấp hơn trong hệ thống phân cấp XML. Điều này đặc biệt hữu ích với SegmentTemplate.
Các phân đoạn có thể ở các tệp riêng biệt (phổ biến cho phát trực tiếp) hoặc chúng có thể là các dải byte trong một tệp duy nhất (phổ biến cho tĩnh / "on-demand").

Index Segments

Index Segment (Phân đoạn chỉ mục) có hai loại: một Phân đoạn chỉ mục Representation cho toàn bộ Representation hoặc Phân đoạn chỉ mục duy nhất cho mỗi Media Segment. Phân đoạn chỉ mục Representation luôn là một file riêng biệt, nhưng Index Segment đơn có thể là một phạm vi byte trong cùng một file với Media Sengment.
Index Segment chứa các box 'sidx' của ISOBMFF, với thông tin về thời lượng của Media Segment (theo cả byte và thời gian), các loại điểm truy cập luồng và thông tin gửi tùy chọn trong các hộp 'ssix' (cùng thông tin, nhưng trong các phân đoạn). Trong trường hợp Representation Index Segment, các hộp 'sidx' nối tiếp nhau, nhưng chúng được đặt trước một 'sidx' cho chính phân đoạn chỉ mục.

Thí dụ

Trước khi hoàn thiện, mình sẽ đưa ra một ví dụ và có nhận xét (chú thích) về MPD, để cho các bạn biết MPEG-DASH hoạt động như thế nào.
<?xml version="1.0"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:full:2011" minBufferTime="PT1.5S">
<!— Phần quảng cáo -->
<Period duration="PT30S">
<BaseURL>ad/</BaseURL>
<!-- Toàn bộ nội dung của Adaptation Set -->
<AdaptationSet mimeType="video/mp2t">
<!-- 720p Representation at 3.2 Mbps -->
<Representation id="720p" bandwidth="3200000" width="1280" height="720">
<!-- Chỉ có một segment, vì quảng cáo chỉ dài có 30s -->
<BaseURL>720p.ts</BaseURL>
<SegmentBase>
<RepresentationIndex sourceURL="720p.sidx"/>
</SegmentBase>
</Representation>
<!-- 1080p Representation at 6.8 Mbps -->
<Representation id="1080p" bandwidth="6800000" width="1920" height="1080">
<BaseURL>1080p.ts</BaseURL>
<SegmentBase>
<RepresentationIndex sourceURL="1080p.sidx"/>
</SegmentBase>
</Representation>
</AdaptationSet>
</Period>
<!-- Một nội dung thông thường -->
<Period duration="PT5M">
<BaseURL>main/</BaseURL>
<!-- Chỉ chứa video -->
<AdaptationSet mimeType="video/mp2t">
<BaseURL>video/</BaseURL>
<!-- 720p Representation at 3.2 Mbps -->
<Representation id="720p" bandwidth="3200000" width="1280" height="720">
<BaseURL>720p/</BaseURL>
<!-- Đầu tiên, chúng ta sẽ list tất cả các segment ra -->
<!-- Timescale là "ticks per second" giá trị tick tắc đồng hồ trên một giây, vì thế mỗi segment có độ dài là 1 phút -->
<SegmentList timescale="90000" duration="5400000">
<RepresentationIndex sourceURL="representation-index.sidx"/>
<SegmentURL media="segment-1.ts"/>
<SegmentURL media="segment-2.ts"/>
<SegmentURL media="segment-3.ts"/>
<SegmentURL media="segment-4.ts"/>
<SegmentURL media="segment-5.ts"/>
<SegmentURL media="segment-6.ts"/>
<SegmentURL media="segment-7.ts"/>
<SegmentURL media="segment-8.ts"/>
<SegmentURL media="segment-9.ts"/>
<SegmentURL media="segment-10.ts"/>
</SegmentList>
</Representation>
<!-- 1080p Representation at 6.8 Mbps -->
<Representation id="1080p" bandwidth="6800000" width="1920" height="1080">
<BaseURL>1080/</BaseURL>
<!-- Bởi vì tất cả segments đều có name giống nhau, nên chúng ta sẽ sử dụng SegmentTemplate -->
<SegmentTemplate media="segment-$Number$.ts" timescale="90000">
<RepresentationIndex sourceURL="representation-index.sidx"/>
<!-- Bằng cách thêm SegmentTimeline, cho nên client có thể dễ dàng thấy được có bao nhiêu segment
-->
<SegmentTimeline>
<!-- This reads: Bắt đầu từ time 0, có tất cả 10 segments với một duration of
(5400000 / @timescale) seconds -->
<S t="0" r="10" d="5400000"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
<!-- Chỉ chứa audio -->
<AdaptationSet mimeType="audio/mp2t">
<BaseURL>audio/</BaseURL>
<!-- Chúng ta chỉ cần có một audio representation, bởi vì audio bandwidth thì không quan trọng lắm -->
<Representation id="audio" bandwidth="128000">
<SegmentTemplate media="segment-$Number$.ts" timescale="90000">
<RepresentationIndex sourceURL="representation-index.sidx"/>
<SegmentTimeline>
<S t="0" r="10" d="5400000"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
</Period>
</MPD>
Phần kết luận
Điều này sẽ cung cấp đủ thông tin để hiểu cấu trúc của MPD và ý tưởng chung về cách hoạt động của một client DASH cơ bản. Lần tới, tôi sẽ thảo luận về siêu dữ liệu bổ sung, có thể được sử dụng để làm cho client thông minh hơn nhiều và cung cấp trải nghiệm người dùng tốt hơn.

Post a Comment

Mới hơn Cũ hơn