细数Android5.0到Android7.X 多媒体技术新特性

Android 5.0 行为变更

媒体播放

如果您要实现显示媒体播放状态或传输控件的通知,请考虑使用新的 Notification.MediaStyle 模板,而不是自定义 RemoteViews.RemoteView 对象。无论您选择使用哪个方法,请务必将通知的可见性设为 VISIBILITY_PUBLIC,以便可通过锁定屏幕访问您的控件。请注意,从 Android 5.0 开始,系统不再将 RemoteControlClient 对象显示在锁定屏幕上。

媒体控件和 RemoteControlClient

RemoteControlClient 类现已弃用。请尽快切换到新的 MediaSession API。

Android 5.0 中的锁定屏幕不会为 MediaSession 或 RemoteControlClient 显示传输控件。不过,您的应用可以通过一个通知从锁定屏幕提供媒体播放控件。这让您的应用可以对媒体按钮的显示进行更多控制,同时为使用锁定设备和未锁定设备的用户提供一致的体验。

为实现此目的,Android 5.0 引入了一个新的 Notification.MediaStyle 模板。Notification.MediaStyle 将您使用 Notification.Builder.addAction() 添加的通知操作转换为精简按钮,嵌入到应用的媒体播放通知中。将您的会话令牌传递到 setSession() 方法以告知系统该通知控制进行中的媒体会话。

请务必将通知的可见性设为 VISIBILITY_PUBLIC,以将通知标记为安全,从而显示在任何锁定屏幕上(以安全方式或其他方式)。

要让应用在 Android TV 或 Wear 平台上运行时显示媒体播放控件,则实现 MediaSession 类。如果您的应用需要在 Android 设备上接收媒体按钮事件,您还应实现 MediaSession

屏幕采集和共享

Android 5.0 引入了新的 android.media.projection API,让您可以为应用添加屏幕采集和屏幕共享功能。例如,如果您想在视频会议应用中启用屏幕共享,便可使用此功能。

新增的 createVirtualDisplay() 方法允许您的应用将主屏幕(默认显示)的内容采集到一个 Surface 对象中,然后您的应用便可将其发送至整个网络。该 API 只允许采集非安全屏幕内容,不允许采集系统音频。要开始采集屏幕,您的应用必须先使用通过 createScreenCaptureIntent() 方法获得的 Intent 启动屏幕采集对话框,请求用户授予权限。

图形
对 OpenGL ES 3.1 的支持

Android 5.0 添加了 Java 接口和对 OpenGLES 3.1 的原生支持。OpenGL ES 3.1 中提供的主要新功能包括:

计算着色器
单独的着色器对象
间接绘制命令
多重采样和模具纹理
着色语言改进
高级混合模式和调试专用扩展
向后兼容 OpenGL ES 2.0 和 3.0 

Android 上 OpenGL ES 3.1 的 Java 接口随 GLES31 提供。使用 OpenGL ES 3.1 时,请务必在清单文件中使用 标记和 android:glEsVersion 属性对其进行声明。例如:


    "0x00030001" />
    ...

媒体

用于高级相机功能的 Camera API

Android 5.0 引入了新的 android.hardware.camera2 API 来简化精细照片采集和图像处理。您现在可以使用 getCameraIdList() 通过编程方式访问可供系统使用的相机设备,以及使用 openCamera() 通过编程方式连接特定设备。要开始采集图像,请创建一个 CameraCaptureSession 并指定用于发送已采集图像的 Surface 对象。可将 CameraCaptureSession 配置为进行单张拍摄或多张连拍。

要在采集新图像时得到通知,请实现 CameraCaptureSession.CaptureCallback 侦听器,并在您的采集请求中进行设置。现在,当系统完成图像采集请求时,您的 CameraCaptureSession.CaptureCallback 侦听器会收到对 onCaptureCompleted() 的调用,并在 CaptureResult 中为您提供图像采集元数据。

CameraCharacteristics 类可让您的应用检测到设备上可用的相机功能。该对象的 INFO_SUPPORTED_HARDWARE_LEVEL 属性代表相机的功能级别。

所有设备都至少支持 INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY 硬件级别,该级别具有的能力大致与弃用的 Camera API 相当。
支持 INFO_SUPPORTED_HARDWARE_LEVEL_FULL 硬件级别的设备可手动控制采集和后期处理,以及以高帧速率采集高分辨率图像。

音频回放

此版本加入了对 AudioTrack 的下列更改:

您的应用现在可以提供浮点格式 (ENCODING_PCM_FLOAT) 的音频数据。这可以实现更大的动态范围、更一致的精度和更多的动态余量。浮点算法在进行中间计算时特别有用。回放端点为音频数据使用位深度更低的整型格式。(在Android 5.0中,部分内部管道尚未采用浮点格式。)
您的应用现在可以提供音频数据作为 ByteBuffer,数据使用的格式与 MediaCodec 提供的格式相同。
WRITE_NON_BLOCKING 选项可简化某些应用的缓冲和多线程处理。 

媒体回放控制

使用新增的通知和媒体 API 可确保系统 UI 了解您的媒体回放情况,并可提取和显示专辑封面。现在,可以利用新增的 MediaSession 类和 MediaController 类更轻松地在整个 UI 和服务范围内控制媒体回放。

新增的 MediaSession 类替代了弃用的 RemoteControlClient 类,仅提供一套回调方法来处理传输控制和媒体按钮。如果您的应用提供媒体回放,并运行在 Android TV 或 Wear 平台上,请使用 MediaSession 类,通过同样的回调方法来处理您的传输控制。

现在,您可以使用新增的 MediaController 类开发自己的媒体控制器应用。该类可通过您的应用的 UI 进程,以线程安全方式监控和控制媒体回放。请在创建控制器时指定一个 MediaSession.Token 对象,以便您的应用可与给定 MediaSession 交互。您可以利用 MediaController.TransportControls 方法,通过发送 play()、stop()、skipToNext() 和 setRating() 等命令来控制该会话上的媒体回放。对于控制器,您还可以注册一个 MediaController.Callback 对象来侦听该会话上的元数据和状态变化。

此外,您还可以利用新增的 Notification.MediaStyle 类创建允许将回放控制与媒体会话绑定的丰富通知。
媒体浏览

Android 5.0 引入了通过新增的 android.media.browse API 让应用能够浏览其他应用媒体内容库的功能。要公开您应用内的媒体内容,请扩展 MediaBrowserService 类。您实现的 MediaBrowserService 应提供对 MediaSession.Token 的访问权限,以便应用能播放通过您的服务提供的媒体内容。

要与媒体浏览器服务交互,请使用 MediaBrowser 类。在您创建 MediaBrowser 实例时为 MediaSession 指定组件名称。然后,您的应用便可利用该浏览器实例连接到关联的服务并获得 MediaSession.Token 对象,以播放通过该服务公开的内容。

Android 6.0 变更

音频管理器变更

不再支持通过 AudioManager 类直接设置音量或将特定音频流静音。setStreamSolo() 方法已弃用,您应该改为调用 requestAudioFocus() 方法。类似地,setStreamMute() 方法也已弃用,请改为调用 adjustStreamVolume() 方法并传入方向值 ADJUST_MUTE 或 ADJUST_UNMUTE。

音频功能

此版本增强了 Android 上的音频处理功能,包括:

通过新增的 android.media.midi API 提供了对 MIDI 协议的支持。使用这些 API 可发送和接收 MIDI 事件。
新增了 AudioRecord.Builder 类和 AudioTrack.Builder 类,分别用于创建数字音频采集和回放对象,还可用于配置音频源和接收器属性来替换系统默认值。
用于关联音频和输入设备的 API 钩子。如果您的应用允许用户通过与 Android TV 相连的游戏控制器或遥控器启动语音搜索,此功能尤为有用。系统会在用户启动搜索时调用新增的 onSearchRequested() 回调。要确定用户的输入设备是否内置麦克风,请从该回调检索 InputDevice 对象,然后调用新的 hasMicrophone() 方法。
新增了 getDevices() 方法,让您可以检索系统当前连接的所有音频设备的列表。如果您想让系统在音频设备连接或断开时通知应用,还可以注册一个 AudioDeviceCallback 对象。

视频功能

此版本为视频处理 API 添加了新功能,包括:

新增了 MediaSync 类,可帮助应用同步渲染音频流和视频流。音频缓冲区以非锁定方式提交,并通过回调返回。此外,它还支持动态回放速率。
新增了 EVENT_SESSION_RECLAIMED 事件,它表示应用打开的会话已被资源管理器收回。如果您的应用使用 DRM 会话,则应处理此事件,并确保不使用收回的会话。
新增了 ERROR_RECLAIMED 错误代码,它表示资源管理器收回了编解码器使用的媒体资源。出现此异常时,必须释放编解码器,因为它已转入终止状态。
新增了 getMaxSupportedInstances() 接口,用于获取有关支持的编解码器实例最大并发数量的提示。
新增了 setPlaybackParams() 方法,用于设置快动作回放或慢动作回放的媒体回放速率。此外,它还会随视频一起自动拉长或加速音频回放。

相机功能

此版本提供了下列用于访问相机闪光灯和相机图像再处理的新 API:
Flashlight API

如果相机设备带有闪光灯,您可以通过调用 setTorchMode() 方法,在不打开相机设备的情况下打开或关闭闪光灯的火炬模式。应用对闪光灯或相机设备不享有独占所有权。每当相机设备不可用,或者开启火炬的其他相机资源不可用时,火炬模式即会被关闭并变为不可用状态。其他应用也可调用 setTorchMode() 来关闭火炬模式。当最后一个开启火炬模式的应用关闭时,火炬模式就会被关闭。

您可以注册一个回调,通过调用 registerTorchCallback() 方法接收有关火炬模式状态的通知。第一次注册回调时,系统会立即调用它,并返回所有当前已知配备闪光灯的相机设备的火炬模式状态。如果成功开启或关闭火炬模式,系统会调用 onTorchModeChanged() 方法。
Reprocessing API

Android 7.0 行为变更

OpenGL™ ES 3.2 API

Android 7.0 添加了框架接口和对 OpenGL ES 3.2 的平台支持,包括:

来自 Android 扩展包 (AEP) 的所有扩展(EXT_texture_sRGB_decode 除外)。
针对 HDR 的浮点帧缓冲和延迟着色。
BaseVertex 绘图调用可实现更好的批处理和流媒体服务。
强大的缓冲区访问控制可减少 WebGL 开销。 

Android 7.0 上适用于 OpenGL ES 3.2 的框架 API 与 GLES32 类一起提供。使用 OpenGL ES 3.2 时,请务必通过 标记和 android:glEsVersion 属性在您的清单文件中声明要求。

Android 7.0 通过新的录制 API 添加了从 Android TV 输入服务录制和播放内容的功能。构建在现有时移 API 之上,TV 输入服务可以控制能够录制的渠道数据、保存录制的会话的方式,同时可通过录制的内容管理用户交互。

VR 支持

Android 7.0 添加了新的 VR 模式的平台支持和优化,以使开发者能为用户打造高质量移动 VR 体验。增加了一些性能增强特性,包括允许 VR 应用访问某个专属的 CPU 核心。在您的应用中,您可以充分利用到专为 VR 设计的智能头部跟踪和立体声通知功能。最重要的是,Android 7.0 的图形延时非常低

你可能感兴趣的:(Android进阶之路,音视频,流媒体-直播-编解码,Android,Multimedia实战)