Vòng đời của một tính năng Truyền phát

Giới thiệu

Tài liệu này hướng dẫn bạn về suốt thời gian phát sóng trực tiếp trên YouTube bằng cách sử dụng API Phát trực tiếp trên YouTube và API Content ID của YouTube.

Tài nguyên và loại tài nguyên

Như đã giải thích trong hướng dẫn bắt đầu, tài nguyên là một thực thể dữ liệu riêng lẻ có giá trị nhận dạng duy nhất. Để tạo và quản lý các sự kiện trực tiếp trên YouTube, bạn sẽ sử dụng một số loại tài nguyên được xác định trong API dữ liệu YouTube hoặc API Content ID của YouTube. Các tài nguyên được liệt kê trong tiêu đề API Phát trực tiếp của YouTube về mặt kỹ thuật được xác định trong các API khác đó nhưng được liệt kê riêng vì các tài nguyên này chỉ được dùng để phát sóng trực tiếp.

Tài nguyên về API Phát trực tiếp trên YouTube

Tài nguyên về API Dữ liệu của YouTube

Tài nguyên về Content ID của YouTube

Tạo và quản lý chương trình phát sóng trực tiếp

Những bước sau giải thích cách tạo và quản lý sự kiện trực tiếp trên YouTube. Các bước này được chia thành các giai đoạn sau:

  1. Thiết lập tính năng phát đi thông báo
  2. Xác nhận quyền sở hữu nội dung của bạn
  3. Thử nghiệm
  4. Phát đi thông báo
  5. Kết thúc thông báo
  6. Tạo tệp đối chiếu

Giai đoạn 1: Thiết lập chương trình phát sóng

Bước 1.1: Tạo chương trình phát sóng

Gọi phương thức liveBroadcasts.insert để thêm chương trình phát sóng của bạn vào lịch sự kiện trực tiếp của YouTube. Tài nguyên liveBroadcast bạn đang chèn phải xác định giá trị cho các thuộc tính được liệt kê bên dưới.

Vui lòng xem xét các nguyên tắc sau khi thiết lập chương trình phát sóng:

  • Nếu muốn có một giai đoạn thử nghiệm cho nội dung phát của mình, thì khi xem video phát mà không có những người xem khác cũng có thể xem nội dung phát, bạn phải đặt thuộc tính contentDetails.monitorStream.enableMonitorStream thành true và thuộc tính contentDetails.enableAutoStart thành false. Đây là các giá trị mặc định cho cả hai thuộc tính.

  • Nếu muốn tạo tệp đối chiếu từ chương trình phát sóng đã ghi, bạn phải đặt thuộc tính contentDetails.recordFromStart của chương trình phát thành true. Nếu muốn cung cấp video đã ghi để phát lại ngay sau khi chương trình phát sóng kết thúc, bạn cũng phải đặt thuộc tính contentDetails.enableDvr thành true. (Cả hai thuộc tính này đều có giá trị mặc định là true.)

  • Bạn có thể cập nhật bất kỳ thuộc tính contentDetails nào, miễn là trạng thái của thông báo vẫn là created hoặc ready.

  • Bạn có thể cập nhật thời gian bắt đầu theo lịch của chương trình phát và thời gian kết thúc của lịch phát sóng, miễn là trạng thái của chương trình phát là created, ready hoặc testing.

  • Bạn có thể cập nhật tiêu đề, nội dung mô tả và trạng thái quyền riêng tư của chương trình phát sóng cũng như các trường siêu dữ liệu khác thuộc tài nguyên video của chương trình phát sóng bất cứ lúc nào.

    Lưu ý: Nếu bạn chỉ muốn cung cấp video của mình cho những người dùng YouTube cụ thể, hãy đặt giá trị thuộc tính status.privacyStatus thành unlisted hoặc private phù hợp với nhu cầu của bạn.

Xử lý phản hồi API

Khi gọi phương thức liveBroadcasts.insert, phản hồi API sẽ chứa tài nguyên liveBroadcast mà bạn đã tạo. Mã của bạn sẽ trích xuất và lưu trữ id từ tài nguyên đó. Bạn sẽ cần giá trị đó để xác định nội dung phát trong các yêu cầu API trong tương lai. (Bạn cũng có thể xác định tài nguyên video tương ứng với tài nguyên liveBroadcast bằng cách sử dụng cùng một mã nhận dạng.)

Bước 1.2: Tạo luồng

Tài nguyên liveStream cho phép bạn truyền video sang YouTube và mô tả nội dung mà bạn đang truyền. Mỗi chương trình phát phải được liên kết với đúng một luồng.

Gọi phương thức liveStreams.insert để tạo luồng video cho sự kiện của bạn. Khi tạo luồng, bạn phải đặt giá trị cho các thuộc tính được liệt kê dưới đây:

Ngoại trừ tiêu đề của luồng, bạn không thể cập nhật các giá trị này sau khi tạo luồng. Nếu cần thay đổi, bạn thực sự cần tạo một luồng khác bằng cách lặp lại bước này. Quy trình này sẽ được thảo luận chi tiết hơn trong bước 3.5 ở phần sau của tài liệu này.

Bạn cũng có thể đặt giá trị cho các thuộc tính sau:

  • snippet.description – giống như tiêu đề luồng, nội dung mô tả luồng có thể được cập nhật sau khi tạo luồng. Cả tiêu đề và nội dung mô tả đều không hiển thị cho người dùng YouTube.
  • contentDetails.isReusable – Cho biết luồng có thể sử dụng lại hay không, tức là luồng có thể được liên kết với nhiều thông báo. Giá trị của thuộc tính này xác định hiệu quả kênh có mối quan hệ nhiều với một hay giữa tài nguyên liveBroadcast với liveStream:

    • Nếu sử dụng giá trị mặc định là thuộc tính true của thuộc tính, bạn có thể sử dụng cùng một tài nguyên liveStream cho tất cả các thông báo của kênh. Điều đó có nghĩa là bạn không cần lặp lại bước này (1.2) cho mọi nội dung phát. Thay vào đó, bạn chỉ cần sử dụng lại mã luồng cho các thông báo tiếp theo.
    • Nếu đặt giá trị thuộc tính thành false, bạn cần tạo một luồng mới cho mỗi chương trình phát.

Sau khi bạn gửi yêu cầu API theo luồng, phản hồi API sẽ chứa tài nguyên liveStream mà bạn đã tạo. Mã của bạn sẽ trích xuất và lưu trữ id từ tài nguyên đó. Bạn sẽ cần giá trị đó để xác định luồng trong các yêu cầu API trong tương lai.

Bước 1.3: Liên kết chương trình phát sóng với luồng của sự kiện

Sau khi tạo tài nguyên liveBroadcastliveStream, bạn cần liên kết cả hai bằng phương thức liveBroadcasts.bind. Thao tác này sẽ liên kết các video mà bạn sẽ truyền đến YouTube cùng với sự kiện phát sóng cho video đó.

Khi gọi phương thức liveBroadcasts.bind, hãy đặt thông số id thành mã nhận dạng thông báo thu được ở bước 1.1 và thông số streamId thành mã luồng nhận được ở bước 1.2.

Giai đoạn 2: Xác nhận quyền sở hữu nội dung của bạn

Nếu muốn hiển thị quảng cáo trong quá trình phát, bạn cần xác nhận quyền sở hữu video phát trước khi sự kiện bắt đầu. Các bước sau đây sẽ giải thích quy trình này. Lưu ý rằng tất cả các lệnh gọi API được thảo luận trong giai đoạn này đều được xác định trong API Content ID của YouTube.

Bước 2.1: Tạo thành phần

Tài nguyên asset đại diện cho một phần tài sản trí tuệ. Trong trường hợp này, nội dung là thông báo của bạn. Gọi phương thức assets.insert để tạo tài sản.

Phản hồi API sẽ chứa tài nguyên asset mà bạn đã tạo. Mã của bạn phải trích xuất và lưu trữ id từ tài nguyên đó vì bạn sẽ cần giá trị đó để xác định thành phần đó trong các yêu cầu API trong tương lai.

Bước 2.2: Xác định quyền sở hữu tài sản

Dữ liệu về quyền sở hữu của một tài sản sẽ xác định chủ sở hữu của tài sản đó cũng như các lãnh thổ nơi họ sở hữu tài sản đó. YouTube sử dụng dữ liệu này để xác định vị trí mà chủ sở hữu có thể đặt chính sách cho video đã được xác nhận quyền sở hữu.

Ví dụ: nếu bạn có quyền phát một sự kiện ở Hoa Kỳ và một đài phát khác cũng có quyền như vậy đối với Canada, thì bạn có thể xác định chính sách khác nhau cho video phát sóng và video do người dùng tải lên khớp với video phát sóng. Chính sách trùng khớp của bạn sẽ áp dụng cho video trùng khớp do người dùng tải lên ở Hoa Kỳ, còn chính sách của chủ sở hữu khác sẽ được áp dụng cho các video trùng khớp ở Canada.

Để xác định các lãnh thổ nơi bạn có quyền sở hữu tài sản, hãy gọi phương thức ownership.update. Trong yêu cầu đó, hãy đặt tham số assetId thành id mà bạn đã lưu trữ trong bước 2.1.

Bước 2.3: Đặt chính sách trùng khớp của tài sản

Chính sách trùng khớp của tài sản giải thích những việc YouTube nên làm khi người dùng tải video trùng khớp với một tệp đối chiếu liên kết với tài sản đó. Trong trường hợp này, chính sách trùng khớp sẽ cho biết cách YouTube xử lý video đã tải lên khớp với video phát trực tiếp của bạn.

Lưu ý: Bạn nên đặt chính sách trùng khớp nếu định tạo tệp đối chiếu từ video phát sóng của bạn và sử dụng tệp đối chiếu đó để xác định các video do người dùng tải lên phù hợp với chương trình phát sóng của bạn. Nếu không, bạn có thể bỏ qua bước này.

Để đặt chính sách trùng khớp, trước tiên, bạn cần xác định chính sách mà bạn muốn áp dụng. Bạn có thể truy xuất danh sách các chính sách hiện có bằng cách gọi phương thức policies.list hoặc xác định một chính sách mới bằng cách gọi phương thức policies.insert. Trong cả hai trường hợp, bạn cần nắm bắt id của chính sách mà bạn muốn áp dụng.

Sau khi bạn xác định chính sách này, hãy gọi phương thức assetMatchPolicy.update. Trong yêu cầu đó, hãy đặt thông số assetId thành id mà bạn đã lưu trữ ở bước 2.1.

Bước 2.4: Xác nhận quyền sở hữu video của bạn

Ở bước này, bạn tạo một thông báo xác nhận quyền sở hữu để liên kết video mà bạn sẽ truyền đến nội dung mà bạn đã tạo ở bước 2.1. Thông báo xác nhận quyền sở hữu đó đặt một chính sách chỉ áp dụng cho video phát sóng của bạn. (Những video do người dùng tải lên trùng khớp với video phát sóng của bạn chịu sự điều chỉnh của chính sách trùng khớp đã thiết lập ở bước trước.)

Để tạo thông báo xác nhận quyền sở hữu, hãy gọi phương thức claims.insert. Trong tài nguyên claim mà bạn chèn, bạn cần đặt giá trị cho các thuộc tính sau:

  • assetId – Bạn nhận được giá trị này ở bước 2.1.
  • videoId – Đây là mã nhận dạng chương trình phát sóng mà bạn nhận được ở bước 1.1.
  • policy – Đây là tài nguyên policy. Bạn có thể áp dụng một chính sách hiện có bằng cách đặt thuộc tính id của tài nguyên đó thành mã chính sách hiện có. Bước trước đó giải thích cách truy xuất mã nhận dạng của một chính sách hiện có.
  • contentType – Đặt giá trị này thành audiovisual.

Xử lý phản hồi API

Khi bạn chèn thông báo xác nhận quyền sở hữu, phản hồi API sẽ chứa tài nguyên claim mà bạn đã tạo. Mã của bạn sẽ trích xuất và lưu trữ id từ tài nguyên đó. Bạn sẽ sử dụng giá trị đó sau để tạo tệp đối chiếu từ video đã xử lý của mình.

Bước 2.5: Cập nhật chế độ cài đặt quảng cáo cho nội dung truyền phát

Bạn cần đặt tùy chọn quảng cáo cho video của mình nếu muốn chạy quảng cáo trước video khi người xem bắt đầu xem chương trình phát sóng hoặc chạy quảng cáo trong các điểm phát sóng.

  • Nếu bạn bật quảng cáo trước video cho chương trình phát, thì tất cả người xem sẽ nhìn thấy quảng cáo khi họ bắt đầu xem chương trình phát đó ngay cả khi họ bắt đầu xem ở giữa chương trình phát sóng.
  • Nếu bật quảng cáo trong video cho nội dung phát, bạn sẽ có thể chèn điểm dừng quảng cáo trong nội dung truyền phát.

Để bật quảng cáo, hãy gọi phương thức videoAdvertisingOptions.update. Trong yêu cầu của bạn, hãy đặt tham số videoId thành thông báo (broadcast) id mà bạn nhận được ở bước 1.1. Sử dụng thuộc tính adFormats[] của tài nguyên videoAdvertisingOption để xác định các định dạng quảng cáo (preroll, midroll hoặc postroll) mà bạn muốn bật.

Giai đoạn 3: Thử nghiệm

Trong giai đoạn này, bạn sẽ nhúng một trình phát cho thấy luồng giám sát cho nội dung truyền phát để bạn có thể kiểm thử trải nghiệm xem. Luồng giám sát là một luồng riêng tư cho phép bạn xem trước video phát sóng khi video đó xuất hiện cho người xem YouTube.

Lưu ý: Bạn chỉ có thể kiểm thử tính năng phát video nếu luồng giám sát của video đó đang bật. Theo mặc định, luồng giám sát của chương trình phát sóng được bật. Bạn có thể tắt trình theo dõi của chương trình phát sóng bằng cách đặt thuộc tính contentDetails.MonitorStream.enableMonitorStream thành false khi tạo hoặc cập nhật chương trình phát sóng đó.

Bước 3.1: Nhúng trình phát luồng theo dõi

Truy xuất thông báo của bạn bằng phương thức liveBroadcasts.list và trích xuất giá trị của thuộc tính contentDetails.streamDetails.monitorStreamEmbedHtml. Giá trị đó chứa HTML mà bạn cần để nhúng trình phát YouTube hiển thị luồng theo dõi của bạn.

Bước 3.2: Bắt đầu video

Bắt đầu truyền video trên luồng video.

Bước 3.3: Xác nhận luồng video của bạn đang hoạt động

Gọi phương thức liveStreams.list để truy xuất tài nguyên liveStream liên kết với chương trình phát sóng của bạn. Xác nhận giá trị của thuộc tính status.streamStatusactive, cho biết rằng các máy chủ của YouTube đang nhận đúng dữ liệu từ bộ mã hoá của bạn.

Bước 3.4: Chuyển trạng thái của chương trình phát sóng sang trạng thái thử nghiệm

Gọi phương thức liveBroadcasts.transition để cập nhật trạng thái của thông báo. Đặt giá trị tham số id thành mã nhận dạng thông báo thu được ở bước 1.1 và đặt giá trị tham số broadcastStatus thành testing.

Sau khi bạn gọi phương thức liveBroadcasts.transition, có thể mất vài giây hoặc thậm chí tối đa một phút để quá trình chuyển đổi đó hoàn tất. Trong thời gian đó, bạn nên kiểm tra API để kiểm tra trạng thái của thông báo. Trạng thái của thông báo sẽ là testStarting cho đến khi quá trình chuyển đổi hoàn tất. Trạng thái sẽ là testing sau khi quá trình chuyển đổi hoàn tất.

Bước 3.5: Hoàn tất kiểm thử

Nếu thử nghiệm của bạn diễn ra suôn sẻ, bạn có thể chuyển sang giai đoạn 4. Tuy nhiên, trong một số trường hợp, bạn có thể cần phải kiểm tra thêm. Ví dụ: nếu kiểm thử cho thấy luồng video được định cấu hình không đúng cách, bạn cần phải khắc phục điều đó trước khi tiếp tục phát sóng.

Nếu luồng video không được định cấu hình chính xác, bạn cần huỷ liên kết (và xoá) luồng hiện có và tạo một luồng mới. Ví dụ: một luồng có thể không được định cấu hình chính xác nếu chỉ định định dạng video sai.

  1. Để huỷ liên kết luồng video, hãy gọi phương thức liveBroadcasts.bind từ bước 1.3. Trong yêu cầu API, hãy đặt tham số id thành id thu được ở bước 1.1. Không bao gồm tham số streamId trong yêu cầu.

  2. Để xoá luồng video, hãy gọi phương thức liveStreams.delete. Trong yêu cầu, hãy đặt tham số id thành id thu được ở bước 1.2.

  3. Lặp lại bước 1.2 để tạo một tài nguyên liveStream mới, được định cấu hình đúng cách. Sau đó, hãy lặp lại bước 1.3 để liên kết luồng mới với chương trình phát sóng của bạn và các bước từ 3.1 đến 3.3 để kiểm thử luồng mới.

Bước 3.6: Bật các thuộc tính autoStartautoStop

Sau khi hoàn tất thành công giai đoạn kiểm thử, bạn có thể đặt các thuộc tính contentDetails.enableAutoStartcontentDetails.enableAutoStop của chương trình phát sóng thành true trước khi chương trình phát sóng thực tế bắt đầu. Bạn không thể đặt các thuộc tính này thành true trước giai đoạn kiểm thử, vì kiểm thử thực sự sẽ khiến quá trình phát sóng bắt đầu.

Giai đoạn 4: Phát đi thông báo

Trong giai đoạn này, khán giả có thể xem video phát sóng của bạn.

Bước 4.1: Bắt đầu video

Bắt đầu truyền video trên luồng video.

Bước 4.2: Xác nhận luồng video của bạn đang hoạt động

Gọi phương thức liveStreams.list để truy xuất tài nguyên liveStream liên kết với chương trình phát sóng của bạn. Xác nhận giá trị của thuộc tính status.streamStatusactive, cho biết rằng các máy chủ của YouTube đang nhận đúng dữ liệu từ bộ mã hoá của bạn.

Bước 4.3: Chuyển đổi trạng thái của nội dung truyền phát sang dạng trực tiếp

Quan trọng: Bước này giúp video của bạn hiển thị với người xem.

Gọi phương thức liveBroadcasts.transition để cập nhật trạng thái của thông báo. Đặt giá trị tham số id thành mã nhận dạng thông báo thu được ở bước 1.1 và đặt giá trị tham số broadcastStatus thành live.

Nếu đặt thuộc tính contentDetails.enableAutoStart của tài nguyên liveBroadcast thành true, thì bạn không cần gọi phương thức liveBroadcasts.transition.

Sau khi thực hiện lệnh gọi API này – hoặc nếu bạn đã đặt thuộc tính contentDetails.enableAutoStart thành true, thì sau khi bắt đầu phát trực tuyến – bạn cần đợi 5 đến 10 giây để quá trình chuyển đổi đó hoàn tất. Quá trình chuyển đổi có thể mất tới một phút. Trong thời gian đó, bạn nên thăm dò ý kiến của API để kiểm tra trạng thái của thông báo. Trạng thái của thông báo sẽ là liveStarting cho đến khi quá trình chuyển đổi hoàn tất. Trạng thái sẽ là live sau khi quá trình chuyển đổi hoàn tất và người xem có thể xem chương trình phát sóng của bạn từ thời điểm đó trong luồng giám sát.

Hãy lưu ý những tác động sau đây của lệnh này:

  • Nếu đã bật luồng giám sát cho chương trình phát của mình – hãy xem bước 3.1 – bạn sẽ có thể xem luồng giám sát trong trình phát được nhúng.
  • Nếu bạn đã đặt giá trị cho thuộc tính contentDetails.streamDetails.broadcastStreamDelayMs của chương trình phát sóng, thì luồng phát sóng mà người xem khác có thể nhìn thấy sẽ bị trễ trong khoảng thời gian đó.

Bước 4.4: Chèn điểm chèn quảng cáo vào nội dung truyền phát

Gọi phương thức liveBroadcasts.cuepoint để chèn điểm dừng. Điểm dừng có thể kích hoạt điểm chèn quảng cáo. Trong tài nguyên cuepoint được cung cấp trong nội dung yêu cầu, hãy đặt thuộc tính durationSecs thành thời lượng mong muốn của điểm chèn (tính bằng giây) mà bạn muốn hiển thị. (Giá trị mặc định là 30.)

Tại thời điểm này, YouTube sẽ cố gắng phát quảng cáo trong trình phát video cho bất kỳ người xem nào đang xem nội dung phát khi điểm dừng quảng cáo được chèn vào. Việc quảng cáo có phát hay không phụ thuộc vào nhiều yếu tố, chẳng hạn như khả năng phân phát quảng cáo và nhật ký xem quảng cáo của người xem. Người xem có một điểm chèn quảng cáo sẽ quay lại chương trình phát sóng của bạn khi điểm chèn quảng cáo kết thúc, còn những người xem không thấy quảng cáo sẽ tiếp tục xem luồng phát sóng trong điểm chèn quảng cáo.

Hướng dẫn Bắt đầu cung cấp thêm thông tin về trải nghiệm xem trong thời điểm ngắt quảng cáo của chương trình phát sóng trực tiếp.

Giai đoạn 5: Kết thúc chương trình phát sóng

Bước 5.1: Dừng phát trực tiếp

Bước này kết thúc thử nghiệm hệ thống phát sóng trực tiếp trên YouTube.

Bước 5.2: Chuyển đổi trạng thái của chương trình phát để hoàn tất

Khi bạn đã sẵn sàng dừng phát sóng, hãy gọi phương thức liveBroadcasts.transition của API để cập nhật trạng thái của chương trình phát. Đặt giá trị tham số id thành mã nhận dạng thông báo thu được ở bước 1.1 và đặt giá trị tham số broadcastStatus thành complete.

Nếu bạn đã đặt các thuộc tính contentDetails.recordFromStartcontentDetails.enableDvr của chương trình phát sóng thành true, thì khi sự kiện trực tiếp kết thúc, người xem có thể xem ngay sự kiện phát trực tiếp đó.

Giai đoạn 6: Tạo tệp đối chiếu

Sau khi quay xong, bạn có thể tạo tệp đối chiếu từ video đã quay. Thao tác này hướng dẫn YouTube tìm các video do người dùng tải lên khớp với chương trình phát sóng và xử lý các video đó theo chính sách so khớp mà bạn đã đặt ở bước 2.3.

Quan trọng: Để tạo tệp đối chiếu, bạn phải đặt thuộc tính contentDetails.recordFromStart của chương trình phát sóng thành true.

Bước 6.1: Thăm dò API dữ liệu về trạng thái của video

YouTube phải hoàn tất việc xử lý chương trình phát sóng hoặc video đã tải lên thì bạn mới có thể tạo tệp đối chiếu từ video đó. Để xác định xem video đã hoàn tất quá trình xử lý hay chưa, hãy thăm dò phương thức videos.list của API Dữ liệu YouTube, đặt tham số part thành status và tham số id thành mã truyền phát mà bạn đã lưu trữ trong bước 1.1.

Phản hồi API của yêu cầu thăm dò ý kiến sẽ chứa tài nguyên video. Khi giá trị của thuộc tính status.uploadStatus của tài nguyên đó là processed, hãy chuyển sang bước 6.2.

Bước 6.2: Tạo tệp đối chiếu từ video đã xử lý

Để tạo tệp đối chiếu, hãy gọi phương thức references.insert của API Content ID và đặt thông số claimId thành mã xác nhận quyền sở hữu mà bạn đã lưu trữ trong bước 2.4.

Cung cấp Content ID trực tiếp

Một số đối tác YouTube có thể tạo tệp đối chiếu trước khi quá trình chuyển đổi sang trạng thái testing nhưng tính năng đó không được cung cấp cho tất cả các đối tác. Trong luồng đó, YouTube sẽ tạo và liên tục cập nhật tệp tham chiếu từ luồng phát sự kiện trực tiếp của bạn trong khi quá trình phát đang diễn ra. Ngoài ra, YouTube sẽ tìm các video trùng khớp do người dùng tải lên trong khi vẫn đang phát sóng. Lưu ý rằng việc tạo tham chiếu trước khi phát sóng sẽ tự động bật chế độ ghi lại cho nội dung truyền và bạn không thể tắt tính năng ghi sau khi tạo tham chiếu.

Để bật tính năng phát đi thông báo để phân phối trực tiếp qua Content ID, hãy thử các bước mô tả ở bước 6.2 sau khi xác nhận quyền sở hữu video ở bước 2.4. Nếu tài khoản đối tác của bạn chưa được phê duyệt để tạo tệp đối chiếu cho một chương trình phát sóng trực tiếp trước khi chương trình phát sóng đó diễn ra, thì API sẽ trả về lỗi fingerprintingNotAllowed. Trong trường hợp đó, bạn cần đợi cho đến khi quá trình phát hoàn tất, như mô tả trong các bước 6.1 và 6.2 ở trên, trước khi tạo tệp tham chiếu.