android音视频指南-媒体应用架构概述

翻译自Media app architecture overviewhtml

本节将解释如何将媒体播放器应用程序分离为媒体控制器(用于UI)和媒体会话(用于实际播放器)。它描述了两种媒体应用程序架构:一种客户端/服务器设计,适用于音频应用程序,另外一种是视频播放器的单活动设计。它还展现了如何使媒体应用程序响应硬件控制并与使用音频输出流的其余应用程序合做。android

播放器和用户界面

播放音频或视频的多媒体应用程序一般有两部分:api

  • 一种将数字媒体带入并将其呈现为视频和/或音频的播放器
  • 一个带有传输控件的UI,能够运行播放器并显示播放器的状态

image

在Android中,你能够从头开始构建本身的播放器,或者你能够从如下选项中选择:服务器

  • MediaPlayer类为支持最多见的音频/视频格式和数据源的基本播放器提供了基本功能。
  • ExoPlayer是一个开源库,能够公开底层的Android音频api。ExoPlayer支持诸如DASH和HLS流等在MediaPlayer中不可用的高性能特性。您能够自定义ExoPlayer代码,使添加新组件变得容易。ExoPlayer只能在Android 4.1及更高版本下使用。

媒体会话media session和媒体控制器media controller

虽然UI和播放器的api能够是任意的,可是对于全部媒体播放器应用程序来讲,这两部分之间的交互本质上是相同的。Android框架定义了两个类,一个媒体会话和一个媒体控制器,它们为构建媒体播放器应用程序强加了定义良好的结构。session

媒体会话和媒体控制器使用与标准播放器动做(播放、暂停、中止等)对应的预约义回调进行通讯,以及可扩展的定制调用,您可使用这些调用定义应用程序特有的特殊行为。架构

image

媒体会话media session

媒体会话负责与播放器的全部交流。它会将播放器的API隐藏到应用程序的其余部分。播放器只能从控制它的媒体会话中调用。app

该会话维护播放器状态(播放/暂停)和关于正在播放内容的信息的表示。会话能够从一个或多个媒体控制器接收回调。这使得你的播放器可以被你的应用程序的UI以及运行Wear OS和Android Auto的配套设备所控制。框架

媒体控制器media controller

媒体控制器隔离你的UI。你的UI代码只与媒体控制器通讯,而不是播放器自己。媒体控制器将传输控制操做转换为对媒体会话的回调。当会话状态发生变化时,它还从媒体会话接收回调。这提供了一种自动更新关联UI的机制。媒体控制器一次只能链接到一个媒体会话。ide

当您使用媒体控制器和媒体会话时,您能够在运行时部署不一样的接口和/或播放器。你能够改变你的应用的外观和/或性能独立取决于设备运行的能力。post

视频应用和音频应用

当播放视频时,你的眼睛和耳朵都在工做。播放音频时,你是在听,但你也能够同时使用不一样的应用程序。每一个用例都有不一样的设计。

视频应用

视频应用程序须要一个窗口来查看内容。因为这个缘由,视频应用程序一般被实现为一个单一的Android活动。视频显示的屏幕是活动的一部分。

image

音频应用程序

音频播放器并不老是须要其UI可见。一旦开始播放音频,播放器就能够做为后台任务运行。用户能够切换到另外一个应用程序,一边听一边工做。

要在Android中实现这个设计,您可使用两个组件构建一个音频应用程序:一个用于UI的活动,一个用于播放器的服务。若是用户切换到另外一个应用程序,服务能够在后台运行。经过将音频应用程序的两个部分分解成单独的组件,每一个组件均可以更高效地独立运行。与没有UI的播放器相比,UI一般是很短暂的,由于播放器在没有UI的状况下可能会运行很长时间。

image

支持库提供了两个类来实现这种客户机/服务器方法:MediaBrowserServiceMediaBrowser。服务组件做为包含媒体会话及其播放器的MediaBrowserService的子类实现。带有UI和媒体控制器的活动应该包括一个MediaBrowser,它与MediaBrowserService通讯。

使用MediaBrowserService可让配套设备(如Android Auto和Wear)很容易地发现你的应用程序,链接到它,浏览内容和控制回放,而不须要访问你的UI活动。

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

一个设计良好的媒体应用程序应该和其余播放音频的应用程序“一块儿玩得很好”。它应该准备好与使用音频的设备上的其余应用程序共享手机和合做。它还应该对设备上的硬件控件作出响应。

image
上述行为查看 Controlling Audio Output.

media-compat库

media-compat库包含的类有助于构建播放音频和视频的应用程序。这些类与运行Android 2.3 (API level 9)及更高版本的设备兼容。他们还与其余Android特性一块儿工做,以建立一个温馨的、熟悉的Android体验。

媒体会话和媒体控制器的推荐实现是MediaSessionCompatMediaControllerCompat类,它们在media-compat支持库中定义。它们替换了Android 5.0 (API级别21)中引入的类MediaSessionMediaController的早期版本。compat类提供了相同的功能,但使开发应用程序更容易,由于只须要编写一个API。库经过将媒体会话方法转换为旧平台版本上的等效方法来处理向后兼容性。

若是您已经有了一个使用旧类的工做应用程序,咱们建议更新到compat类。使用compat版本时,能够删除对registerMediaButtonReceiver()RemoteControlClient的任何方法的全部调用。

测量性能

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

为每一个实例分别收集指标,并为实例的生命周期持久保存。若是没有可用的指标,该方法返回null。返回的实际指标取决于类。


下一篇:android音视频指南-使用媒体会话media session

相关文章
相关标签/搜索