Chuẩn bị ứng dụng cho lệnh chuyển hướng phân phát nhóm

Hướng dẫn này đề cập đến việc phát triển một ứng dụng khách để tải luồng phát trực tiếp HLS hoặc DASH bằng API phân phát nhóm và trình thao tác tệp kê khai của bạn.

Điều kiện tiên quyết

Để tiếp tục, bạn phải có những thứ sau:

Gửi yêu cầu phát trực tuyến

Khi người dùng chọn một luồng, hãy làm như sau:

  1. Gửi yêu cầu POST đến phương thức dịch vụ phát trực tiếp. Để biết thông tin chi tiết, hãy xem phần Phương thức: stream.

  2. Truyền các tham số nhắm mục tiêu quảng cáo ở định dạng application/x-www-form-urlencoded hoặc application/json. Yêu cầu này đăng ký một phiên phát trực tuyến với Google DAI.

    Ví dụ sau đây sẽ tạo một yêu cầu truyền phát trực tiếp:

    Mã hoá biểu mẫu

    const url = `https://dai.google.com/ssai/pods/api/v1/` +
          `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`;
    
    const params = new URLSearchParams({
            cust_params: 'section=sports&page=golf,tennis'
    }).toString();
    
    const response = await fetch(url, {
            method: 'POST',
            headers: {
              'Content-Type': 'application/x-www-form-urlencoded'
            },
            body: params
    });
    
    console.log(await response.json());
    

    Mã hoá JSON

    const url = `https://dai.google.com/ssai/pods/api/v1/` +
          `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`;
    
    const response = await fetch(url, {
            method: 'POST',
            headers: {
              'Content-Type': 'application/json'
            },
            body: JSON.stringify({
              cust_params: {
                section: 'sports',
                page: 'golf,tennis'
              }
            })
    });
    
    console.log(await response.json());
    

    Nếu thành công, bạn sẽ thấy kết quả tương tự như sau:

    {
    "stream_id": "c4a5dad5-aaa8-4550-8acb-7cda3cdb21bb:DLS",
    "media_verification_url": "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/",
    "metadata_url": "https://dai.google.com/linear/pods/hls/.../metadata",
    "session_update_url": "https://dai.google.com/linear/.../session",
    "polling_frequency": 10
    }
    
  3. Trong phản hồi JSON, hãy xác định mã phiên phát trực tiếp và lưu trữ các dữ liệu khác cho các bước tiếp theo.

Siêu dữ liệu quảng cáo thăm dò ý kiến

Để thăm dò siêu dữ liệu quảng cáo, hãy làm như sau:

  1. Đọc giá trị metadata_url từ phản hồi đăng ký luồng phát.

  2. Tạo yêu cầu GET ban đầu đến điểm cuối metadata_url.

    • Bỏ qua tham số truy vấn delta_token. Quy trình này cho phép máy chủ trả về đầy đủ siêu dữ liệu cho cửa sổ Trình ghi video kỹ thuật số (DVR) của luồng phát. Phần ghi bằng DVR chứa khung thời gian phát sóng mà người xem có thể tua lại và phát. Phản hồi bao gồm một trường next_delta_token.
  3. Để tối ưu hoá băng thông, hãy lưu trữ giá trị next_delta_token từ phản hồi gần đây nhất.

  4. Trong yêu cầu tiếp theo, hãy gửi giá trị đó dưới dạng tham số truy vấn delta_token. Máy chủ chỉ trả về siêu dữ liệu đã thay đổi kể từ khi mã thông báo đó được tạo. Luôn gửi mã thông báo mới nhất mà bạn nhận được. Đừng cố gắng phân tích cú pháp, sửa đổi hoặc tạo mã thông báo. Để biết thông tin chi tiết, hãy xem Phương thức: siêu dữ liệu.

    Ví dụ sau đây tìm nạp siêu dữ liệu quảng cáo:

    // Initial request (returns full metadata and next_delta_token)
    let response = await fetch(metadata_url);
    let metadata = await response.json();
    let deltaToken = metadata.next_delta_token;
    
    // Subsequent request (returns only changes since deltaToken)
    if (deltaToken) {
      const url = new URL(metadata_url);
      url.searchParams.append('delta_token', deltaToken);
      response = await fetch(url.toString());
      const deltaMetadata = await response.json();
      // Merge deltaMetadata into your local cache
      mergeMetadata(metadata, deltaMetadata);
      deltaToken = deltaMetadata.next_delta_token;
    }
    

    Nếu thành công, bạn sẽ nhận được phản hồi PodMetadata. Nếu bạn cung cấp tham số delta_token, thì phản hồi sẽ chỉ chứa những quảng cáo, điểm chèn quảng cáo và thẻ mà máy chủ đã thêm hoặc cập nhật kể từ khi máy chủ tạo mã thông báo. Phản hồi cũng chứa một giá trị next_delta_token mới. Nếu có điểm chèn quảng cáo nào đã lỗi thời, thì phản hồi cũng sẽ bao gồm một danh sách obsolete_ad_break_ids gồm các điểm chèn quảng cáo cần xoá khỏi bộ nhớ đệm.

    {
      "next_delta_token": "eyJyYW5nZXMiOlt7InMiOjEsImUiOjN9XX0",
      "obsolete_ad_break_ids": ["0003069407"],
      "tags":{
        "google_1022389921":{
          "ad":"0003069408_ad1",
          "ad_break_id":"0003069408",
          "type":"start"
        },
        ...
      },
      "ads":{
        "0003069408_ad1":{
          "ad_break_id":"0003069408",
          "position":1,
          "duration":10.01,
          "title":"External - Pod Midroll 1",
          "clickthrough_url":"https://.../",
          ...
        },
        ...
      },
      "ad_breaks":{
        "0003069408":{
          "type":"mid",
          "duration":30,
          "ads":3
        },
        ...
      }
    }
    
  5. Lưu đối tượng tags và hợp nhất các nội dung cập nhật vào bộ nhớ đệm cục bộ. Nếu tham số obsolete_ad_break_ids xuất hiện, hãy xoá các điểm chèn quảng cáo và quảng cáo cũng như thẻ liên kết khỏi bộ nhớ đệm.

  6. Đặt một bộ hẹn giờ bằng giá trị polling_frequency để yêu cầu siêu dữ liệu thường xuyên. Trong mỗi cuộc thăm dò, hãy gửi giá trị next_delta_token được trả về trong phản hồi siêu dữ liệu gần đây nhất dưới dạng tham số truy vấn delta_token.

Tải luồng phát vào trình phát video

Sau khi bạn có mã nhận dạng phiên từ phản hồi đăng ký, hãy truyền mã nhận dạng đó đến trình thao tác tệp kê khai hoặc tạo một URL tệp kê khai để tải luồng vào trình phát video.

Để truyền mã nhận dạng phiên, hãy xem tài liệu về trình thao tác tệp kê khai. Nếu bạn phát triển một trình thao tác tệp kê khai, hãy xem phần Trình thao tác tệp kê khai cho luồng phát trực tiếp.

Ví dụ sau đây sẽ tập hợp một URL tệp kê khai:

https://<your_manifest_manipulator_url>/manifest.m3u8?DAI_stream_ID=SESSION_ID&network_code=NETWORK_CODE&DAI_custom_asset_key=CUSTOM_ASSET_KEY"

Khi trình phát đã sẵn sàng, hãy bắt đầu phát.

Theo dõi các sự kiện quảng cáo

Kiểm tra định dạng vùng chứa của luồng phát để biết siêu dữ liệu có dấu thời gian:

  • Luồng HLS có vùng chứa Transport Stream (TS) sử dụng thẻ ID3 có dấu thời gian để mang siêu dữ liệu có dấu thời gian. Để biết thông tin chi tiết, hãy xem bài viết Giới thiệu về Định dạng ứng dụng đa phương tiện chung với giao thức Phát trực tuyến dựa trên HTTP (HLS).

  • Luồng DASH sử dụng các phần tử EventStream để chỉ định các sự kiện trong tệp kê khai.

  • Luồng DASH sử dụng các phần tử InbandEventStream khi các phân đoạn chứa hộp Thông báo sự kiện (emsg) cho dữ liệu tải trọng, bao gồm cả thẻ ID3. Để biết thông tin chi tiết, hãy xem phần InbandEventStream.

  • Các luồng CMAF (bao gồm cả DASH và HLS) sử dụng các hộp emsg chứa thẻ ID3.

Để truy xuất thẻ ID3 từ luồng phát, hãy tham khảo hướng dẫn của trình phát video. Để biết thông tin chi tiết, hãy xem Hướng dẫn xử lý siêu dữ liệu có dấu thời gian

Để truy xuất mã nhận dạng sự kiện quảng cáo từ thẻ ID3, hãy làm như sau:

  1. Lọc các sự kiện theo scheme_id_uri bằng urn:google:dai:2018 hoặc https://aomedia.org/emsg/ID3.
  2. Trích xuất mảng byte từ trường message_data.

    Ví dụ sau đây giải mã dữ liệu emsg thành JSON:

    {
      "scheme_id_uri": "https://developer.apple.com/streaming/emsg-id3",
      "presentation_time": 27554,
      "timescale": 1000,
      "message_data": "ID3TXXXgoogle_1022389921",
      ...
    }
    
  3. Lọc thẻ ID3 theo định dạng TXXXgoogle_{ad_event_ID}:

    TXXXgoogle_1022389921
    

Hiện dữ liệu sự kiện quảng cáo

Để tìm đối tượng TagSegment, hãy làm như sau:

  1. Truy xuất đối tượng siêu dữ liệu quảng cáo tags từ Siêu dữ liệu quảng cáo trong cuộc thăm dò ý kiến. Đối tượng tags là một mảng gồm các đối tượng TagSegment.

  2. Sử dụng mã nhận dạng đầy đủ của sự kiện quảng cáo để tìm một đối tượng TagSegment có loại progress.

  3. Sử dụng 17 ký tự đầu tiên của mã nhận dạng sự kiện quảng cáo để tìm một đối tượng TagSegment thuộc các loại khác.

    Vì ứng dụng khách của bạn định kỳ thăm dò siêu dữ liệu quảng cáo, nên có thể xảy ra độ trễ giữa thời điểm trình phát video gặp thẻ ID3 trong luồng và thời điểm siêu dữ liệu liên kết có sẵn. Nếu ứng dụng khách của bạn không tìm thấy thẻ ID3 trong các thẻ đã lưu trữ, hãy giữ thẻ trong hàng đợi và xử lý lại thẻ sau lần thăm dò siêu dữ liệu tiếp theo. Giữ thẻ trong hàng đợi cho đến khi quá trình xử lý hoàn tất.

  4. Sau khi có TagSegment, hãy dùng thuộc tính ad_break_id làm khoá để tìm đối tượng AdBreak trong đối tượng siêu dữ liệu quảng cáo ad_breaks.

    Ví dụ sau đây tìm một đối tượng AdBreak:

    {
      "type":"mid",
      "duration":15,
      "ads":1
    }
    
  5. Sử dụng dữ liệu TagSegmentAdBreak để hiện thông tin về vị trí quảng cáo trong khoảng thời gian chèn quảng cáo. Ví dụ: Ad 1 of 3.

Gửi ping xác minh nội dung nghe nhìn

Đối với mọi sự kiện quảng cáo, ngoại trừ loại progress, hãy gửi một ping xác minh nội dung nghe nhìn. Google DAI sẽ loại bỏ các sự kiện progress và việc gửi các sự kiện này thường xuyên có thể ảnh hưởng đến hiệu suất của ứng dụng của bạn.

Để tạo URL xác minh phương tiện hoàn chỉnh của một sự kiện quảng cáo, hãy làm như sau:

  1. Từ phản hồi luồng phát, hãy thêm mã sự kiện quảng cáo đầy đủ vào giá trị media_verification_url.

  2. Gửi yêu cầu GET bằng URL đầy đủ:

    // media_verification_url: "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/"
    const completeUrl = `${media_verification_url}google_1022389921`;
    
    const response = await fetch(completeUrl);
    

    Nếu thành công, bạn sẽ nhận được phản hồi trạng thái mã 202. Nếu không, bạn sẽ nhận được mã lỗi 404.

Bạn có thể sử dụng Trình giám sát hoạt động phát trực tuyến (SAM) để kiểm tra nhật ký theo thời gian về tất cả các sự kiện quảng cáo. Để biết thông tin chi tiết, hãy xem bài viết giám sát và khắc phục sự cố cho một sự kiện phát trực tiếp