Media Apps Overview

原文链接
In this document
  • Player and UI
  • Media session and media controller
  • Video apps versus audio apps
  • Media apps and the Android audio infrastructure
  • The media-compat library
  • Measuring performance


Player and UI


播放音频或视频的多媒体应用通常有两个部分:

  • 一个接收多媒体数据,通过视频/音频展示出来的播放器
  • 一个通过 transport controls 运行播放器,并可以选择性地显示播放器状态的 UI 界面

这里写图片描述

在 Android 系统中,你可以从头创建自己的播放器,亦或者你可以从下面的条目中选择 :

  • MediaPlayer 类给一个简单的播放器(支持大部分常见的音/视频格式和数据源)提供了最基本的功能
  • ExoPlayer 是一个公开低版本 Android audio api 的开源库。ExoPlayer 提供了支持类似于 DASH 和 HLS 这种在 MediaPlayer 中不可用的流的高性能特征。你也可以重构 ExoPlayer 的代码,使得它更易于添加新的功能。ExoPlayer 只能被用于 Android 4.1 及更高版本中。


Media session and media controller


虽然 UI 和 播放器 的 API 可以使任意的,但是对于所有的多媒体播放app而言他们的交互在本质上基本相同。Android framework 定义了两个类:media session 和 media controller,这两个类为 媒体播放器app 提供了一套完善的播放器框架。

媒体会话和媒体控制器使用与标准播放器操作(播放,暂停,停止等)相对应的预定义回调来进行相互通信,以及用于定义特定于您的应用的特殊行为的可扩展自定义调用。

这里写图片描述

Media session

media session 负责与播放器的所有通信。它隐藏了播放器的 API 从而使得这部分对于 app 的其他模块不可见。播放器仅可以被控制着它的 media session 所调用。

media session 维护了一个代表着播放器状态(播放/暂停)的引用以及维护了当前正在播放的音/视频的信息。一个 media session 可以接收一个或者多个 media controller 的调用。这个特性使得你的播放器被你的 app 包括正在运行着的其他 Android 设备(Android Wear and Android Auto) 一起控制成为可能。

Media controller

media controller 将 UI 隔离开来。 UI 的代码只与 media controller 通信,而不是播放器本身。 media controller 将 transport control 操作转换为 media session 的回调。 当 media session 的状态(播放器状态)改变时,media controller 也接收来自 media session 的回调。 以上提供了一种自动更新相关 UI 的机制。 media controller 一次只能连接到一个 media session 。

当您使用 media controller 和 media session 时,您可以在运行时部署不同的接口和/或播放器。 您可以根据所运行设备的功能,独立更改应用的外观和/或性能。


Video apps versus audio apps


在播放视频时,你的眼睛和耳朵都被占用了。 播放音频时,您正在收听,但您也可以同时使用其他应用程序。 每个用例都有不同的设计。

Video app

视频应用程序需要一个查看内容的窗口。 出于这个原因,视频应用程序通常会实现一个单独的 Activity 。 显示视频的屏幕是 Activity 的一部分。

这里写图片描述

Audio app

音频播放器并不总是需要可见的UI。 一旦开始播放音频,播放器可以作为后台任务继续运行。 用户可以切换到另一个应用程序,一边工作一边收听。

要在Android中实现此设计,您可以使用两个组件构建一个音频应用程序:用于展示UI的 Activity 和 维护播放器的 Service 。 如果用户切换到另一个应用程序,该 Service 可以在后台运行。 通过将音频应用程序的两个部分分解为单独的组件,每个组件可以更有效地运行。 与播放器相比,UI通常是”短寿命”的,而播放器可以在没有UI的情况下运行很长时间。

这里写图片描述

支持库提供了两个类来实现这种客户端/服务器方法:MediaBrowserService 和 MediaBrowser。 service 组件被实现为MediaBrowserService的一个子类,包含 media session 及其播放器。 activity 和 media controller 的应该维护一个用于和 MediaBrowserService 进行通信 MediaBrowser 。

使用 MediaBrowserService 可以让配套设备(如Android Auto和Wear)轻松发现您的应用,连接到它,浏览内容并控制,而无需访问您的 activity 。


Media apps and the Android audio infrastructure


一个设计良好的媒体应用程序应该与其他播放音频的应用程序“一起和谐共处”。 它应该准备共享手机,并与您的设备上使用音频的其他应用程序合作。 它也应该响应设备上的硬件控制。

这里写图片描述

所有这些行为在 Handling Changes in Audio Output 中都有描述。


The media-compat library


media-compat 库包含有助于构建播放音频和视频的应用程序的类。 这些类与运行Android 2.3(API级别9)及更高版本的设备兼容。 他们还与其他Android功能一起工作,以创建舒适,熟悉的Android体验。

media sessions 和 media controllers 的推荐实现类是media-compat 支持库中定义的MediaSessionCompat 和 MediaControllerCompat 。 它们替代Android 5.0(API级别21)中引入的MediaSession 和 MediaController 类的早期版本。 compat 类提供相同的功能,但更容易开发你的应用程序,因为你只需要写一次 API 。 该库通过将媒体会话方法转换为旧版平台版本上的等效方法(可用时)来保持向后兼容性。

如果您已经有一个使用旧类的工作应用程序,我们建议更新到 compat 类。 当您使用 compat 版本时,您可以删除所有对 registerMediaButtonReceiver()的调用以及 RemoteControlClient .


Measuring performance


在Android 8.0(API级别26)及更高版本中,getMetrics()方法适用于某些媒体类。 它返回一个包含配置和性能信息的Bundle对象,表示为属性(键)和值的映射 – map。 getMetrics()方法是为这些媒体类定义的:

Metrics 是为每个实例分别收集的,并在实例的整个生命周期内保持不变。 如果没有 metrics 可用,则该方法返回null。 返回的实际 metrics 取决于获取它的类。

Additional code samples


要下载演示此页面上使用的API的示例,请参阅 Android ScreenCapture

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值