原文地址:https://developer.android.google.cn/guide/topics/media-apps/media-apps-overview.html
播放器和UI
播放音频或视频的多媒体应用通常有两个部分:- 将数字媒体作为视频和/或音频呈现的播放器
- 具有传输控制作用的UI,用于运行播放器和展示播放器播放状态
- MediaPlayer类为支持最常见的音频/视频格式和数据源的纯粹的播放器提供基本功能。
- ExoPlayer是暴露低版本Android的音频API的开源库。 ExoPlayer支持在MediaPlayer中不可用的高性能功能,如DASH和HLS流。可以自定义ExoPlayer代码,使添加新组件变得容易。 ExoPlayer只能与Android 4.1及更高版本一起使用。
Media session and media controller
虽然UI和播放器的API可以是任意的,但是对于所有媒体播放器应用程序来说,这两个部分之间的交互性质基本相同。 Android框架定义了两个类,MediaSession和 MediaController,它们对构建媒体播放器应用程序施加了明确的结构。
MediaSession和MediaController使用预定义回调来互通信,这些回调用来回应播放器的动作(播放,暂停,停止等)以及你在你的app中单独设置的行为
Media session
Media session负责与播放器的所有通信。它隐藏了您应用程序其余部分的播放器API。播放器只能从控制它的媒体会话中调用。该会话保持播放器状态(播放/暂停)的表示以及正在播放的内容的信息。Media session可以接收来自一个或多个 media controllers的回调。这使得您的播放器可以由您的应用程序的UI以及运行Android Wear和Android Auto的随播设备进行控制。
Media controller
media controllers隔离您的UI。您的UI代码仅与 media controller,通信,而不是播放器本身。 media controller将传输控制动作转换为回调到 media session。每当会话状态改变时,它也会从 media session中接收回调。这提供了一种自动更新关联的UI的机制。 media controller一次只能连接到一个 media session。使用 media controller和 media session时,您可以在运行时部署不同的接口和播放器。您可以根据运行的设备的功能,独立地更改应用程序的外观和性能。
视频应用与音频应用
视频应用
视频应用程序需要一个用于查看内容的窗口。因此,视频应用程序通常实现为单个Android活动。视频出现的屏幕是活动的一部分。音频应用
音频播放器并不总是需要使其UI可见。一旦开始播放音频,播放器就可以作为后台任务运行。用户可以切换到另一个应用程序,并继续听。要在Android中实现这一设计,您可以使用两个组件构建一个音频应用程序: activity(展示所用) 和播放器service。如果用户切换到另一个应用程序,则该service可以在后台运行。通过将音频应用程序的两个部分分解为单独的组件,每个组件可以独立运行。与播放器相比,UI通常是短暂的,可能会在没有UI的情况下运行很长时间。
支持库提供了两个类来实现此客户端/服务器方法:MediaBrowserService和MediaBrowser。该服务组件被实现为包含媒体会话及其播放器的MediaBrowserService的子类。使用UI和媒体控制器的活动应包括与MediaBrowserService进行通信的MediaBrowser。
使用MediaBrowserService可以让随身设备(如Android Auto and Wear)轻松发现您的应用,连接到它,浏览内容和控制播放,而无需访问您的Activity。
媒体应用和Android音频基础架构
所有这些行为都在“ 处理音频输出中的更改”中有所描述。
媒体兼容库
media-compat库包含有助于构建播放音频和视频的应用程序的类。这些类与运行Android 2.3(API等级9)及更高版本的设备兼容。他们还可以使用其他Android功能来创建一个舒适,熟悉的Android体验。
media sessions and media controllers的推荐实现是MediaSessionCompat和MediaControllerCompat,它们在media-compat支持库中定义。它们替代Android 5.0(API级别21)中引入的MediaSession和MediaController类的早期版本。 compat类提供相同的功能,但是您可以轻松地开发应用程序,因为您只需要写入一个API。通过将媒体会话方法转换为可用的较旧平台版本上的等效方法,该库负责向后兼容性。如果您已经有一个正在使用较旧类的工作应用程序,我们建议您更新到compat类。当您使用compat版本时,可以删除对RegisterMediaButtonReceiver()的所有调用以及RemoteControlClient中的所有方法。
测量性能
- MediaPlayer.getMetrics()
- MediaRecorder.getMetrics()
- MediaCodec.getMetrics()
- MediaExtractor.getMetrics()