ExoPlayer 的主要演示应用有两个主要目的
- 提供一个相对简单但功能齐全的 ExoPlayer 使用示例。演示应用可以用作方便的起点,您可以从中开发自己的应用。
- 方便试用 ExoPlayer。除了包含的示例外,演示应用还可以用于测试您自己内容的播放。
本页面介绍如何获取、编译和运行演示应用程序。还介绍如何使用它播放您自己的媒体。
获取代码
主演示应用程序的源代码可以在我们GitHub项目的demos/main
文件夹中找到。如果您尚未这样做,请将项目克隆到本地目录。
git clone https://github.com/androidx/media.git
接下来,在Android Studio中打开项目。您应该在Android项目视图中看到以下内容(演示应用程序的相关文件夹已展开)。
编译和运行
要编译并运行演示应用程序,请在Android Studio中选择并运行demo
配置。演示应用程序将安装并在连接的Android设备上运行。我们建议尽可能使用物理设备。如果您希望改用模拟器,请阅读支持的设备部分中的模拟器部分,并确保您的虚拟设备使用API级别至少为23的系统映像。
演示应用程序显示一个示例列表(SampleChooserActivity
)。选择一个示例将打开第二个活动(PlayerActivity
)进行播放。演示功能包括播放控件和音轨选择功能。它还使用ExoPlayer的EventLogger
实用程序类将有用的调试信息输出到系统日志。可以使用以下命令查看此日志(以及其他标签的错误级别日志):
adb logcat EventLogger:V *:E
启用捆绑解码器
ExoPlayer 有许多扩展程序允许使用捆绑的软件解码器,包括 AV1、VP9、Opus、FLAC 和 FFmpeg(仅限音频)。演示应用程序可以构建为包含并使用这些扩展程序,方法如下:
- 构建您想要包含的每个扩展程序。请注意,这是一个手动过程。有关说明,请参阅每个扩展程序中的
README.md
文件。 在Android Studio的构建变体视图中,将演示模块的构建变体设置为
withDecoderExtensionsDebug
或withDecoderExtensionsRelease
,如下图所示。像往常一样编译、安装和运行
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 文件
演示应用程序可以使用上述架构加载外部 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 设置为要播放的示例的数据 URI。可以使用终端从终端触发此类意图:
adb shell am start -a androidx.media3.demo.main.action.VIEW \ -d https://yourdomain.com/sample.mp4
单个示例意图的支持可选额外信息:
- 示例配置额外信息
mime_type
[字符串] 示例 MIME 类型提示。例如,DASH 内容的application/dash+xml
。clip_start_position_ms
[长整型] 示例应剪辑到的起点(以毫秒为单位)。clip_end_position_ms
[长整型] 示例应剪辑到的终点(以毫秒为单位)。drm_scheme
[字符串] 如果受保护,则为 DRM 方案。有效值为widevine
、playready
和clearkey
。也接受 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 扩展][]加载的广告标签的 URI。prefer_extension_decoders
[布尔值] 是否优先使用扩展解码器而不是平台解码器。
使用adb shell am start
发送意图时,可以使用--es
设置可选字符串额外信息(例如,--es extension mpd
)。可以使用--ez
设置可选布尔额外信息(例如,--ez prefer_extension_decoders TRUE
)。可以使用--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