Phát trực tiếp

SDK Truyền bao gồm các API tích hợp sẵn để hỗ trợ nội dung trực tiếp. Giao diện này bao gồm một giao diện người dùng linh hoạt, độc đáo, kết hợp với các API cho phép nhà phát triển tạo ra trải nghiệm trực tiếp phong phú chỉ bằng một vài dòng mã. API trực tiếp hỗ trợ hiển thị thời gian bắt đầu và kết thúc, siêu dữ liệu chương trình, các chế độ điều khiển DVR và cửa sổ có thể tìm kiếm.

Hướng dẫn này minh hoạ cách định cấu hình luồng cho các API trực tiếp, bao gồm mã mẫu và siêu dữ liệu mẫu để định cấu hình các tình huống trực tiếp cốt lõi, cùng với ảnh chụp màn hình minh hoạ giao diện của từng trường hợp.

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

Bạn cần nắm rõ các kiến thức cơ bản về cách triển khai Bộ thu trên web trước khi xem xét hướng dẫn này. Ngoài ra, để chạy các mã mẫu này, bạn cần có quyền truy cập vào một luồng trực tiếp tuân theo một trong các loại nội dung đa phương tiện được hỗ trợ dành cho Cast. Nhìn chung, tính năng Trực tiếp hỗ trợ các cấu hình phát trực tiếp thông thường cho nội dung nghe nhìn được hỗ trợ.

Các thuật ngữ sau đây được sử dụng trong suốt hướng dẫn này:

  • Cửa sổ có thể xem – Phạm vi của một sự kiện trực tiếp mà người dùng có thể tìm kiếm.
  • Live Edge (Phần phát trực tiếp mới nhất) dành cho người chơi.
  • Đầu phát – Dấu thời gian trên giao diện người dùng cho vị trí phát hiện tại.

Truyền luồng trực tiếp

Có hai cách để định cấu hình SDK Bộ thu web để sử dụng API trực tiếp cho nội dung:

  1. bằng cách sử dụng trình chặn thông báo LOAD trong ứng dụng Bộ thu web. (nên dùng)
  2. sử dụng yêu cầu tải phía máy chủ hoặc phía người nhận.

Trình chặn là đối tượng LoadRequestData chứa tất cả siêu dữ liệu quan trọng về một yêu cầu tải. Để cho biết yêu cầu tải là dành cho luồng trực tiếp, bạn chỉ cần đặt streamType trên đối tượng mediaInformation thành StreamType.LIVE. MediaInformation.duration phải là -1 vì các phiên bản trình phát chịu trách nhiệm tính toán khi nội dung là LIVE.

/*
* This interceptor is called before your content is loaded by a Cast device
*/
playerManager.setMessageInterceptor(
   cast.framework.messages.MessageType.LOAD,
   request => { /* cast.framework.messages.LoadRequestData */
       request.media.streamType = cast.framework.messages.StreamType.LIVE;
   return request;
});

Thêm dữ liệu hướng dẫn chương trình

Các sự kiện trực tiếp, đặc biệt là sự kiện trực tiếp dài (chẳng hạn như một kênh truyền hình), có thể hiển thị siêu dữ liệu hướng dẫn/lập trình trên màn hình dựa trên vị trí phát hiện tại trong sự kiện phát trực tiếp. Nhà cung cấp nội dung rất nên đưa siêu dữ liệu lập trình vào các ứng dụng của Bộ thu nội dung web để cải thiện trải nghiệm người dùng cuối.

Bạn có thể định cấu hình dữ liệu hướng dẫn ban đầu cho một luồng trong trình chặn thông báo LOAD, giống như cách chúng tôi cho biết luồng là luồng trực tiếp trong ví dụ trước. từng phần hoặc chương trình trong luồng trực tiếp được biểu thị dưới dạng đối tượng MediaMetadata, sau đó được lưu trữ trong hàng đợi. Có một lớp MediaMetadata khác nhau cho các loại chương trình khác nhau, ví dụ: TvShowMediaMetadata, MovieMediaMetadata, MusicTrackMediaMetadata, v.v.

Trong đoạn mã sau, chúng tôi sử dụng đối tượng MediaMetadata để chỉ định thời gian bắt đầu của mỗi chương trình bằng một Dấu thời gian UNIX với thuộc tính sectionStartAbsoluteTime. Thời lượng của một chương trình được biểu thị bằng giây.

// The metadata for a single TV show
const currentShow = new cast.framework.messages.TvShowMediaMetadata();
currentShow.episode = 15;
currentShow.seriesTitle = 'The Odyssey';
currentShow.title = 'Scylla and Charybdis';
currentShow.sectionStartAbsoluteTime = toUnixTimestamp('9:00 PM');
currentShow.sectionDuration = HOUR_IN_SECONDS;

const previousShow = new ...;
const nextShow = new ...;

const containerMetadata = new cast.framework.messages.ContainerMetadata();
containerMetadata.title = 'My TV Channel';
containerMetadata.sections = [previousShow, currentShow, nextShow];

playerManager.getQueueManager().setContainerMetadata(containerMetadata);

Phạm vi tìm kiếm trực tiếp

SDK Truyền bao gồm các thành phần và chế độ điều khiển trên giao diện người dùng cho phép người dùng di chuyển đầu phát trong luồng bằng cách sử dụng Bộ điều khiển mở rộng hoặc các nút điều khiển cảm ứng trên thiết bị có hỗ trợ cảm ứng.

LiveSeekableRange thể hiện phạm vi thời gian trong một luồng dữ liệu mà người dùng có thể tìm kiếm. Trên Web receiver, bạn có thể truy cập thông tin về phạm vi có thể tìm kiếm thông qua PlayerManager.getLiveSeekableRange(). Hàm này sẽ trả về đối tượng LiveSeekableRange. Các thuộc tính chính trên đối tượng cần lưu ý là:

  • start — thời gian bắt đầu (tính bằng giây) của phạm vi so với thời gian bắt đầu của luồng tính bằng giây.
  • kết thúc — thời gian tối đa có thể (tính bằng giây) mà người chơi có thể tìm kiếm, dựa trên các phân đoạn có sẵn, so với thời điểm bắt đầu phát trực tiếp.
  • isMoveWindow – một giá trị boolean cho biết phạm vi có thể tìm kiếm có di chuyển (tức là các phân đoạn cũ bị xoá khỏi tệp kê khai) bằng luồng hay không, giá trị này phải là true cho tất cả các luồng trực tiếp.
  • isLiveDone – một giá trị boolean cho biết luồng trực tiếp đã hoàn tất hay chưa, có nghĩa là không có phân khúc mới nào được tạo.

Kích thước của phạm vi có thể tìm kiếm, được biểu thị dưới dạng thời gian từ start đến end, được xác định theo số lượng phân đoạn có sẵn trong luồng và sẽ di chuyển cùng với luồng. Ví dụ: nếu ở đầu luồng, phạm vi tìm kiếm là {start:0, end: 600, isMovingWindow: false, isLiveDone: false}, 10 giây sau khi luồng bắt đầu, nó có thể trở thành {start: 10, end: 610, isMovingWindow: true, isLiveDone: false}. Điều quan trọng cần lưu ý là thời gian bắt đầu và kết thúc trong phạm vi tìm kiếm được cập nhật dựa trên thời gian cần để tạo một phân đoạn mới. Do đó, nếu thời lượng thông thường của một phân đoạn cho luồng của bạn là 10 giây, thì thời gian bắt đầu và kết thúc cũng sẽ được cập nhật khoảng 10 giây một lần.

Tắt tính năng tìm kiếm

Để tắt tính năng tìm kiếm trong một sự kiện trực tiếp, bạn cần xoá chức năng tìm kiếm khỏi các lệnh đa phương tiện được hỗ trợ trên Bộ thu web:

// disable seeking in the LOAD messageInterceptor
playerManager.removeSupportedMediaCommands(cast.framework.messages.Command.SEEK, true);

Việc xoá lệnh nội dung nghe nhìn được hỗ trợ đối với tín hiệu SEEK đến các ứng dụng của người gửi và màn hình cảm ứng để tắt tính năng tìm kiếm, nhưng không tắt các lệnh thoại như "Ok Google, tua lại 30 giây". Hãy xem hướng dẫn các lệnh nội dung nghe nhìn được hỗ trợ bằng giọng nói để biết thông tin chi tiết về cách tắt lệnh nội dung nghe nhìn cho giọng nói.

Sự kiện khung trực tiếp

Hai sự kiện LIVE_ENDEDLIVE_IS_MOVING_WINDOW_CHANGED có trong API trực tiếp. Cả hai sự kiện đều được truyền một đối tượng LiveStatusEvent, chứa phạm vi tìm kiếm trực tiếp hiện tại.

Event (Sự kiện) Mô tả
LIVE_ENDED Được kích hoạt khi sự kiện trực tiếp kết thúc. Tại thời điểm này, giá trị end trong LiveSeekableRange sẽ ngừng cập nhật; người dùng vẫn có thể xem nội dung trong phạm vi tìm kiếm trực tiếp.
LIVE_IS_MOVING_WINDOW_CHANGED Được kích hoạt khi phạm vi có thể tìm kiếm của luồng trực tiếp thay đổi từ cửa sổ cố định sang cửa sổ di chuyển hoặc ngược lại. Đối với một luồng trực tiếp, điều này sẽ xảy ra khi trình phát phát hiện tệp kê khai đang xoá các phân đoạn trước đó.

Tình huống phát trực tiếp

Có 8 loại tình huống phát trực tiếp, mỗi loại đều được định cấu hình bằng cách thiết lập 3 chế độ cài đặt cốt lõi:

  • Luồng có thời gian bắt đầu
  • Luồng có thời gian kết thúc
  • Người dùng được phép tìm kiếm trong cửa sổ tìm kiếm của luồng trực tiếp

Hãy xem bài viết Thêm dữ liệu hướng dẫn chương trình để biết cách định cấu hình các giá trị đó.

Dưới đây là nội dung mô tả và ảnh chụp màn hình về các trường hợp mà API trực tiếp hỗ trợ. Các biến T1T2 được dùng để thể hiện dấu thời gian tương ứng ở bên trái và bên phải giao diện người dùng.

Thời gian bắt đầu Thời gian kết thúc Có thể xem Người phụ trách Cấp 1 Người phụ trách Cấp 2
Tình huống 1 Không Không Không Đầu phát Không hiển thị
Tình huống 2 Không Không Đầu phát Không hiển thị
Tình huống 3 Không Không Đầu phát Không hiển thị
Tình huống 4 Không Đầu phát Không hiển thị
Tình huống 5 Không Không Hiện thời gian bắt đầu Đầu phát
Tình huống 6 Không Hiện thời gian bắt đầu Đầu phát
Tình huống 7 Không Hiện thời gian bắt đầu Hiện thời gian kết thúc
Tình huống 8 Hiện thời gian bắt đầu Hiện thời gian kết thúc

Tình huống một

Thời gian bắt đầu Thời gian kết thúc Có thể xem Người phụ trách Cấp 1 Người phụ trách Cấp 2
Không Không Không Phát đầu Không hiển thị

Tình huống một không có thời gian bắt đầu hoặc kết thúc và người dùng không thể tìm kiếm trong luồng. Khi người dùng dừng một sự kiện phát trực tiếp, tính năng phát sẽ tiếp tục phát từ cạnh trực tiếp thay vì tạm dừng sự kiện trực tiếp.

Tình huống 7

TV hiển thị Giao diện người dùng trực tiếp của Chromecast trong Tình huống 7 có Thời gian đồng hồ Một chiếc điện thoại di động cho thấy Giao diện người dùng trực tiếp trong Tình huống 7, có Đồng hồ thời gian

Thời gian bắt đầu Thời gian kết thúc Có thể xem Người phụ trách Cấp 1 Người phụ trách Cấp 2
Không Đầu phát Thời lượng chương trình

Tình huống 7 có thời gian bắt đầu và thời gian kết thúc nhưng không thể tìm kiếm. Hai dấu thời gian trong giao diện người dùng là T1 và T2 lần lượt đại diện cho thời gian phát hiện tại và tổng thời lượng chương trình. Nếu người dùng tạm dừng/tiếp tục phát luồng, thì nó sẽ tiếp tục ở cạnh trực tiếp của luồng. Trong ví dụ trên, phần màu đỏ của thanh tìm kiếm đại diện cho phần của luồng kể từ khi người dùng bắt đầu xem.

Tình huống 8

TV hiển thị Giao diện người dùng trực tiếp của Chromecast trong Tình huống 8 có Thời gian đồng hồ Một chiếc điện thoại di động cho thấy Giao diện người dùng trực tiếp trong Tình huống 8, có Đồng hồ thời gian

Thời gian bắt đầu Thời gian kết thúc Có thể xem Người phụ trách Cấp 1 Người phụ trách Cấp 2
Đầu phát Thời lượng chương trình

Tình huống 7 có thời gian bắt đầu, thời gian kết thúc và có thể tìm kiếm được. Hai dấu thời gian trong giao diện người dùng là T1 và T2, lần lượt đại diện cho thời gian phát hiện tại và tổng thời lượng của chương trình. Nếu người dùng tạm dừng/tiếp tục phát sự kiện trực tiếp, thì sự kiện sẽ tiếp tục tại thời điểm họ tạm dừng nếu đang ở trong cửa sổ có thể tìm kiếm — vùng màu đỏ trên thanh tìm kiếm đại diện cho vị trí mà người dùng có thể quay lại và khu vực màu trắng thể hiện nơi họ có thể tìm kiếm.

Định cấu hình kịch bản

Bạn có thể định cấu hình luồng dưới dạng một Tình huống trực tiếp cụ thể trong 3 phần:

  1. Đặt loại sự kiện trực tiếp – Đánh dấu sự kiện trực tiếp là phát trực tiếp.
  2. Thêm dữ liệu hướng dẫn chương trình – Đặt thời gian bắt đầu và thời lượng trong đối tượng MediaMetadata.
  3. Định cấu hình chức năng tìm kiếm – Bật hoặc tắt tính năng tìm kiếm.

Hành vi phát

Trong khi tạm dừng, giao diện người dùng sẽ tiếp tục cập nhật siêu dữ liệu phát, bao gồm cả thời gian ở đầu và thời gian phát trực tiếp. Khi tiếp tục phát trực tiếp, bạn cần lưu ý một số hành vi thay đổi dựa trên cấu hình luồng.

Luồng có thể tìm kiếm

Khi tiếp tục phát một luồng có thể tìm kiếm:

  • Cạnh trực tiếp sẽ được cập nhật thành vị trí trực tiếp và phạm vi tìm kiếm sẽ được điều chỉnh cho phù hợp.
  • Nếu con trỏ vị trí có thể nhảy qua chương trình hiện tại, thanh lọc sẽ được cập nhật bằng siêu dữ liệu từ chương trình mới (bao gồm cả thời gian bắt đầu và thời gian kết thúc nếu có).
  • Nếu một cửa sổ có thể tìm kiếm có độ dài "X", phạm vi tìm kiếm sẽ mở rộng trở lại tối đa là "X" hoặc cho đến đầu chương trình, tuỳ theo giá trị nào nhỏ hơn.
  • Nếu người dùng bị tạm dừng đủ lâu để thời gian hiện tại không còn trong cửa sổ tìm kiếm nữa, thì luồng sẽ tiếp tục ở thời điểm sớm nhất (ở ngoài cùng bên trái) của cửa sổ có thể tìm kiếm đó.

Tìm kiếm LiveSeekableRange.end để tiếp tục phát lại ở cạnh trực tiếp sau khi hủy tạm dừng.

let playerManager = cast.framework.CastReceiverContext.getInstance().getPlayerManager();
// Intercept the message to PLAY
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.PLAY, (requestData) => {
  ...
  if (playerManager.getLiveSeekableRange()) {
    // Resume playback at the live edge
    playerManager.seek(playerManager.getLiveSeekableRange().end);
  } else {
    return requestData;
  }
  ...
});

Luồng không thể tìm kiếm

Khi tiếp tục luồng không thể tìm kiếm:

  • Trong trường hợp này, quá trình phát sẽ tiếp tục ở cạnh trực tiếp.
  • Nếu cạnh trực tiếp nhảy qua chương trình hiện tại, thì thanh lọc sẽ được cập nhật với siêu dữ liệu từ chương trình mới (bao gồm thời gian bắt đầu và thời gian kết thúc nếu có).

Thay đổi giao diện API và tuỳ chỉnh Giao diện người dùng trực tiếp

SDK Cast đã tích hợp tính năng hỗ trợ để tạo các giao diện người dùng tuỳ chỉnh thay vì sử dụng giao diện người dùng sẵn có. Tuy nhiên, bạn cần tuân theo Danh sách kiểm tra thiết kế trải nghiệm người dùng (UX) của Cast khi tuỳ chỉnh giao diện.

Bộ thu trên web

Trên Web receiver, PlayerData bao gồm các trường sau đây để cho phép nhà phát triển mở rộng giao diện tuỳ chỉnh cho các sự kiện phát trực tiếp:

  • isLive – một cờ cho biết luồng hiện tại có phải là luồng trực tiếp hay không, chứ không phải VOD.
  • liveSeekableRange - phạm vi có thể tìm kiếm sẽ hiển thị trên màn hình khi phân giới hạn cửa sổ DVR.
  • mediaStartAbsoluteTime – khi phần bắt đầu theo thời gian tuyệt đối (UNIX Epoch).
  • sectionStartTimeInMedia - thời gian bắt đầu phần tính bằng giây so với thời gian bắt đầu nội dung nghe nhìn.
  • sectionduration - thời lượng mục tính bằng giây.

Ngoài ra, hãy nhớ tính đến 2 sự kiện trực tiếp khi tuỳ chỉnh giao diện người dùng.

SDK Android

Trong chức năng Trực tiếp, chúng tôi đã ngừng sử dụng Tiện ích Thanh tua Android trong UIMediaController. Thay vào đó, hãy sử dụng CastSeekBar.