ExoPlayer 데모 애플리케이션

ExoPlayer의 기본 데모 앱은 두 가지 주요 용도로 사용됩니다.

  1. 비교적 간단하지만 모든 기능을 갖춘 ExoPlayer 사용 예를 제공하기 위해 데모 앱을 개발을 위한 편리한 시작점으로 사용할 수 있습니다. 있습니다.
  2. ExoPlayer를 쉽게 사용해 보려면 데모 앱을 사용하여 자체 콘텐츠를 직접 검토해 보세요.

이 페이지에서는 데모 앱을 가져오고 컴파일하고 실행하는 방법을 설명합니다. 또한 다음을 설명합니다. 미디어 재생 방법을 알아보겠습니다.

코드 가져오기

기본 데모 앱의 소스 코드는 demos/main 폴더에서 확인할 수 있습니다. Google Cloud의 GitHub 프로젝트를 살펴보세요. 아직 하지 않았다면 프로젝트를 로컬 디렉터리:

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

그런 다음 Android 스튜디오에서 프로젝트를 엽니다. 다음과 같이 표시됩니다. Android 프로젝트 뷰 (데모 앱의 관련 폴더는 확장됨):

Android 스튜디오의 프로젝트

컴파일 및 실행

데모 앱을 컴파일하고 실행하려면 다음에서 demo 구성을 선택하고 실행합니다. Android 스튜디오입니다. 데모 앱이 연결된 Android 기기에 설치되고 실행됩니다. 가능하면 실제 기기를 사용하는 것이 좋습니다. 에뮬레이터를 사용하려는 경우 지원되는 기기의 에뮬레이터 섹션을 읽고 가상 기기에서 API 수준이 최소 23인 시스템 이미지를 사용해야 합니다.

SampleChooserActivity 및 PlayerActivity

데모 앱에는 샘플 목록 (SampleChooserActivity)이 표시됩니다. 선택 중 샘플은 재생을 위한 두 번째 활동 (PlayerActivity)을 엽니다. 데모 에는 재생 컨트롤과 트랙 선택 기능이 포함되어 있습니다. 또한 유용한 디버그 정보를 출력하는 ExoPlayer의 EventLogger 유틸리티 클래스 시스템 로그 이 로깅은 다음에 대한 오류 수준 로깅과 함께 볼 수 있습니다. 다른 태그)를 다음 명령어로 대체합니다.

adb logcat EventLogger:V *:E

번들 디코더 사용 설정

ExoPlayer에는 번들 소프트웨어를 사용할 수 있는 여러 확장 프로그램이 있습니다. AV1, VP9, Opus, FLAC, FFmpeg (오디오만)를 포함하는 디코더를 지원합니다. 데모 앱 다음과 같이 이러한 확장 프로그램을 포함하고 사용하도록 빌드할 수 있습니다.

  1. 포함하려는 각 확장 프로그램을 빌드합니다. 이것은 수동으로 처리합니다 다음 각 확장 프로그램의 README.md 파일 참조 참조하세요.
  2. Android 스튜디오의 Build Variants 뷰에서 데모의 빌드 변형을 설정합니다. 모듈을 withDecoderExtensionsDebug 또는 withDecoderExtensionsRelease로 다음 이미지에 나와 있습니다.

    데모 `withDecoderExtensionsDebug` 빌드 변형 선택

  3. 평소처럼 demo 구성을 컴파일, 설치, 실행합니다.

기본적으로 확장 디코더는 적합한 플랫폼 디코더가 존재하지 않습니다. 확장 디코더가 다음 섹션에 설명된 대로 사용하세요.

내 콘텐츠 재생

데모 앱에서 내 콘텐츠를 재생하는 방법에는 여러 가지가 있습니다.

1. assets/media.exolist.json 수정

데모 앱에 나열된 샘플은 assets/media.exolist.json에서 로드됩니다. 이 JSON 파일을 수정하여 데모에서 샘플을 추가하거나 제거할 수 있습니다. 있습니다. 스키마는 다음과 같습니다. 여기서 [O] 는 선택적 속성을 나타냅니다.

[
  {
    "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
]

샘플 재생목록은 스키마를 사용하여 지정할 수 있습니다.

[
  {
    "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
]

필요한 경우 키 요청 헤더가 문자열이 포함된 객체로 지정됩니다. 속성을 다음과 같이 정의합니다.

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

샘플 선택기 활동에서 더보기 메뉴에는 확장 디코더 선호 여부를 지정합니다.

로컬 파일 URI 및 범위 지정 저장소 제한사항

로컬 파일 URI를 지정할 때 데모 앱이 필요한 저장소를 요청합니다. 이러한 파일을 읽을 수 있는 액세스 권한이 있어야 합니다. 그러나 Android 13부터 일반적인 미디어 파일로 끝나지 않는 임의의 파일을 로드할 수 있음 확장자 (예: .mp4)를 사용합니다. 이러한 파일을 로드해야 하는 경우 데모 앱의 특정 저장소 디렉터리에 있어야 합니다. 이 일반적으로 /sdcard/Android/data/androidx.media3.demo.main/files에 있습니다.

2. 외부 exolist.json 파일 로드

데모 앱은 위의 스키마를 사용하고 이름이 지정된 *.exolist.json 규칙을 따릅니다. 예를 들어 이러한 파일을 https://yourdomain.com/samples.exolist.json에 있는 경우 다음 위치에서 열 수 있습니다. 데모 앱을 사용할 수 있습니다.

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

*.exolist.json 링크 클릭 (예: 브라우저 또는 이메일) 클라이언트)를 실행해도 데모에서 이 앱이 열립니다. 있습니다. 따라서 *.exolist.json JSON 파일을 호스팅하면 데모 앱에서 사용해 볼 수 있는 콘텐츠를 배포했습니다.

3. 인텐트 실행

인텐트를 사용하여 샘플 목록을 우회하고 있습니다. 단일 샘플을 재생하려면 인텐트의 작업을 androidx.media3.demo.main.action.VIEW 및 데이터 URI를 샘플 재생 버튼을 클릭합니다. 이러한 인텐트는 다음을 사용하여 터미널에서 실행할 수 있습니다.

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

단일 샘플 인텐트에 지원되는 선택적 추가 항목은 다음과 같습니다.

  • 샘플 구성 추가 항목: <ph type="x-smartling-placeholder">
      </ph>
    • mime_type [문자열] 샘플 MIME 유형 힌트입니다. 예: DASH 콘텐츠의 경우 application/dash+xml
    • clip_start_position_ms [Long] 샘플이 시작되어야 하는 시작점 밀리초 단위로 표시됩니다
    • clip_end_position_ms[Long] 샘플이 시작되어야 하는 끝 지점입니다. 밀리초 단위로 표시됩니다
    • drm_scheme [문자열] 보호된 경우 DRM 스키마입니다. 유효한 값은 widevine입니다. playreadyclearkey. DRM 스키마 UUID도 허용됩니다.
    • drm_license_uri [문자열] 보호되는 경우 라이선스 서버의 URI입니다.
    • drm_force_default_license_uri [불리언] 다음 항목 강제 사용 여부 자체 라이선스 URI가 포함된 키 요청의 경우 drm_license_uri
    • drm_key_request_properties [문자열 배열] 키 요청 헤더가 다음과 같이 패킹됨 보호되는 경우 name1, value1, name2, value2 등입니다.
    • drm_session_for_clear_content [불리언] DRM 세션 연결 여부입니다. 동영상 및 오디오 트랙을 지울 수 있습니다.
    • drm_multi_session [불리언] 보호된 경우 키 순환을 사용 설정합니다.
    • subtitle_uri [문자열] 자막 사이드카 파일의 URI입니다.
    • subtitle_mime_type [문자열] subtitle_uri의 MIME 유형입니다( subtitle_uri가 설정된 경우).
    • subtitle_language [문자열] 자막 파일의 BCP47 언어 코드입니다. (subtitle_uri가 설정되지 않은 경우 무시됨)
    • ad_tag_uri [문자열] [IMA 확장 프로그램][]을 사용합니다.
    • prefer_extension_decoders [불리언] 확장 디코더의 선호합니다.

adb shell am start를 사용하여 인텐트를 실행할 때 선택적 문자열인 추가 항목은 --es로 설정해야 합니다 (예: --es extension mpd)을 입력합니다. 선택적 불리언 추가 항목은 --ez로 설정해야 합니다 (예: --ez prefer_extension_decoders TRUE)을 입력합니다. 선택적 long extra는 --el로 설정할 수 있습니다 (예: --el clip_start_position_ms 5000)을 입력합니다. 선택적 문자열 배열 추가는 --esa로 설정할 수 있습니다 (예: --esa drm_key_request_properties name1,value1)을 입력합니다.

샘플 재생목록을 재생하려면 인텐트의 작업을 androidx.media3.demo.main.action.VIEW_LIST 샘플 구성 추가 항목은 androidx.media3.demo.main.action.VIEW와 동일하게 유지됩니다. 다음 두 가지 차이점을 제외하고는 다음과 같습니다.

  • 보너스 콘텐츠 키에는 밑줄과 0부터 시작하는 샘플 색인이 있어야 합니다. 를 접미사로 사용합니다. 예를 들어 extension_0는 첫 번째 샘플입니다. drm_scheme_1는 두 번째 샘플의 DRM 스키마를 설정합니다.
  • 샘플의 URI는 uri_<sample-index> 키를 사용하여 추가로 전달됩니다.

샘플에 종속되지 않는 다른 추가 항목은 변경되지 않습니다. 예를 들어 터미널에서 다음 명령어를 실행하여 항목이 두 개인 재생목록을 재생할 수 있습니다. 두 번째 항목의 확장자를 재정의합니다.

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