Thông báo

Chỉ có trong Google Ad Manager 360.

Truyền phát thích ứng động qua HTTP (DASH)

Mã hoá điểm chèn quảng cáo trong luồng trực tiếp (DASH)

 đánh dấu trangChuyển đến: Yêu cầu về tệp kê khai và nội dung | Gói, nền tảng và trình phát

Tệp kê khai nhiều giai đoạn so với tệp kê khai một giai đoạn

Ad Manager hỗ trợ nhập cả tệp kê khai nhiều giai đoạn và tệp kê khai một giai đoạn cho DASH.

Với tệp kê khai một khoảng thời gian, nhà xuất bản cung cấp luồng DASH với một giai đoạn duy nhất chứa tất cả nội dung và cơ hội chèn quảng cáo, thay vì nhiều giai đoạn phân biệt chúng. DAI hỗ trợ tệp kê khai một giai đoạn bằng cách chuyển đổi các tệp kê khai đó thành nhiều giai đoạn mỗi lần tìm nạp.

Bạn có thể chọn tệp kê khai được cung cấp dưới dạng một hay nhiều giai đoạn khi thiết lập một luồng trực tiếp trong Google Ad Manager và chọn "DASH" làm định dạng phát trực tuyến.

Bộ chọn loại tệp kê khai DASH trong giao diện Ad Manager.

Hãy tham khảo hướng dẫn này để nắm được kỳ vọng về tệp kê khai nhiều giai đoạntệp kê khai một giai đoạn. Ngoài ra, nếu bạn đang sử dụng tệp kê khai một giai đoạn, thì phụ lục sẽ minh hoạ cách DAI chuyển đổi tệp kê khai một giai đoạn thành tệp kê khai nhiều giai đoạn.

Tính năng Chèn quảng cáo động của Google không hỗ trợ phân đoạn. Bài viết này chỉ mô tả sự hỗ trợ cho việc điều chỉnh tệp kê khai.

Yêu cầu về tệp kê khai và nội dung

Đối với tệp kê khai nhiều giai đoạn

Yêu cầu về tệp kê khai MPEG-DASH nhiều giai đoạn

DAI Google thực hiện các xác thực sau trên MPD thô:

Xác thực phần tử MPD

  • Type được đặt thành dynamic
  • Profile được đặt thành urn:mpeg:dash:profile:isoff-live:2011
  • availabilityStartTime phải khác 0 và giá trị không được thay đổi giữa các lần truy vấn MPD liên tiếp
  • PublishTime phải khác 0 và giá trị của này phải được tăng lên hoặc giữ nguyên giữa các lần truy vấn liên tiếp. Tuy nhiên, mỗi lần cập nhật, thuộc tính publishTime phải được đặt thành thời điểm hiện tại.
  • Bạn phải sử dụng HTTPS cho toàn bộ nội dung DASH được tham chiếu trong cùng một MPD

Ví dụ:

<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" type="dynamic"
profiles="urn:mpeg:dash:profile:isoff-live:2011"
availabilityStartTime="2022-01-01T10:00:00Z"
publishTime="2022-01-01T10:00:00Z"
minimumUpdatePeriod="PT25S" timeShiftBufferDepth="PTM0S" maxSegmentDuration="PT2S"
minBufferTime="PT2S">
  <Period …>
    …
  </Period>
  …
</MPD>

Xác thực phần tử Period

  • Start phải lớn hơn hoặc bằng 0

    Cách này cho phép hỗ trợ khoảng thời gian ISO-8601 có thể tuỳ ý bao gồm một trường ngày dạng số nguyên. Ví dụ: P3DT3H1M30S thể hiện 3 ngày, 3 giờ, 1 phút và 30 giây.

    Hiện tại, chúng tôi không hỗ trợ các dấu chỉ định giai đoạn Năm, Tháng và Tuần theo ISO-8601.

  • Period có ít nhất một phần tử AdaptationSet
  • Bạn chỉ có thể sử dụng các mẫu có địa chỉ theo số và thời gian làm lược đồ địa chỉ

Ví dụ:

<Period start="PT0S">
  <AdaptationSet …>
    …
  </AdaptationSet>
  <AdaptationSet …>
    …
  </AdaptationSet>
</Period>

Giữa các lần truy vấn MPD liên tiếp:

  • Chỉ có thể xoá các phần tử Period khỏi phần đầu của MPD
  • Bạn chỉ có thể thêm các phần tử Period vào phần cuối của MPD
  • Chỉ có thể cập nhật giai đoạn đầu tiên và giai đoạn cuối cùng trong MPD. Không được sửa đổi các giai đoạn khác trong MPD. Bản cập nhật chỉ dành cho:
    • Xoá các phân đoạn hoặc sự kiện khỏi đầu giai đoạn đầu tiên
    • Thêm những phân đoạn hoặc sự kiện mới vào cuối giai đoạn cuối

Xác thực phần tử AdaptationSet

  • AdaptationSet có ít nhất một phần tử Representation
  • Nếu có, các phần tử ContentProtection trong AdaptationSet và các phần tử phụ không được thay đổi giữa các lần truy vấn MPD liên tiếp

Ví dụ:

<AdaptationSet mimeType="video/mp4" startWithSAP="1"
contentType="video" par="16:9"
minWidth="640" maxWidth="640" minHeight="360" maxHeight="360"
maxFrameRate="60/2"
segmentAlignment="true">
  <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
  <ContentComponent id="0" contentType="video" />
  <Representation …>
    …
  </Representation>
  <Representation …>
    …
  </Representation>
</AdaptationSet>

Xác thực phần tử Representation

  • Không được để trống id
  • Không được có phần tử SegmentBase hoặc SegmentList

Ví dụ:

<Representation width="640" height="360" sar="1:1" frameRate="60/2"
codecs="avc1.64001e" id="V300" bandwidth="300000">
  …
</Representation>

Xác thực SegmentTemplate có thời gian

  • Phần tử SegmentTimeline S có thể chứa thuộc tính t — được dùng cho URL nội dung đa phương tiện
    • Nếu không được cung cấp, giá trị sẽ được giả định là 0 đối với phần tử S đầu tiên và đối với các phần tử S tiếp theo, thì giá trị được giả định là tổng thời gian trình bày sớm nhất của phần tử S trước đó và thời lượng liền kề — giá trị của [ t + d × (r + 1) ] của phần tử S trước đó).
    • $Time$$Number$ đều được hỗ trợ trong tệp kê khai nhiều giai đoạn
    • StartNumber của SegmentTemplate không được sử dụng
  • Giữa các lần truy vấn MPD liên tiếp:
    • Bạn chỉ có thể xoá các phân đoạn khỏi đầu SegmentTimeline khi chúng di chuyển ra khỏi ảnh chụp nhanh của phần ghi bằng DVR
    • Bạn chỉ có thể nối các phân đoạn ở cuối SegmentTimeline

Ví dụ:

<SegmentTemplate timescale="90000" initialization="$RepresentationID$/init.mp4"
media="$RepresentationID$/$Time$.m4s">
  <SegmentTimeline>
    <S t="0" d="270000" r="20" />
  </SegmentTimeline>
</SegmentTimeline>

Xác thực thành phần thời gian

DAI Google hỗ trợ thành phần thời gian của thời lượng ISO-8601 và hỗ trợ thành phần ngày dạng số nguyên tuỳ chọn: P0Y0M[n]DT[n]H[n]M[n]S. Thành phần ngày được chuyển đổi thành thời lượng bằng cách xem xét 1 ngày = 24 giờ và được thêm vào thành phần thời gian. Nano giây là độ chi tiết thấp nhất được công nhận.

Ví dụ về định dạng thời gian hợp lệ
  • P0Y0M
  • P0Y0M2D
  • P2D
  • PT3H
  • PT0H3M
  • P0Y0M0DT0H0M1.000S
  • P0Y0M1DT2H4M10S
  • PT0.000000001S
Ví dụ về định dạng thời gian không hợp lệ
  • P
  • PT
  • 2007-03-01
  • P5Y0M1DT2H4M1.000S
  • P0Y1.5M1DT2H4M1.000S
  • P0YiM1DT2H4M1.000S
  • P0Y0M.3DT0H0M1.000S
  • 3h
  • PT100,000H

Yêu cầu đối với các sự kiện thông báo điểm bắt đầu quảng cáo và điểm kết thúc quảng cáo

DAI Google thực hiện các xác thực sau đối với các sự kiện thông báo điểm bắt đầu quảng cáo và điểm kết thúc quảng cáo. Bạn phải điều chỉnh trước nội dung dựa trên những yêu cầu sau:

  • Phải chia bản trình bày nội dung nghe nhìn thành nhiều giai đoạn, trong đó mỗi điểm CUE-OUTCUE-IN của quảng cáo trong video nằm trên một ranh giới của giai đoạn.
  • Các phân đoạn nội dung ở đầu và cuối của mỗi giai đoạn phải được chuẩn bị sao cho mọi khung trong phân đoạn đều nằm trong giai đoạn đó.
  • Khung hình chính/khung IDR phải theo điểm dừng và phải ở đầu giai đoạn. Để đáp ứng yêu cầu này, bạn có thể phải kết thúc giai đoạn bằng một phân đoạn ngắn khi điểm dừng không nằm trên ranh giới tự nhiên.

Báo hiệu điểm chèn quảng cáo

  • Tất cả nội dung liên quan đến một điểm chèn quảng cáo đều phải nằm trong một hoặc nhiều khoảng thời gian liên tiếp. Những giai đoạn đó chỉ được chứa các phân đoạn nội dung cần thay thế.
  • Bạn phải báo hiệu bộ chỉ báo điểm chèn quảng cáo CUE-OUT trong tệp kê khai MPD như một trong các ví dụ sau:

    Ví dụ 1

    • Phần tử SCTE-35 EventStream
    • SchemeIdUri="urn:scte:scte35:2014:xml+bin"
    • Được xác định trong tiêu chuẩn DASH.

    <MPD>

    <Period start="PT0S" id="1">

       <!-- Giai đoạn nội dung -->

       ...

    </Period>

    <Period start="PT32S" id="2">

        <!-- Giai đoạn chèn quảng cáo -->

        <!-- Phân đoạn đầu tiên của giai đoạn này là thời điểm bắt đầu điểm chèn quảng cáo

        và điểm chèn quảng cáo kết thúc bằng phân đoạn cuối cùng -->

        <EventStream timescale="90000"

        schemeIdUri="urn:scte:scte35:2014:xml+bin">

         <Event duration="2520000" id="1">

         <!-- Thời lượng được chỉ định trong sự kiện này phải khớp với thời lượng thực tế

         của giai đoạn càng chính xác càng tốt -->

            <Signal xmlns="http://www.scte.org/schemas/35/2016"

             <Binary>

               /DAlAAAAAAAAAP/wFAUAAAAEf+/+kybGyP4BSvaQAAEBAQAArky/3g==

             <Binary>

           </Signal>

          </Event>

        </EventStream> 

    </Period>

    <Period start="PT60S" id="3"> 

       <!-- Giai đoạn nội dung -->

       ...

       </Period>

    </MPD>

    Ví dụ 2

    • Phần tử SCTE-35 EventStream
    • SchemeIdUri="urn:scte:scte35:2013:xml"
    • Được xác định trong tiêu chuẩn DASH.

    <MPD>

    <Period start="PT0S" id="1">

       <!-- Giai đoạn nội dung -->

       ...

    </Period>

    <Period start="PT32S" id="2">

        <!-- Giai đoạn chèn quảng cáo -->

        <!-- Phân đoạn đầu tiên của giai đoạn này là thời điểm bắt đầu điểm chèn quảng cáo

        và điểm chèn quảng cáo kết thúc bằng phân đoạn cuối cùng -->

       <EventStream timescale="90000"

       schemeIdUri="urn:scte:scte35:2013:xml">

         <Event duration="2520000" id="1">

         <!-- Thời lượng được chỉ định trong sự kiện này phải khớp với thời lượng thực tế

           của giai đoạn càng chính xác càng tốt -->

           <SpliceInfoSection xmlns="urn:scte:scte35:2013:xml">

              <SpliceInsert outOfNetworkIndicator="true" 

              spliceImmediateFlag="true">

                <BreakDuration autoReturn="true"

                duration="2520000"/>

                </SpliceInsert>

            </SpliceInfoSection>

          </Event>

        </EventStream> 

    </Period>

    <Period start="PT60S" id="3"> 

        <!-- Giai đoạn nội dung -->

        ...

    </Period>

    </MPD>

  • Thời lượng chèn quảng cáo chỉ định trong sự kiện CUE-OUT phải bằng tổng thời lượng của tất cả phân đoạn trong các giai đoạn chèn quảng cáo.

Điểm đánh dấu quảng cáo được hỗ trợ

SCTE35 XML Splice Insert

Trong DASH, mã đánh dấu CUE đi kèm với ranh giới phần tử XML Period. Thẻ đánh dấu CUE được cung cấp dưới dạng phần tử Event trong các phần tử EventStream bên trong Period. Ranh giới bổ sung này đủ để xác định mã đánh dấu. Ngoài ra, do các điểm chèn quảng cáo được đánh dấu theo ranh giới Period, nên không cần điểm đánh dấu CUE-IN rõ ràng.

Ví dụ này là một loại đánh dấu SCTE35 dựa trên XML cho DASH. Loại này tương tự như SCTE35 Binary Splice Insert, ngoại trừ dữ liệu được phân tích cú pháp và trình bày dưới dạng XML thay vì dạng tệp nhị phân.

Ví dụ:

<Period>

  <EventStream timescale="90000" schemeIdUri="urn:scte:scte35:2013:xml">

     <Event duration="2520000" id="1">

       <SpliceInfoSection xmlns="urn:scte:scte35:2013:xml">

          <SpliceInsert outOfNetworkIndicator="true" spliceImmediateFlag="true">

          <BreakDuration autoReturn="true" duration="2520000"/>

          </SpliceInsert>

        </SpliceInfoSection>

      </Event>

    </EventStream>

</Period>

Tín hiệu thời gian XML SCTE35

Trong DASH, thẻ đánh dấu CUE đi kèm với ranh giới phần tử XML Period. Thẻ đánh dấu CUE được cung cấp dưới dạng phần tử Event trong các phần tử EventStream bên trong Period. Ranh giới bổ sung này đủ để xác định mã đánh dấu. Ngoài ra, do các điểm chèn quảng cáo được đánh dấu theo ranh giới Period, nên không cần điểm đánh dấu CUE-IN rõ ràng.

Ví dụ này là một loại mã đánh dấu SCTE35 dựa trên XML cho DASH. Loại này tương tự như Tín hiệu thời gian nhị phân SCTE35, ngoại trừ việc dữ liệu được phân tích cú pháp và trình bày dưới dạng tệp XML thay vì tệp nhị phân.

Ví dụ:

<Period>

  <EventStream timescale="90000" schemeIdUri="urn:scte:scte35:2013:xml">

     <Event duration="2520000" id="1">

       <SpliceInfoSection xmlns="urn:scte:scte35:2013:xml">

          <TimeSignal outOfNetworkIndicator="true" spliceImmediateFlag="true">

             <SpliceTime ptsTime="123123"/>

          </TimeSignal>

          <SegmentationDescriptor  segmentationEventId="123123" segmentationEventCancelIndicator="false" segmentationDuration="123123">

             <DeliveryRestrictions webDeliveryAllowedFlag="false" noRegionalBlackoutFlag="true" archiveAllowedFlag="false" deviceRestrictions="3"/>            

             <SegmentationUpid segmentationUpidType="14" segmentationTypeId="52" >11111</SegmentationUpid>

          </SegmentationDescriptor>

        </SpliceInfoSection>

      </Event>

    </EventStream>

</Period>

SegmentationTypeId cho biết loại tín hiệu thời gian.

Giá trị SegmentationTypeId sau đây được ghi nhận là tín hiệu thời gian CUE-OUT (bắt đầu quảng cáo) hợp lệ:

34 : Break Start (Bắt đầu điểm chèn quảng cáo)
48 : Provider Advertisement Start (Bắt đầu quảng cáo của nhà cung cấp)
52 : Provider Placement Opportunity Start (Bắt đầu cơ hội cho vị trí của nhà cung cấp)

Giá trị SegmentationTypeId sau đây được ghi nhận là tín hiệu thời gian CUE-IN (kết thúc quảng cáo) hợp lệ:

35 : Break End (Kết thúc điểm chèn quảng cáo)
49 : Provider Advertisement End (Kết thúc quảng cáo của nhà cung cấp)
53 : Provider Placement Opportunity End (Kết thúc cơ hội cho vị trí của nhà cung cấp)

SCTE35 Binary Splice Insert

Trong DASH, mã đánh dấu CUE đi kèm với ranh giới phần tử XML Period. Thẻ đánh dấu CUE được cung cấp dưới dạng phần tử Event trong các phần tử EventStream bên trong Period. Ranh giới bổ sung này đủ để xác định mã đánh dấu. Ngoài ra, do các điểm chèn quảng cáo được đánh dấu theo ranh giới Period, nên không cần điểm đánh dấu CUE-IN rõ ràng.

Ví dụ này thể hiện mã đánh dấu SCTE35 cho DASH.

Ví dụ:

<Period>

    <EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin">

      <Event duration="2520000" id="1">

       <Signal xmlns="http://www.scte.org/schemas/35/2016">

         <Binary>

         /DAlAAAAAAAAAP/wFAUAAAAEf+/+kybGyP4BSvaQAAEBAQAArky/3g==

         </Binary>

       </Signal>

      </Event>

    </EventStream>

 ...

<Period>

Tín hiệu thời gian nhị phân SCTE35: Bắt đầu/kết thúc điểm chèn quảng cáo

Dữ liệu tệp nhị phân SCTE-35 (mã hóa base64) phải được giải mã và phân tích cú pháp để xác định liệu dữ liệu này có chứa CUE-OUT/CUE-IN hợp lệ, cùng với bất kỳ thông tin nhắm mục tiêu điểm chèn nào hay không.

Ví dụ: dữ liệu tệp nhị phân sau đây chứa tín hiệu CUE-OUT hợp lệ:

Ví dụ:

<Period>

    <EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin">

      <Event duration="2520000" id="1">

       <Signal xmlns="http://www.scte.org/schemas/35/2016">

         <Binary>

           /DAsAAAAAyiYAP/wBQb/PVbrDQAWAhRDVUVJB48zWH//AAEuGvsAACIAAdRJqiI=

         </Binary>

       </Signal>

      </Event>

    </EventStream>

 ...

<Period>

Khi đã được giải mã, thông báo có chứa các trường sau:

  • splice_command_type, khi được đặt thành giá trị 6, cho biết đây là tín hiệu thời gian
  • segment_type_id cho biết loại tín hiệu thời gian

Giá trị segment_type_id sau đây được công nhận là tín hiệu thời gian CUE-OUT hợp lệ:

34: Bắt đầu chèn quảng cáo

Giá trị segmentation_type_id sau đây (khi splice_command_type = 6) được công nhận là tín hiệu thời gian CUE-IN hợp lệ:

35: Kết thúc chèn quảng cáo

SCTE35 Binary Time Signal: Provider Ad Start/End

Dữ liệu tệp nhị phân SCTE-35 (mã hóa base64) phải được giải mã và phân tích cú pháp để xác định liệu dữ liệu này có chứa CUE-OUT/CUE-IN hợp lệ, cùng với bất kỳ thông tin nhắm mục tiêu điểm chèn nào hay không.

Ví dụ: dữ liệu tệp nhị phân sau đây chứa tín hiệu CUE-OUT hợp lệ:

Ví dụ:

<Period>

    <EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin">

      <Event duration="2520000" id="1">

       <Signal xmlns="http://www.scte.org/schemas/35/2016">

         <Binary>

           /DBcAAAAAAAAAP/wBQb//ciI8QBGAh1DVUVJXQk9EX+fAQ5FUDAxODAzODQwMDY2NiEEZAIZQ1VFSV0JPRF/3wABLit7AQVDMTQ2NDABAQEKQ1VFSQCAMTUwKnPhdcU=

         </Binary>

       </Signal>

      </Event>

    </EventStream>

 ...

<Period>

Khi đã được giải mã, thông báo có chứa các trường sau:

  • splice_command_type, khi được đặt thành giá trị 6, cho biết đây là tín hiệu thời gian
  • segment_type_id cho biết loại tín hiệu thời gian

Giá trị segment_type_id sau đây được công nhận là tín hiệu thời gian CUE-OUT hợp lệ:

48 : Provider Advertisement Start

Giá trị segmentation_type_id sau đây (khi splice_command_type = 6) được công nhận là tín hiệu thời gian CUE-IN hợp lệ:

49 : Provider Advertisement End (Quảng cáo của nhà cung cấp kết thúc)

SCTE35 Binary Time Signal: Provider Placement Opportunity

Dữ liệu tệp nhị phân SCTE-35 (mã hóa base64) phải được giải mã và phân tích cú pháp để xác định liệu dữ liệu này có chứa CUE-OUT/CUE-IN hợp lệ, cùng với bất kỳ thông tin nhắm mục tiêu điểm chèn nào hay không.

Ví dụ: dữ liệu tệp nhị phân sau đây chứa tín hiệu CUE-OUT hợp lệ:

Ví dụ:

<Period>

    <EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin">

      <Event duration="2520000" id="1">

       <Signal xmlns="http://www.scte.org/schemas/35/2016">

         <Binary>

           /DA0AAAAAAAA///wBQb+cr0AUAAeAhxDVUVJSAAAjn/PAAGlmbAICAAAAAAsoKGKNAIAmsnRfg==

         </Binary>

       </Signal>

      </Event>

    </EventStream>

 ...

<Period>

Khi đã được giải mã, thông báo có chứa các trường sau:

  • splice_command_type, khi được đặt thành giá trị 6, cho biết đây là tín hiệu thời gian
  • segment_type_id cho biết loại tín hiệu thời gian

Giá trị segment_type_id sau đây được công nhận là tín hiệu thời gian CUE-OUT hợp lệ:

52 : Provider Placement Opportunity Start

Giá trị segmentation_type_id sau đây (khi splice_command_type = 6) được công nhận là tín hiệu thời gian CUE-IN hợp lệ:

53 : Provider Placement Opportunity End (Kết thúc cơ hội vị trí nhà cung cấp)

Macro cho thẻ đánh dấu SCTE-35

Nếu nguồn cấp dữ liệu của bạn có mã đánh dấu EXT-OATCLS-SCTE35 hoặc EXT-X-DATERANGE, thì siêu dữ liệu sẽ tự động được trích xuất và cung cấp thông qua khoá-giá trị tuỳ chỉnh. Bạn cần phải thiết lập khoá-giá trị tuỳ chỉnh rồi chèn khoá đó dưới dạng macro khi tạo thẻ quảng cáo.

Khi bạn thiết lập khóa-giá trị tùy chỉnh mới cho trường SCTE-35, hãy sử dụng khóa tùy chỉnh (ví dụ: "scte35") và đặt giá trị cho (các) macro tương ứng với loại trường có sẵn trong nguồn cấp dữ liệu của bạn:

Macro Nội dung mô tả
%%SPLICE_INSERT_EVENT_ID%% Số nguyên không dấu trong thông báo SCTE35 được chuyển đổi thành các chuỗi dưới dạng số thập phân.
%%SPLICE_INSERT_UPID%%
%%TIME_SIGNAL_EVENT_ID%%
%%TIME_SIGNAL_UPID%% Hiển thị dưới dạng số thập lục phân viết thường, không có tiền tố 0x.
%%TIME_SIGNAL_UPID_RAW%% Chèn byte thô từ thông báo SCTE mà không cần chuyển đổi số thập lục phân (chuỗi ban đầu phải là chuỗi được mã hoá UTF-8 hợp lệ).
%%AFMM_CBC%% Trích xuất mã điểm chèn quảng cáo từ thông tin điểm ghép nối (đây là yêu cầu đối với quy cách AF2M của Pháp).
Nội dung DASH phải tuân theo tất cả các quy tắc chỉ định trong phần Yêu cầu và nguyên tắc cung cấp dịch vụ của Điểm khả năng tương tác DASH-IF.
Đối với tệp kê khai một giai đoạn

Dự kiến về tệp kê khai MPEG-DASH một giai đoạn

DAI Google thực hiện các xác thực sau trên MPD thô:

Xác thực phần tử MPD

  • Type được đặt thành dynamic
  • Profiles được đặt thành urn:mpeg:dash:profile:isoff-live:2011
  • AvailabilityStartTime phải khác 0 và giá trị không được thay đổi giữa các lần truy vấn MPD liên tiếp
  • PublishTime phải khác 0 và giá trị của này phải được tăng lên hoặc giữ nguyên giữa các lần truy vấn liên tiếp
  • MPD có đúng một phần tử Period
  • Bạn phải sử dụng HTTPS cho toàn bộ nội dung DASH được tham chiếu trong cùng một MPD

Ví dụ:

<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" type="dynamic"
profiles="urn:mpeg:dash:profile:isoff-live:2011"
availabilityStartTime="2022-01-01T10:00:00Z"
publishTime="2022-01-01T10:00:00Z"
minimumUpdatePeriod="PT25S" timeShiftBufferDepth="PTM0S" maxSegmentDuration="PT2S"
minBufferTime="PT2S">
  <Period …>
    …
  </Period>
  …
</MPD>

Xác thực phần tử Period

  • Start phải lớn hơn hoặc bằng 0
  • Period có ít nhất một phần tử AdaptationSet

Ví dụ:

<Period start="PT0S">
  <AdaptationSet …>
    …
  </AdaptationSet>
  <AdaptationSet …>
    …
  </AdaptationSet>
</Period>

Xác thực phần tử EventStream

Giữa các lần truy vấn MPD liên tiếp:

  • Bạn chỉ có thể xoá các phần tử Event khỏi đầu EventStream
  • Bạn chỉ có thể thêm các phần tử Event vào cuối EventStream

Xác thực phần tử AdaptationSet

  • AdaptationSet có ít nhất một phần tử Representation
  • Nếu có, các phần tử ContentProtection trong AdaptationSet và các phần tử phụ không được thay đổi giữa các lần truy vấn MPD liên tiếp

Ví dụ:

<AdaptationSet mimeType="video/mp4" startWithSAP="1"
contentType="video" par="16:9"
minWidth="640" maxWidth="640" minHeight="360" maxHeight="360"
maxFrameRate="60/2"
segmentAlignment="true">
  <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
  <ContentComponent id="0" contentType="video" />
  <Representation …>
    …
  </Representation>
  <Representation …>
    …
  </Representation>
</AdaptationSet>

Xác thực phần tử Representation

  • Không được để trống id
  • Không được có phần tử SegmentBase hoặc SegmentList

Ví dụ:

<Representation width="640" height="360" sar="1:1" frameRate="60/2"
codecs="avc1.64001e" id="V300" bandwidth="300000">
  …
</Representation>

Xác thực SegmentTemplate có $Time$

  • Phần tử SegmentTimeline S có thể chứa thuộc tính t — được dùng cho URL nội dung đa phương tiện
    • Nếu không được cung cấp, giá trị sẽ được giả định là 0 đối với phần tử S đầu tiên và đối với các phần tử S tiếp theo, thì giá trị được giả định là tổng thời gian trình bày sớm nhất của phần tử S trước đó và thời lượng liền kề — giá trị của [ t + d × (r + 1) ] của phần tử S trước đó).
    • $Time$ được hỗ trợ cho tệp kê khai một giai đoạn; $Number$ chưa được hỗ trợ
    • StartNumber của SegmentTemplate không được sử dụng
  • Giữa các lần truy vấn MPD liên tiếp:
    • Bạn chỉ có thể xoá các phân đoạn khỏi đầu SegmentTimeline khi chúng di chuyển ra khỏi ảnh chụp nhanh của phần ghi bằng DVR
    • Bạn chỉ có thể nối các phân đoạn ở cuối SegmentTimeline

Ví dụ:

<SegmentTemplate timescale="90000" initialization="$RepresentationID$/init.mp4"
media="$RepresentationID$/$Time$.m4s">
  <SegmentTimeline>
    <S t="0" d="270000" r="20" />
  </SegmentTimeline>
</SegmentTimeline>

Xác thực thành phần thời gian

DAI Google hỗ trợ thành phần thời gian của thời lượng ISO-8601 và hỗ trợ thành phần ngày dạng số nguyên tuỳ chọn: P0Y0M[n]DT[n]H[n]M[n]S. Thành phần ngày được chuyển đổi thành thời lượng bằng cách xem xét 1 ngày = 24 giờ và được thêm vào thành phần thời gian. Nano giây là độ chi tiết thấp nhất được công nhận.

Ví dụ về định dạng thời gian hợp lệ
  • P0Y0M
  • P0Y0M2D
  • P2D
  • PT3H
  • PT0H3M
  • P0Y0M0DT0H0M1.000S
  • P0Y0M1DT2H4M10S
  • PT0.000000001S
Ví dụ về định dạng thời gian không hợp lệ
  • P
  • PT
  • 2007-03-01
  • P5Y0M1DT2H4M1.000S
  • P0Y1.5M1DT2H4M1.000S
  • P0YiM1DT2H4M1.000S
  • P0Y0M.3DT0H0M1.000S
  • 3h
  • PT100,000H

Yêu cầu đối với các điểm đánh dấu SCTE-35 đầu vào

DAI Google thực hiện các xác thực sau trên các điểm đánh dấu SCTE-35 đầu vào:

Xác thực điểm nối

DAI Google chỉ nhận ra điểm nối khi các điểm đánh dấu SCTE-35 được mang trong các phần tử Event DASH MPD nếu các điểm này vượt qua các quá trình xác thực sau:

  • Dữ liệu SCTE-35 được mã hoá Base64 phải được chứa trong phần tử Binary của phần tử Signal của sự kiện
    • Có hỗ trợ Splice_insert
    • Hỗ trợ Time_signal có lệnh segmentation_descriptor
  • Các phần tử EventStream chứa các sự kiện có điểm đánh dấu SCTE-35 phải đặt schemeIdUri thành urn:scte:scte35:2014:xml+bin
  • Bạn phải đặt vùng chứa tên Signal thành http://www.scte.org/schemas/35/2016
  • Đối với điểm bắt đầu quảng cáo, bạn phải đặt presentationTime trong Event
  • Đối với điểm kết thúc quảng cáo, bạn phải đặt presentationTime trong Eventkhông đặt thời lượng
  • Các phần tử Event trong EventStream phải được sắp xếp thứ tự theo presentationTime
Điểm nối cung cấp cơ hội để chuyển từ nguồn phát trực tiếp này sang nguồn khác. Điểm nối có thể là điểm bắt đầu quảng cáo, là cơ hội để chuyển sang điểm chèn quảng cáo hoặc điểm kết thúc quảng cáo. Đây là cơ hội để quay lại sau điểm chèn quảng cáo.

Trong bối cảnh này, các điểm nối được dùng để chia Period thành nội dung riêng biệt và ngắt các phần tử Period dựa trên thời gian trình bày và/hoặc thời lượng của các điểm nối. Các điểm nối này do các phần tử Event chứa các điểm đánh dấu SCTE-35 cung cấp.

xác thực splice_insert

  • Điểm bắt đầu quảng cáo là splice_insertout_of_network_indicator được đặt thành 1
  • Điểm kết thúc quảng cáo là splice_insertout_of_network_indicator được đặt thành 0
  • Điểm kết thúc quảng cáo là không bắt buộc khi và chỉ khi Event chứa điểm bắt đầu quảng cáo là splice_insertduration có giá trị khác 0
    • DAI Google diễn giải điểm kết thúc quảng cáo splice_insert ngầm định với thời gian trình bày là presentationTime + duration của điểm bắt đầu quảng cáo
    • Sự kiện điểm kết thúc quảng cáo rõ ràng có thể kết thúc điểm bắt đầu quảng cáo trước khi hết thời lượng. Đây là cách kích hoạt chế độ trả về sớm.

xác thực time_signal

  • Điểm bắt đầu quảng cáo là một time_signalsegmentation_descriptor và có segmentation_type_id khớp với:
    • 34 — Bắt đầu chèn quảng cáo
    • 48 — Bắt đầu quảng cáo của nhà cung cấp
    • 52 — Bắt đầu cơ hội đặt quảng cáo của nhà cung cấp
  • Điểm kết thúc quảng cáo là time_signalsegmentation_descriptor và có segmentation_type_id khớp với:
    • 35 — Kết thúc chèn quảng cáo
    • 49 — Kết thúc quảng cáo của nhà cung cấp
    • 53 — Kết thúc cơ hội đặt quảng cáo của nhà cung cấp
  • Tất cả segmentation_type_ids khác không được hỗ trợ
  • Time_signal không hỗ trợ tính năng tự động trả về từ điểm chèn quảng cáo với điểm kết thúc quảng cáo rõ ràng

Xác thực thời gian trình bày

DAI Google không hỗ trợ chia tách các phân đoạn nên chỉ cho phép sai số 100 mili giây đối với cách tính thời lượng trình bày tối đa của điểm nối tính từ ranh giới phân đoạn gần nhất.

  • Thời gian trình bày của một điểm nối có liên quan đến availabilityStartTime của MPD bằng cách thêm presentationTime của Event được điều chỉnh theo timescale của EventStream đến start của Period.

    Bạn có thể tính thời gian trình bày của điểm bắt đầu quảng cáo ngầm định bằng cách cộng thời lượng với thời gian trình bày của điểm bắt đầu quảng cáo có liên quan. Thời lượng của một điểm nối được tính toán bằng duration của Event / timescale của EventStream.

    Trong trường hợp này, thời gian và thời lượng PTS được cung cấp trong tín hiệu SCTE-35 không được dùng để tính thời gian hoặc thời lượng trình bày.

  • Điểm bắt đầu quảng cáo không được ở cùng ranh giới Segment như điểm bắt đầu quảng cáo khác hoặc điểm kết thúc quảng cáo
  • Một hoặc nhiều điểm kết thúc quảng cáo có thể ở cùng một ranh giới của Segment (ví dụ: điểm chèn sớm được kích hoạt cùng lúc với thời điểm thực tế của điểm chèn). Điểm kết thúc quảng cáo trùng lặp trên thực tế sẽ bị bỏ qua.

Giai đoạn, sự kiện thông báo điểm bắt đầu quảng cáo và điểm kết thúc quảng cáo

Period mới sẽ được chèn cả ở thời điểm bắt đầu và kết thúc sự kiện điểm bắt đầu quảng cáo (hoặc bắt đầu sự kiện điểm bắt đầu quảng cáo và điểm kết thúc quảng cáo) khi tạo bản trình bày nhiều giai đoạn của tệp kê khai một giai đoạn.

  • Thời điểm bắt đầu của Period mới đầu tiên được biểu thị bằng thời gian trình bày của điểm bắt đầu quảng cáo và thời điểm bắt đầu của Period mới thứ hai là tổng của presentationTimeduration của điểm bắt đầu quảng cáo hoặc presentationTime của điểm kết thúc quảng cáo, nếu được cung cấp.
    • Nếu điểm kết thúc quảng cáo được cung cấp cho điểm bắt đầu quảng cáo có duration, thì Period sẽ được chia tách theo điểm nối trước đó
  • DAI Google bỏ qua các trường splice_time, break_duration, auto_returnsplice_immediate_flag trong thông báo SCTE-35

Phải có một Event báo hiệu thông báo điểm bắt đầu quảng cáo trong suốt thời lượng chèn quảng cáo.

Điều này không có nghĩa là Event đầu tiên trong EventStream luôn là một thông báo điểm bắt đầu quảng cáo. Khi có phần ghi bằng DVR đầu vào đủ lâu, có thể có những sự kiện thuộc về những điểm chèn trước đó trong phần này.

Thông báo điểm bắt đầu quảng cáo sẽ kết thúc bằng thông báo điểm kết thúc quảng cáo tiếp theo.

  • Mã nối SCTE-35 (splice_event_id hoặc segmentation_event_id) và thuộc tính id của sự kiện bị bỏ qua
  • Thông báo điểm bắt đầu quảng cáo splice_insert dự kiến chỉ kết thúc bằng một thông báo điểm kết thúc quảng cáo splice_insert, nếu auto_return không được đặt
  • Thông báo điểm bắt đầu quảng cáo time_signal dự kiến chỉ kết thúc bằng một thông báo điểm kết thúc quảng cáo time_signal có cùng segmentation_type_id
Thông báo điểm bắt đầu quảng cáo theo ngay sau một thông báo khác trước khi hết thời lượng sẽ kết thúc điểm chèn ban đầu và bắt đầu một điểm chèn khác (nói cách khác là dẫn đến một Period mới).

Ví dụ:

<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin" timescale="600" presentationTimeOffset="991724821200">

  <Event presentationTime="992568282204" duration="18073" id="1615447966">

    <Signal xmlns="http://www.scte.org/schemas/35/2016">

      <Binary>/DAbAAAAAAAAAP/wCgUAAAAAf98AAAAAAAAHeq0Q</Binary>

    </Signal>

  </Event>

  <Event presentationTime="992568300277" id="1085695472">

    <Signal xmlns="http://www.scte.org/schemas/35/2016">

      <Binary>/DAbAAAAAAAAAP/wCgUAAAAAf18AAAAAAAAqqkN1</Binary>

    </Signal>

  </Event>

</EventStream>

Nền tảng, trình đóng gói và trình phát được hỗ trợ

Nền tảng

Thiết bị/trình duyệt

Phiên bản

DRM

Trình duyệt Chrome

66 trở lên

Widevine

Trình duyệt Firefox

60 trở lên

Widevine

Microsoft Edge

18

PlayReady

Android

4.4 trở lên

Widevine

Chromecast

Gen2, Ultra (CAF API)

Widevine

Roku

3, 4 (chương trình cơ sở 8.1)

PlayReady

 

Trình tạo gói

Shaka

2.1.0

Hỗ trợ nhiều giai đoạn

Bitmovin

1.47.3

Hỗ trợ nhiều giai đoạn

Truyền trực tuyến hợp nhất

1.11.17 Hỗ trợ một giai đoạn
 

Trình phát

Shaka

2.4.2

Nên dùng để kiểm tra

Bitmovin

v7

 

Exo-Player

2.8.2

 

Dash.js

2.0

 

Phụ lục

Nếu bạn đang sử dụng tệp kê khai một giai đoạn, những ví dụ này minh hoạ cách DAI chuyển đổi tệp kê khai một giai đoạn thành tệp kê khai nhiều giai đoạn.

Ví dụ về nhập tệp kê khai một giai đoạn

<?xml version="1.0" encoding="UTF-8"?>

<MPD availabilityStartTime="2017-01-01T10:00:00Z" id="id1" maxSegmentDuration="PT2S" minBufferTime="PT2S" minimumUpdatePeriod="PT25S" profiles="urn:mpeg:dash:profile:isoff-live:2011" publishTime="2017-01-01T10:00:00Z" timeShiftBufferDepth="PT5M" type="dynamic" ns1:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:ns1="http://www.w3.org/2001/XMLSchema-instance">

  <BaseURL>http://example.com/dash/</BaseURL>

  <Period id="1" start="PT0S">

    <EventStream timescale="90000" schemeIdUri="urn:scte:scte35:2014:xml+bin">

      <Event duration="2700000" presentationTime="270000" id="1">

        <Signal xmlns="http://www.scte.org/schemas/35/2016">

          <Binary>/DAlAAAAAAAAAP/wFAUAAA+if+/+INAJ0P4AKTLgAAAAAAAA9UTkTA==</Binary>

        </Signal>

      </Event>

      <Event presentationTime="2970000" id="2">

        <Signal xmlns="http://www.scte.org/schemas/35/2016">

          <Binary>/DAgAAAAAAAAAP/wDwUAAA+if0/+IPk8sAAAAAAAAH3XbUE=</Binary>

        </Signal>

      </Event>

    </EventStream>

    <AdaptationSet contentType="audio" lang="eng" mimeType="audio/mp4" segmentAlignment="true" startWithSAP="1">

      <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />

      <SegmentTemplate timescale="44100" initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/$Number$.m4s">

        <SegmentTimeline>

          <S t="0" d="132300" r="20" />

        </SegmentTimeline>

      </SegmentTemplate>

      <Representation audioSamplingRate="48000" bandwidth="48000" codecs="mp4a.40.2" id="A48">

        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />

      </Representation>

    </AdaptationSet>

    <AdaptationSet contentType="video" maxFrameRate="60/2" maxHeight="360" maxWidth="640" mimeType="video/mp4" minHeight="360" minWidth="640" par="16:9" segmentAlignment="true" startWithSAP="1">

      <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />

      <SegmentTemplate timescale="90000" initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/$Number$.m4s">

        <SegmentTimeline>

          <S t="0" d="270000" r="20" />

        </SegmentTimeline>

      </SegmentTemplate>

      <Representation bandwidth="300000" codecs="avc1.64001e" frameRate="60/2" height="360" id="V300" sar="1:1" width="640" />

    </AdaptationSet>

  </Period>

</MPD>

Ví dụ về kết quả tệp kê khai nhiều giai đoạn

<?xml version="1.0" encoding="UTF-8"?>

<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:XMLSchema-instance="http://www.w3.org/2001/XMLSchema-instance" XMLSchema-instance:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" id="id1" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="dynamic" availabilityStartTime="2017-01-01T10:00:00Z" publishTime="2017-01-01T10:00:00Z" minimumUpdatePeriod="PT25S" minBufferTime="PT2S" timeShiftBufferDepth="PT5M0S" maxSegmentDuration="PT2S">

  <BaseURL>http://example.com/dash/</BaseURL>

  <Period id="0s" start="PT0S">

    <AdaptationSet mimeType="audio/mp4" startWithSAP="1" lang="eng" contentType="audio" segmentAlignment="true">

      <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>

      <SegmentTemplate timescale="44100" presentationTimeOffset="0" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">

        <SegmentTimeline>

          <S d="132300"></S>

        </SegmentTimeline>

      </SegmentTemplate>

      <Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="A48" bandwidth="48000">

        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></AudioChannelConfiguration>

      </Representation>

    </AdaptationSet>

    <AdaptationSet mimeType="video/mp4" startWithSAP="1" contentType="video" par="16:9" minWidth="640" maxWidth="640" minHeight="360" maxHeight="360" maxFrameRate="60/2" segmentAlignment="true">

      <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>

      <SegmentTemplate timescale="90000" presentationTimeOffset="0" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">

        <SegmentTimeline>

          <S d="270000"></S>

        </SegmentTimeline>

      </SegmentTemplate>

      <Representation width="640" height="360" sar="1:1" frameRate="60/2" codecs="avc1.64001e" id="V300" bandwidth="300000"></Representation>

    </AdaptationSet>

  </Period>

  <Period id="3s" start="PT3S">

    <EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin" timescale="90000">

      <Event duration="2700000" id="1">

        <Signal xmlns="http://www.scte.org/schemas/35/2016">

          <Binary>/DAlAAAAAAAAAP/wFAUAAA+if+/+INAJ0P4AKTLgAAAAAAAA9UTkTA==</Binary>

        </Signal>

      </Event>

    </EventStream>

    <AdaptationSet mimeType="audio/mp4" startWithSAP="1" lang="eng" contentType="audio" segmentAlignment="true">

      <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>

      <SegmentTemplate timescale="44100" presentationTimeOffset="132300" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">

        <SegmentTimeline>

          <S t="132300" d="132300" r="9"></S>

        </SegmentTimeline>

      </SegmentTemplate>

      <Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="A48" bandwidth="48000">

        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></AudioChannelConfiguration>

      </Representation>

    </AdaptationSet>

    <AdaptationSet mimeType="video/mp4" startWithSAP="1" contentType="video" par="16:9" minWidth="640" maxWidth="640" minHeight="360" maxHeight="360" maxFrameRate="60/2" segmentAlignment="true">

      <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>

      <SegmentTemplate timescale="90000" presentationTimeOffset="270000" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">

        <SegmentTimeline>

          <S t="270000" d="270000" r="9"></S>

        </SegmentTimeline>

      </SegmentTemplate>

      <Representation width="640" height="360" sar="1:1" frameRate="60/2" codecs="avc1.64001e" id="V300" bandwidth="300000"></Representation>

    </AdaptationSet>

  </Period>

  <Period id="33s" start="PT33S">

    <EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin" timescale="90000">

      <Event id="2">

        <Signal xmlns="http://www.scte.org/schemas/35/2016">

          <Binary>/DAgAAAAAAAAAP/wDwUAAA+if0/+IPk8sAAAAAAAAH3XbUE=</Binary>

        </Signal>

      </Event>

    </EventStream>

    <AdaptationSet mimeType="audio/mp4" startWithSAP="1" lang="eng" contentType="audio" segmentAlignment="true">

      <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>

      <SegmentTemplate timescale="44100" presentationTimeOffset="1455300" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">

        <SegmentTimeline>

          <S t="1455300" d="132300" r="9"></S>

        </SegmentTimeline>

      </SegmentTemplate>

      <Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="A48" bandwidth="48000">

        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></AudioChannelConfiguration>

      </Representation>

    </AdaptationSet>

    <AdaptationSet mimeType="video/mp4" startWithSAP="1" contentType="video" par="16:9" minWidth="640" maxWidth="640" minHeight="360" maxHeight="360" maxFrameRate="60/2" segmentAlignment="true">

      <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>

      <SegmentTemplate timescale="90000" presentationTimeOffset="2970000" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">

        <SegmentTimeline>

          <S t="2970000" d="270000" r="9"></S>

        </SegmentTimeline>

      </SegmentTemplate>

      <Representation width="640" height="360" sar="1:1" frameRate="60/2" codecs="avc1.64001e" id="V300" bandwidth="300000"></Representation>

    </AdaptationSet>

  </Period>

</MPD>

Đối với mọi vấn đề liên quan đến việc khắc phục sự cố hoặc gián đoạn dịch vụ DAI (chèn quảng cáo động), hãy liên hệ với bộ phận hỗ trợ của nhà xuất bản.

Thông tin này có hữu ích không?

Chúng tôi có thể cải thiện trang này bằng cách nào?
true
Bắt đầu sử dụng tính năng Chèn quảng cáo động

Bản hướng dẫn của chúng tôi về việc cung cấp trải nghiệm quảng cáo liền mạch trên nội dung video trực tiếp, tuyến tính và theo yêu cầu.
Xem bản hướng dẫn

Tìm kiếm
Xóa nội dung tìm kiếm
Đóng tìm kiếm
Trình đơn chính
12353805875775226691
true
Tìm kiếm trong Trung tâm trợ giúp
true
true
true
true
true
148
false
false