Sử dụng API chuyển dịch thời gian trong dịch vụ đầu vào TV để cho phép người dùng tạm dừng, tua lại và tua nhanh các chương trình trực tiếp trên các kênh dịch vụ của bạn. Nếu ứng dụng của bạn hỗ trợ tính năng chuyển dịch thời gian, thì người dùng sẽ linh hoạt hơn trong cách họ xem nội dung của bạn:
- Người dùng có thể tạm dừng các chương trình trong khi xử lý tình trạng gián đoạn ngắn hạn để họ không bao giờ bỏ lỡ những khoảnh khắc quan trọng.
- Người dùng có thể tua đi nội dung họ đã xem hoặc nội dung họ không quan tâm.
- Người dùng có thể tua lại và xem lại những khoảnh khắc yêu thích trong nội dung của chương trình.
![](https://developer.android.com/static/images/training/tv/tif/time-shift.png?authuser=6&hl=vi)
Hình 1. Bộ điều khiển chế độ phát của Android TV dùng để chuyển dịch thời gian.
Chế độ chuyển dịch thời gian sử dụng các phân đoạn ngắn, tạm thời và được ghi lại của dữ liệu chương trình để triển khai khả năng phát các chương trình trực tiếp. Người dùng không thể phát các bản ghi ghi dịch thời gian này bên ngoài phiên phát hiện tại. Điều này có nghĩa là họ không thể sử dụng tính năng ghi dịch thời gian để tạm dừng một chương trình nhằm xem vào ngày tiếp theo hoặc tạm dừng một chương trình để xem sau trong khi chuyển sang một kênh khác.
Sử dụng API Ghi chương trình truyền hình nếu bạn muốn cho phép người dùng ghi lại nội dung chương trình để xem bên ngoài phiên phát hiện tại.
Thêm tính năng hỗ trợ dịch chuyển thời gian
Để thêm tính năng hỗ trợ dịch chuyển dịch thời gian vào dịch vụ đầu vào TV, bạn cần triển khai các API dịch chuyển thời gian trong lớp TvInputService.Session
, xử lý việc ghi và phát bản ghi dịch chuyển thời gian trong ứng dụng, đồng thời thông báo cho hệ thống rằng dịch vụ đầu vào của bạn có hỗ trợ dịch vụ chuyển dịch thời gian.
Các phương thức TvInputService.Session
mà bạn triển khai như sau:
onTimeShiftGetCurrentPosition()
: được hệ thống gọi để lấy vị trí phát hiện tại tính bằng mili giây. Để biết thêm thông tin chi tiết, hãy xem phần Theo dõi thời gian phát.onTimeShiftGetStartPosition()
: được hệ thống gọi để bắt đầu bản ghi dịch chuyển thời gian hiện tại (tính bằng mili giây). Để biết thêm thông tin chi tiết, hãy xem phần Theo dõi thời gian phát.onTimeShiftPause()
: được gọi khi người dùng tạm dừng phát.onTimeShiftResume()
: được gọi khi người dùng tiếp tục phát.onTimeShiftSeekTo(long)
: được gọi khi hệ thống cần tìm một vị trí thời gian mới. Thông thường, vị trí mới nằm giữa vị trí bắt đầu và vị trí hiện tại.onTimeShiftSetPlaybackParams(PlaybackParams)
: được hệ thống gọi để cung cấp các tham số phát (chẳng hạn như tốc độ phát) cho phiên hiện tại. Để biết thêm thông tin, hãy xem phần Hỗ trợ các tham số phát.
Để biết thêm thông tin về cách thông báo cho hệ thống rằng dịch vụ nhập của bạn hỗ trợ tính năng chuyển dịch thời gian, hãy xem phần Thông báo cho hệ thống về trạng thái chuyển dịch thời gian.
Nếu đang sử dụng Thư viện đồng hành TIF để triển khai lớp TvInputService.Session
, bạn sẽ tự động được triển khai hoạt động chuyển dịch thời gian sử dụng ExoPlayer. Bạn có thể sử dụng phương thức triển khai này hoặc ghi đè các phương thức API chuyển dịch thời gian trong BaseTvInputService.Session
và cung cấp phương thức triển khai của riêng mình. Để biết thêm thông tin về cách sử dụng Thư viện đồng hành TIF, hãy xem phần Tạo dịch vụ đầu vào TV bằng Thư viện đồng hành TIF.
Ghi lại nội dung khi một phiên bắt đầu
Người dùng có thể tạm dừng, tua lại và tua đi nội dung chương trình bằng cách truy cập vào bộ điều khiển chế độ phát cho kênh bằng cách nhấn Chọn trong khi xem nội dung, sau đó chuyển đến bộ điều khiển chế độ phát hoặc sử dụng bộ điều khiển chế độ phát chuyên dụng trên thiết bị từ xa.
Vì người dùng có thể sử dụng tính năng chuyển dịch thời gian bất cứ lúc nào trong khi xem nội dung chương trình, nên dịch vụ đầu vào TV của bạn phải bắt đầu ghi nội dung ghi dịch thời gian ngay khi người dùng chuyển tới một kênh trong quá trình triển khai onTune()
. Bạn cũng cần thông báo cho hệ thống rằng bạn có thể ghi lại bằng cách gọi notifyTimeShiftStatusChanged(int)
, như mô tả trong phần Thông báo cho hệ thống về trạng thái chuyển dịch thời gian.
Quản lý bộ nhớ nội dung đã ghi
Dịch vụ đầu vào TV chịu trách nhiệm lưu trữ các bản ghi dịch chuyển thời gian trong bộ nhớ ứng dụng riêng tư của ứng dụng và phát lại nội dung khi hệ thống gọi phương thức ghi dịch thời gian, chẳng hạn như onTimeShiftResume()
.
Nếu nội dung của bạn đã được lưu trữ trên đám mây và ứng dụng của bạn có thể quản lý các bản ghi dịch chuyển thời gian trên đám mây, thì bạn có thể sử dụng bộ nhớ trên đám mây thay vì bộ nhớ ứng dụng.
Nếu nội dung của bạn sử dụng nội dung được bảo vệ, thì dịch vụ đầu vào TV sẽ chịu trách nhiệm mã hoá đúng cách nội dung đã ghi và giải mã nội dung trong khi phát.
Vì nội dung video đã ghi có thể cần một dung lượng lưu trữ lớn, nên bạn cần quản lý cẩn thận nội dung đã ghi trong khi phát phiên. Nếu thời gian của phiên phát vượt quá khoảng thời gian bạn có thể ghi và lưu trữ để ghi dịch thời gian, hãy điều chỉnh bản ghi dịch chuyển thời gian để duy trì vùng đệm hiện tại nhưng đảm bảo ghi lại thời gian hiện tại. Ví dụ: nếu người dùng đã phát nội dung trong 31 phút và kích thước bản ghi dịch chuyển thời gian tối đa của bạn là 30 phút, hãy điều chỉnh thời gian ghi và thời gian bắt đầu để chứa nội dung từ phút 1 đến phút 31.
Nếu dịch vụ đầu vào TV của bạn không thể hỗ trợ dịch vụ chuyển dịch thời gian do thiếu bộ nhớ, thì bạn phải thông báo cho hệ thống. Để biết thêm thông tin chi tiết về cách thông báo cho hệ thống về các hạn chế hỗ trợ dịch chuyển thời gian, hãy xem phần Thông báo cho hệ thống về trạng thái dịch chuyển thời gian.
Khi người dùng chuyển sang một kênh khác hoặc kết thúc phiên phát, hãy xoá dữ liệu ghi dịch chuyển thời gian của bạn.
Thông báo cho hệ thống về trạng thái chuyển dịch thời gian
Nếu dịch vụ đầu vào TV của bạn hỗ trợ tính năng chuyển dịch thời gian, hãy gọi notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE)
trong quá trình triển khai onTune()
khi người dùng chuyển sang một kênh.
Để thông báo cho hệ thống nếu có bất kỳ khả năng dịch chuyển thời gian nào của dịch vụ đầu vào thay đổi, hãy sử dụng notifyTimeShiftStatusChanged(int)
.
Ví dụ: nếu dịch vụ đầu vào TV không thể hỗ trợ tính năng chuyển dịch thời gian do hạn chế về không gian lưu trữ hoặc vì các lý do khác, hãy gọi notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE)
.
Nếu dịch vụ đầu vào TV của bạn hoàn toàn không hỗ trợ tính năng chuyển dịch thời gian, hãy gọi notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED)
khi phiên phát được tạo. Hệ thống sẽ coi mọi dịch vụ đầu vào không bao giờ gọi notifyTimeShiftStatusChanged()
là một dịch vụ đầu vào không thể hỗ trợ dịch vụ chuyển dịch thời gian. Bài viết này đề cập đến các dịch vụ đầu vào sử dụng API cấp 22 trở xuống.
Số lần phát bản âm thanh
Vị trí bắt đầu của bản ghi dịch chuyển thời gian là vị trí thời gian tuyệt đối sớm nhất (tính bằng mili giây) mà người dùng có thể tìm kiếm. Đây thường là thời điểm quá trình phát video bắt đầu sau khi onTune()
được gọi.
Tuy nhiên, khi người dùng xem một lượng nội dung vượt quá mức mà ứng dụng của bạn có thể ghi, bạn cần bắt đầu ghi một phân đoạn mới để ghi dịch thời gian và cập nhật thời gian bắt đầu cho phù hợp.
Vị trí hiện tại của bản ghi dịch chuyển thời gian là vị trí phát hiện tại, tính bằng mili giây kể từ thời gian bắt đầu của hệ thống. Vị trí này thay đổi liên tục trong quá trình phát. Thông thường, bạn có thể sử dụng công cụ phát để xác định giá trị này, như trong ví dụ sau:
Kotlin
override fun onTimeShiftGetCurrentPosition(): Long = tvPlayer?.run { currentProgram?.let { program -> currentPosition + program.startTimeUtcMillis } } ?: TvInputManager.TIME_SHIFT_INVALID_TIME
Java
@Override public long onTimeShiftGetCurrentPosition() { if (getTvPlayer() != null && currentProgram != null) { return getTvPlayer().getCurrentPosition() + currentProgram.getStartTimeUtcMillis(); } return TvInputManager.TIME_SHIFT_INVALID_TIME; }
Đảm bảo rằng thời gian bắt đầu mà bạn cung cấp khi hệ thống gọi onTimeShiftGetStartPosition()
không bao giờ lớn hơn vị trí thời gian hiện tại mà bạn cung cấp trong onTimeShiftGetCurrentPosition()
.
Hệ thống sử dụng các lệnh gọi này để cập nhật thời lượng dịch chuyển thời gian trong giao diện người dùng của bộ điều khiển chế độ phát.
Hỗ trợ các tham số phát
Để thay đổi tốc độ phát trong quá trình chuyển dịch thời gian, hệ thống sử dụng các tham số phát. Ví dụ: nếu người dùng quyết định tua lại quá trình phát hiện tại, thì các thông số phát mới sẽ được truyền đến ứng dụng với tốc độ phát âm. Tính năng chuyển dịch thời gian cũng hỗ trợ nhiều mức, 2x hoặc 3x, tốc độ phát để tua lại hoặc tua đi.
Hệ thống sẽ gọi phương thức onTimeShiftSetPlaybackParams(PlaybackParams)
bằng đối tượng PlaybackParams
chứa các tham số cho phiên hiện tại. Hãy sử dụng thông tin này để định cấu hình công cụ phát nội dung đa phương tiện của bạn một cách phù hợp.
Nếu công cụ phát của bạn không hỗ trợ một tham số, hãy mô phỏng hành vi dự kiến tốt nhất có thể. Ví dụ: nếu công cụ phát của bạn không hỗ trợ tốc độ gấp 2 lần, hãy sử dụng các thao tác tìm kiếm lặp lại trên công cụ phát để đạt được tốc độ phát gần gấp đôi.
Sau khi đặt các tham số, không thay đổi chế độ cài đặt trừ phi người dùng đưa ra lệnh phát yêu cầu một tham số khác hoặc chuyển sang một kênh mới.