Ứng dụng minh hoạ ExoPlayer

Ứng dụng minh hoạ chính của ExoPlayer phục vụ hai mục đích chính:

  1. Để cung cấp một ví dụ tương đối đơn giản nhưng có đầy đủ tính năng về cách sử dụng ExoPlayer. Ứng dụng minh hoạ có thể được dùng làm điểm bắt đầu thuận tiện để phát triển ứng dụng của riêng bạn.
  2. Để dễ dàng dùng thử ExoPlayer. Có thể sử dụng ứng dụng minh hoạ để thử nghiệm việc phát lại nội dung của riêng bạn ngoài các mẫu có sẵn.

Trang này mô tả cách tải, biên dịch và chạy ứng dụng minh hoạ. Bài viết này cũng mô tả cách sử dụng nó để phát nội dung nghe nhìn của riêng bạn.

Lấy mã

Bạn có thể tìm thấy mã nguồn cho ứng dụng minh hoạ chính trong thư mục demos/main của dự án GitHub của chúng tôi. Nếu bạn chưa thực hiện, hãy sao chép dự án thành một thư mục cục bộ:

git clone https://github.com/androidx/media.git

Tiếp theo, hãy mở dự án trong Android Studio. Bạn sẽ thấy các mục sau trong Chế độ xem Dự án Android (đã mở rộng các thư mục liên quan của ứng dụng minh hoạ):

Dự án trong Android Studio

Biên dịch và chạy

Để biên dịch và chạy ứng dụng minh hoạ, hãy chọn và chạy cấu hình demo trong Android Studio. Ứng dụng minh hoạ sẽ cài đặt và chạy trên một thiết bị Android được kết nối. Bạn nên dùng một thiết bị thực nếu có thể. Nếu bạn muốn dùng trình mô phỏng thay vào đó, vui lòng đọc phần trình mô phỏng trong bài viết Thiết bị được hỗ trợ và đảm bảo rằng Thiết bị ảo của bạn sử dụng ảnh hệ thống có cấp độ API tối thiểu là 23.

SampleChooserActivity và PlayerActivity

Ứng dụng minh hoạ trình bày danh sách mẫu (SampleChooserActivity). Đang chọn một mẫu sẽ mở hoạt động thứ hai (PlayerActivity) để phát. Bản minh hoạ có bộ điều khiển chế độ phát và chức năng lựa chọn bản nhạc. Công cụ này cũng sử dụng Lớp tiện ích EventLogger của ExoPlayer để xuất thông tin gỡ lỗi hữu ích cho nhật ký hệ thống. Bạn có thể xem nhật ký này (cùng với nhật ký mức lỗi cho các thẻ khác) bằng lệnh:

adb logcat EventLogger:V *:E

Bật bộ giải mã đi kèm

ExoPlayer có một số tiện ích cho phép sử dụng phần mềm đi kèm bộ giải mã, bao gồm AV1, VP9, Opus, FLAC và FFmpeg (chỉ âm thanh). Ứng dụng minh hoạ có thể được tạo để bao gồm và sử dụng các tiện ích mở rộng này như sau:

  1. Tạo từng phần mở rộng bạn muốn đưa vào. Lưu ý rằng đây là quy trình thủ công. Tham khảo tệp README.md trong mỗi tiện ích đối với .
  2. Trong chế độ xem Build Variants (Biến thể bản dựng) của Android Studio, hãy đặt biến thể bản dựng cho bản minh hoạ vào withDecoderExtensionsDebug hoặc withDecoderExtensionsRelease dưới dạng như trong hình sau.

    Chọn biến thể bản dựng "withDecoderextensionDebug" minh hoạ

  3. Biên dịch, cài đặt và chạy cấu hình demo như bình thường.

Theo mặc định, bộ giải mã tiện ích sẽ chỉ được sử dụng nếu bộ giải mã nền tảng phù hợp không tồn tại. Bạn có thể chỉ định rằng bộ giải mã tiện ích phải được như được mô tả trong các phần sau.

Phát nội dung của riêng bạn

Có nhiều cách để phát nội dung của riêng bạn trong ứng dụng minh hoạ.

1. Chỉnh sửa nội dung/media.exolist.json

Các mẫu được liệt kê trong ứng dụng minh hoạ được tải qua assets/media.exolist.json. Bạn có thể thêm và xoá mẫu khỏi bản minh hoạ bằng cách chỉnh sửa tệp JSON này . Giản đồ như sau, trong đó [O] cho biết thuộc tính không bắt buộc.

[
  {
    "name": "Name of heading",
    "samples": [
      {
        "name": "Name of sample",
        "uri": "The URI of the sample",
        "extension": "[O] Sample type hint. Values: mpd, ism, m3u8",
        "clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
        "clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
        "drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
        "drm_license_uri": "[O] URI of the license server if protected",
        "drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
        "drm_key_request_properties": "[O] Key request headers if protected",
        "drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks"
        "drm_multi_session": "[O] Enables key rotation if protected",
        "subtitle_uri": "[O] The URI of a subtitle sidecar file",
        "subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
        "subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)",
        "ad_tag_uri": "[O] The URI of an ad tag to load via the IMA extension"
      },
      ...etc
    ]
  },
  ...etc
]

Bạn có thể chỉ định danh sách phát mẫu bằng giản đồ:

[
  {
    "name": "Name of heading",
    "samples": [
      {
        "name": "Name of playlist sample",
        "playlist": [
          {
            "uri": "The URI of the first sample in the playlist",
            "extension": "[O] Sample type hint. Values: mpd, ism, m3u8"
            "clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
            "clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
            "drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
            "drm_license_uri": "[O] URI of the license server if protected",
            "drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
            "drm_key_request_properties": "[O] Key request headers if protected",
            "drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks",
            "drm_multi_session": "[O] Enables key rotation if protected",
            "subtitle_uri": "[O] The URI of a subtitle sidecar file",
            "subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
            "subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)"
          },
          {
            "uri": "The URI of the second sample in the playlist",
            ...etc
          },
          ...etc
        ]
      },
      ...etc
    ]
  },
  ...etc
]

Nếu cần, tiêu đề của yêu cầu khoá sẽ được chỉ định dưới dạng đối tượng chứa chuỗi cho từng tiêu đề:

"drm_key_request_properties": {
  "name1": "value1",
  "name2": "value2",
  ...etc
}

Trong hoạt động trình chọn mẫu, trình đơn mục bổ sung chứa các tuỳ chọn cho chỉ định xem có thích bộ giải mã tiện ích hay không.

URI tệp cục bộ và các quy định hạn chế về bộ nhớ có giới hạn

Khi chỉ định URI tệp cục bộ, ứng dụng minh hoạ sẽ yêu cầu dung lượng lưu trữ cần thiết quyền truy cập để đọc các tệp này. Tuy nhiên, từ Android 13, tính năng này không phải là có thể tải những tệp tuỳ ý không kết thúc bằng một tệp đa phương tiện thông thường phần mở rộng (như .mp4). Nếu bạn cần tải một tệp như vậy, bạn có thể đặt tệp trong thư mục bộ nhớ cụ thể của ứng dụng minh hoạ không có hạn chế truy cập. Chiến dịch này thường nằm tại /sdcard/Android/data/androidx.media3.demo.main/files.

2. Đang tải một tệp exolist.json bên ngoài

Ứng dụng minh hoạ có thể tải các tệp JSON bên ngoài bằng giản đồ ở trên và được đặt tên là theo quy ước *.exolist.json. Ví dụ: nếu bạn lưu trữ một tệp tại https://yourdomain.com/samples.exolist.json, bạn có thể mở tệp đó trong ứng dụng minh hoạ sử dụng:

adb shell am start -a android.intent.action.VIEW \
    -d https://yourdomain.com/samples.exolist.json

Nhấp vào một đường liên kết *.exolist.json (ví dụ: trong trình duyệt hoặc email ứng dụng khách) trên thiết bị đã cài đặt ứng dụng minh hoạ cũng sẽ mở ứng dụng đó trong bản minh hoạ . Do đó, việc lưu trữ tệp JSON *.exolist.json cung cấp một cách đơn giản để phân phối nội dung để người khác dùng thử trong ứng dụng minh hoạ.

3. Kích hoạt một ý định

Ý định có thể được dùng để bỏ qua danh sách mẫu và khởi chạy trực tiếp vào video. Để phát một mẫu duy nhất, hãy đặt hành động của ý định thành androidx.media3.demo.main.action.VIEW và URI dữ liệu của thuộc tính này mẫu để phát. Bạn có thể kích hoạt một ý định như vậy từ thiết bị đầu cuối bằng cách sử dụng:

adb shell am start -a androidx.media3.demo.main.action.VIEW \
    -d https://yourdomain.com/sample.mp4

Các thành phần bổ sung không bắt buộc được hỗ trợ cho một ý định mẫu duy nhất là:

  • Thông tin bổ sung cho cấu hình mẫu:
    • mime_type [Chuỗi] Gợi ý loại MIME mẫu. Ví dụ: application/dash+xml cho nội dung DASH.
    • clip_start_position_ms [Dài] Điểm bắt đầu mà mẫu sẽ được được cắt bớt, tính bằng mili giây.
    • clip_end_position_ms [Dài] Một điểm cuối mà từ đó mẫu sẽ được được cắt bớt, tính bằng mili giây.
    • drm_scheme [Chuỗi] Lược đồ DRM nếu được bảo vệ. Các giá trị hợp lệ là widevine, playreadyclearkey. Các mã nhận dạng duy nhất (UUID) trong lược đồ DRM cũng được chấp nhận.
    • drm_license_uri [Chuỗi] URI của máy chủ cấp phép nếu được bảo vệ.
    • drm_force_default_license_uri [Boolean] Liệu có buộc sử dụng drm_license_uri cho các yêu cầu khoá có chứa URI giấy phép riêng.
    • drm_key_request_properties [Mảng chuỗi] Tiêu đề của yêu cầu khoá được đóng gói dưới dạng name1, value1, name2, value2, v.v. nếu được bảo vệ.
    • drm_session_for_clear_content [Boolean] Liệu có đính kèm một phiên DRM hay không để xoá các bản âm thanh và video.
    • drm_multi_session [Boolean] Bật tính năng xoay vòng khoá nếu được bảo vệ.
    • subtitle_uri [Chuỗi] URI của tệp trợ giúp phụ đề.
    • subtitle_mime_type [Chuỗi] Loại MIME của Subtitles_uri (bắt buộc nếu đã đặt phụ_uri).
    • subtitle_language [Chuỗi] Mã ngôn ngữ BCP47 của tệp phụ đề (sẽ bỏ qua nếu bạn không đặt subtitle_uri).
    • ad_tag_uri [Chuỗi] URI của một thẻ quảng cáo cần tải bằng cách sử dụng [Phần mở rộng IMA][].
    • prefer_extension_decoders [Boolean] Liệu bộ giải mã tiện ích có được ưu tiên hơn những nền tảng.

Khi sử dụng adb shell am start để kích hoạt một ý định, một chuỗi bổ sung không bắt buộc có thể được thiết lập bằng --es (ví dụ: --es extension mpd). Giá trị boolean bổ sung không bắt buộc có thể được thiết lập bằng --ez (ví dụ: --ez prefer_extension_decoders TRUE). Không bắt buộc Bạn có thể đặt hàm bổ sung dài bằng --el (ví dụ: --el clip_start_position_ms 5000). Một bạn có thể đặt thêm mảng chuỗi tuỳ chọn bằng --esa (ví dụ: --esa drm_key_request_properties name1,value1).

Để phát danh sách phát mẫu, hãy đặt thao tác của ý định thành androidx.media3.demo.main.action.VIEW_LIST. Cấu hình mẫu dữ liệu bổ sung sẽ giữ nguyên như đối với androidx.media3.demo.main.action.VIEW, ngoại trừ hai điểm khác biệt:

  • Các tính năng bổ sung khoá phải có dấu gạch dưới và chỉ mục dựa trên 0 của mẫu dưới dạng hậu tố. Ví dụ: extension_0 sẽ gợi ý cho loại mẫu cho mẫu. drm_scheme_1 sẽ đặt lược đồ DRM cho mẫu thứ hai.
  • URI của mẫu được truyền dưới dạng dữ liệu bổ sung bằng khoá uri_<sample-index>.

Các dữ liệu bổ sung khác không phụ thuộc mẫu sẽ không thay đổi. Ví dụ: bạn có thể chạy lệnh sau trong cửa sổ dòng lệnh để phát danh sách phát có hai mục, ghi đè phần mở rộng của mục thứ hai:

adb shell am start -a androidx.media3.demo.main.action.VIEW_LIST \
    --es uri_0 https://a.com/sample1.mp4 \
    --es uri_1 https://b.com/sample2.fake_mpd \
    --es extension_1 mpd