对于音频类应用,我们一般采用客户端/服务端(C/S)设计,对于视频类应用,我们一般采用单activity设计。
播放多媒体的应用一般分为两部分:播放器和界面
Android中常用的播放器有MediaPlayer,ExoPlayer,IjkPlayer。
Android框架定义了媒体会话和媒体控制器两个类,为构建媒体播放器应用提供了一个完善的结构。
媒体会话和媒体控制器
媒体会话负责与播放器的所有通信,它会对应用的其他部分隐藏播放器的API,系统只能从控制播放器的媒体会话中调用播放器。会话会维护播放器状态的表示形式已经播放内容的相关信息。会话可以接受来自一个或多个媒体控制器的回调。响应回调的逻辑必须保持一致。
媒体控制器会隔离您的界面,您的界面代码只与媒体控制器通信。媒体控制器会将传输控制操作转换为对媒体会话的回调。每当会话状态发生变化时,它也会接受来自媒体会话的回调。
视频应用和音频应用有所不同,播放音频时我们可以同时和其他应用交互,播放视频时通常需要一个窗口,所以视频应用一般作为单个activity实现。
视频activity
音频播放器一般放在Service中实现
音频架构
为了实现C/S结构,支持库提供了两个类:MediaBrowserService和MediaBrowser,服务组件作为包含媒体会话及其播放器的MediaBrowserService子类实现,UI部分应该包含MediaBrowser与MediaBrowserService进行通信。
媒体会话和媒体控制器建议使用media-compat 库中的MediaSessionCompat和MediaControllerCompat
媒体会话新创建时必须通过以下步骤来初始化会话:
- 设置标记,以便媒体会话可以接受来自媒体控制器和媒体按钮的回调;
- 创建并初始化 PlaybackStateCompat的实例,并将其分配给会话;
- 创建 MediaSessionCompat.Callback的实例,并将其分配给会话;
媒体会话应该在Activity或Service的onCreate中创建并初始化。
播放状态和元数据表示媒体会话的状态。
PlaybackStateCompat类用于描述播放器当前的运行状态,它包括:传输状态,错误代码和可选的错误信息,播放器位置,可在当前状态下处理的有效播放器操作。
MediaMetadataCompat类说明正在播放的元数据,它包括:音乐人,专辑和曲目的名称,曲目时长,专辑封面等。
播放状态和元数据在媒体会话整个生命周期会发生变化。通过调用setPlaybackState或setMetaData将新实例传递给媒体会话。要减少频繁操作带来的内存消耗,最好一次性创建构造器,并在整个会话生命周期内重复使用它们。
参考:
1.媒体应用架构概览
网友评论