阅读 87

MediaSession框架的介绍和使用

一:框架介绍

音视频组成播放器和界面

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

  • 播放器,用于吸收数字媒体并将其呈现为视频和/或音频

  • 界面,带有用于运行播放器并显示播放器状态(可选)的传输控件

4B714249-2C45-4D68-8296-023A545119EC.png

通常我们写视频播放器可以使用mediaPalyer、ExoPlayer等,UI我们自己实现。

我们开发过程中自己回实现一套接口或者回调,来处理Ui和Player直接的通信,也是可以的,但是如果我们有加入了其他的Ui控制,或者其他的app的连接,显的有些麻烦。

所以谷歌推出了MediaSession框架,可以很好的解耦UI和播放器,以及统一的接口,可以更大的支持多设备的控制和连接。

MediaSession框架

98430FF9-FCC6-480A-B2D6-5F21C8503D0E.png

虽然界面和播放器采用的 API 可能各不相同,但是对所有媒体播放器应用来说,这两部分之间的交互的性质都基本相同。Android 框架定义了两个类(媒体会话和媒体控制器),它们为构建媒体播放器应用提供了一个完善的结构。

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

MediaSession媒体会话

媒体会话负责与播放器的所有通信。它会对应用的其他部分隐藏播放器的 API。系统只能从控制播放器的媒体会话中调用播放器。

MediaSession会维护播放器状态(播放/暂停)的表示形式以及播放内容的相关信息。会话可以接收来自一个或多个媒体控制器的回调。这样,应用的界面以及运行 Wear OS 和 Android Auto 的配套设备便可以控制您的播放器。响应回调的逻辑必须保持一致。无论哪个客户端应用发起了回调,对 MediaSession回调的响应都应该相同。

MediaControl媒体控制器

MediaControl会隔离您的界面。您的界面代码只与MediaControl(而非播放器本身)通信。

MediaControl会将传输控制操作转换为对MediaSession的回调。每当会话状态发生变化时,它也会接收来自媒体会话的回调。这提供了一种自动更新关联界面的机制。媒体控制器一次只能连接到一个媒体会话。

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

音乐app和视频app的架构和区别

音频app

UI + player,其中可以在后台播放,然后操作其他app的,所以对比视频app,多了MediaBrowser和MediaBrowserService

297142D4-2F35-4FCB-8B7B-3EFC51AC3A8E.png

视频app

ui + player,不能在后台播放,必然是暂停或者退出的,那么他可以是单Activity的完成,呈现视频的屏幕是 Activity 的一部分,如下

3C0C1D36-37F1-44EA-B9B8-ED732F5E3611.png

优点

优点:使用一套接口,减少了很多流程的繁琐和service的通信等,实现多个设备或者ui的统一调用,其代码可读性、结构耦合度方面都控制得非常好。

C8B1EFFE-D2FA-4209-B1C0-CDA84C11890A.png

AutoMotive 汽车的MediaSession音视频有什么不同

官方:构建车载媒体应用可以了解到汽车中的MediaSession并无变化,主要是对Auto的支持等

本指南假定您已经拥有可在手机上播放音频的媒体应用,并且您的媒体应用遵循 Android 媒体应用架构。

本指南介绍了您的应用在 Android Auto 或 Android Automotive OS 上运行所需的 MediaBrowserService 和 MediaSession 组件。完成核心媒体基础架构的搭建后,您可以向媒体应用添加对 Android Auto 的支持和添加对 Android Automotive OS 的支持。

官方Demo

  • UAMP — 通用音乐播放器使用 ExoPlayer 来播放本地音频。

  • ExoPlayer 演示应用 — 官方代码库中包含一个演示应用,该应用展示了该库的许多高级功能。

  • 通过 MediaSession 控制媒体

二:API的使用

详细api流程

93196C79-9C93-452A-BF23-92149E3DBEF4.jpg

MediaBrowser

媒体浏览器,用来连接MediaBrowserService和订阅数据。

MediaBrowserService

浏览器服务,提供onGetRoot(客户端的连接请求)和onLoadChildren(媒体浏览器向Service发送数据订阅时调用),

同时MediaBrowserService还作为承载媒体播放器(如MediaPlayer、ExoPlayer等)和MediaSession的容器

PlaybackStateCompat 用来传递当前播放的状态,包括暂停,播放,播放进度等

MediaMetadataCompat 用来存放音乐各种信息的Item

MediaSeesionCompatMediaControllerCompat 是对MediaSeesion的升级,在media-compat 库中。

MusicDemo地址

使用kotlin,并参考官方和开源库的代码,写了一个音乐播放的demo,如下:github.com/TJYOYO/Medi…

视频app中MediaSession的不同

由于视频中不需要MediaBrowserService的后台服务,所以视频app中MediaSession和MediaController连接,看下图就明白了,MediaController提供了两个连接MediaSession的方式。

EE5F9C66-4734-4EEA-AC1E-BFDA7DCB5AA4.png

三:更多设备控制

B9D38673-A868-474B-9661-C20453AA0096.png

测试:

1:其他媒体APP

通过MediaBrowser和MediaControl连接MusicDemo的Service,就可以远程控制MusicDemo中的音乐播放。 比如:可以只实现UI上的MediaBrowser和MediaControl连接到官方的UAMP上可以支持操作。

2:  adb shell 提供的media控制

  • adb shell media dispatch pause

  • adb shell media dispatch play

  • adb shell media dispatch play-pause

  • adb shell media dispatch fast-forward

  • adb shell media dispatch rewind

3:支持物理按键的控制-MediaSession的回调方法onMediaButtonEvent中

  • adb shell input keyevent 87 // next

  • adb shell input keyevent 88 // previous

  • adb shell input keyevent 126 // play

  • adb shell input keyevent 127 // pause

4:谷歌语音助手

指令“暂停”,“继续”,“下一个” ,这样语音的功能就不需要每个音频屏都去实现了。


作者:大力水手666
链接:https://juejin.cn/post/7018842679597334565


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐