【Audio&Video】媒体应用架构概述(3)

本节介绍如何将媒体播放器应用程序分离为媒体控制器(用于UI)和媒体会话(用于实际播放器)。它描述了两种媒体应用程序体系结构:适用于音频应用程序的客户端/服务器设计,以及适用于视频播放器的单一活动设计。它还展示了如何让媒体应用程序响应硬件控制并与使用音频输出流的其他应用程序合作。

播放器和UI


播放音频或视频的多媒体应用程序通常由两部分组成:

将数字媒体加入并将其呈现为视频和/或音频的播放器
带有传输控件的用户界面,用于运行播放器并可选择显示播放器的状态

【Audio&Video】媒体应用架构概述(3)

在Android中,您可以从头开始构建自己的播放器,或者您可以从以下选项中进行选择:

在MediaPlayer的类提供了支持最常见的音频/视频格式和数据源的一个最基本的播放器的基本功能。
ExoPlayer 是一个开放源代码库,公开了较低级别的Android音频API。ExoPlayer支持DASH和HLS流等高性能功能,这些功能在英文中不可用MediaPlayer。您可以自定义ExoPlayer代码,从而轻松添加新组件。ExoPlayer只能用于Android 4.1及更高版本。

媒体会话和媒体控制器


虽然用户界面和播放器的API可以是任意的,但是对于所有媒体播放器应用程序而言,这两部分之间的交互性质基本相同。Android框架定义了两个类,一个媒体会话和一个 媒体控制器,它们为构建媒体播放器应用程序提供了一个定义良好的结构。

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

【Audio&Video】媒体应用架构概述(3)

媒体会议
媒体会议负责与播放器的所有通信。它将玩家的API从其他应用程序中隐藏起来。播放器只能从控制它的媒体会话中调用。

会话保持播放器状态的表示(播放/暂停)以及有关播放内容的信息。会话可以接收来自一个或多个媒体控制器的回调。这可以让您的播放器受到您应用的用户界面以及运行Wear OS和Android Auto的配套设备的控制。

媒体控制器
媒体控制器隔离您的用户界面。您的UI代码只与媒体控制器通信,而不是播放器本身。媒体控制器将传输控制操作转换为媒体会话的回调。只要会话状态发生变化,它也会接收来自媒体会话的回调。这提供了一种机制来自动更新关联的用户界面。媒体控制器一次只能连接到一个媒体会话。

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

视频应用与音频应用


在播放视频时,你的眼睛和耳朵都会啮合。播放音频时,您正在聆听,但您也可以同时使用其他应用程序。每种用例都有不同的设计。

视频应用
视频应用需要一个查看内容的窗口。出于这个原因,视频应用通常作为单个Android活动实施。视频出现的屏幕是活动的一部分。

【Audio&Video】媒体应用架构概述(3)

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

要在Android中实现此设计,您可以使用两个组件构建音频应用程序:UI的活动和播放器的服务。如果用户切换到另一个应用程序,该服务可以在后台运行。通过将音频应用程序的两个部分分解为单独的组件,每个组件都可以更高效地运行。与玩家相比,用户界面通常是短暂的,这可能会在没有用户界面的情况下运行很长时间。

【Audio&Video】媒体应用架构概述(3)

支持库提供了两个类来实现这种客户端/服务器方法:MediaBrowserService和MediaBrowser。服务组件被实现为MediaBrowserService包含媒体会话及其播放器的子类。用户界面和媒体控制器的活动应包括一个 MediaBrowser与之通信的a MediaBrowserService。

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

媒体应用和Android音频基础设施


一个设计良好的媒体应用程序应该与其他播放音频的应用程序“一起玩”。应准备好共享手机并与设备上使用音频的其他应用程序合作。它也应该响应设备上的硬件控制。
【Audio&Video】媒体应用架构概述(3)

所有这些行为在控制音频输出中都有描述。

媒体compat库


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

媒体会话和媒体控制器建议的实现是类MediaSessionCompat和 MediaControllerCompat,这是在规定的 媒体compat的支持库。他们取代早期版本的类MediaSession ,并MediaController说是在的是Android 5.0(API级别21)推出。compat类提供相同的功能,但可以更轻松地开发您的应用程序,因为您只需写入一个API。该库通过将媒体会话方法转换为旧版平台版本上的等效方法(可用时)来保证向后兼容性。

如果你已经有一个使用旧类的工作应用程序,我们建议更新到compat类。当您使用compat版本时,您可以删除所有来电registerMediaButtonReceiver()和任何方法RemoteControlClient。

测量性能


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

MediaPlayer.getMetrics()
MediaRecorder.getMetrics()
MediaCodec.getMetrics()
MediaExtractor.getMetrics()

度量标准是针对每个实例分别收集的,并在实例的整个生命周期内保持不变。如果没有指标可用,则该方法返回null。返回的实际度量依赖于类。

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Audio&Video】媒体应用架构概述(3)

猜你喜欢

转载自blog.51cto.com/4789781/2129199