1.支持的媒体格式
将会描述Android平台支持的媒体编解码
, 视频容器
和网络协议
。
1.1视频解码推荐
设备的实现必须支持动态的视频分辨率和帧率切换,在同一流中通过标准的APIsVP8,VP9,H.264,H.265实时解码达到解码设备最佳分辨率。
对支持Dolby版本的编码实现遵循下面准则:
- 提供Dolby版本能力抓取器
- 在屏幕合适的位置显示Dolby的内容
- 设置向后兼容的基于层音轨索引和组合Dolby版本层音轨相同。
1.2视频流需求
通过HTTP或者RTSP的视频流,额外要求:
- 对3GPP和MPEG-4容器,·moov·原子必须在任何
mdat
之前,但是ftyp
原子必需成功。 - 对
3GPP
,MPEG-4
,WebM
格式,视频和音频采样实时的偏移不能大于500KB。为了最小的audio/video偏移,考虑以较小块大小交错的音频和视频。
1.3网络协议
下面是音频和视频支持的网络协议:
- RTSP(RTP,SDP)
- HTTP/HTTPS渐进式流
- HTTP/HTTP直播流
- MPEG-2 只对TS媒体文件。
- 协议版本3(Android 4.0及以上)
- 协议版本2(Android 3.x)
- 3.0之前不支持。
2.媒体应用的架构
这部分讲解如何将媒体播放器分开成一个media control
(UI)和一个media session
(正真播放器)。将会描述两个媒体应用架构:C/S设计,对大多数音乐播放器和只有一个单独Activity的视频播放器。
还展现如何对硬件控制的响应和其他使用输出流的播放器之间的协作。
2.1 Player 和 UI
一个多媒体应用播放音频或视频通常有两部分:
- 一个播放器获取数字媒体并且将它渲染成音频或视频
- 一个带有转换的UI去控制运行播放器并且选择的显示播放器的状态
在Android中你能够从头开始建立自己播放器。下面选择:
- MediaPlayer提供基础功能对一个露骨的播放器支持大部分的audio/video格式和数据源。
- ExoPlayer是一个开源库Android音频提供低级接口。ExoPlayer支持高性能特征如DASH和HLS流,这是MediaPlayer不支持的。可以定制ExoPlayer代码,让加组件变得简单。4.1版本及以上支持。
2.2Media session和 media controller
虽然UI和Player的接口可以很多,但是两个之间联系对所有播放应用通常是一样的。Android定义两个类meida session
和media controller
,为定义播放器提供一个很好的架构。
media session
和media controller
通过预定义好的回调来通讯,这回调和标准播放器的动作(播放,暂停,停止等)相对应。当然可以定制你自己独一无二的动作。
2.2.1 Media session
media session
负责和播放器所有的交互。这样隐藏播放器的APIs。播放器只被控制它的media session
调用.
session位置播放器呈现的状态(playing/paused)并且播放的信息。一个session可以接受一个或多个media controllers
回调。这使你的播放器能够被你的appUI或者穿戴或驾车的伴随设备控制成为可能。(可多可关联设备控制一个UI)。
2.2.2 Media controller
Meida controller独立于UI。UI代码只是和media controller通讯,并不是播放器本身。media controller将控制动作回调給media session.当然也会收到media session的状态(播放器状态改变时)。meida controller只能同时和一个media session 通讯
3.video应用和audio应用
不同的设计方式。
3.1 视频应用
一个视频应用需要窗口来显示内容。这个原因,一个视频播放器通常被用作一个单独的Activity。
3.2音频应用
音频应用播放不是一直需要UI可见,可以作为一个后台任务来运行。
support库提供两个类来实现c/s:MeidaBrowserService
和MediaBrowser
。
MediaBrowser
作MediaBrowserService
一个子类,包含media session和播放器。MeidaBrowserService
来简化完成。
4.媒体播放器和audio基础结构
一个很好的媒体播放器应该和其他也播放音频的应用一起工作。应该大家来共享手机,和手机中其他app共同合作。同样应该会硬件控制做回应。
5.媒体兼容库
推荐使用兼容库是MediaSeesionCompat
和MediaControllerCompat
在meida-compat support libaray
中定义。替换早期的版本MediaSession
和MediaController
被5.0引入的。简化开发,因为只需要一套api。
6.检测性能
8.0以后提供