五、音频、视频和相机功能

安卓棉花糖给了我们很好的音频、视频和相机功能,你可以看到已经进行了改进,以启用和更好地支持新的或薄荷条件协议,甚至改变一些 API 的行为,例如相机服务。

在本章中,我们将尝试解释这些变化,并适当讨论它们的用法和好处。我们接下来的旅程将涵盖以下主题:

  • 音频功能
  • 视频功能
  • 相机功能

音频特征

安卓棉花糖 6.0 为我们将在接下来的章节中介绍的音频功能增加了一些丰富内容。

支持 MIDI 协议

安卓 6.0 (API 23)增加了android.media.midi包。

有了新的 midi APIs,你现在可以用比以前简单得多的方式发送和接收 MIDI (简称乐器数字接口)事件。

该软件包旨在为我们提供以下功能:

  • 连接并使用 MIDI 键盘
  • 连接到其他 MIDI 控制器
  • 使用外部 MIDI 合成器、外部外设、灯光、显示控制等
  • 允许从游戏或音乐创作应用生成动态音乐
  • 允许在应用之间创建和传递 MIDI 消息
  • 当连接到笔记本电脑时,允许安卓设备充当多点触控控制器

处理 MIDI 时,必须在清单中声明,如下:

<uses-feature android:name="android.software.midi" android:required="true"/>

注意required部分;以类似于其他功能的方式,将其设置为true将使您的应用在播放商店中可见,前提是设备支持 MIDI API。

您也可以在运行时检查 MIDI 支持,然后将所需部分更改为false:

PackageManager pkgMgr = context.getPackageManager();
if (pkgMgr.hasSystemFeature(PackageManager.FEATURE_MIDI)) {
  //we can use MIDI API here as we know the device supports the MIDI API.
}

米甸经理

正确使用 MIDI API 的一种方法是通过MidiManager类;通过context获取,需要时使用:

MidiManager midiMgr = (MidiManager)context.getSystemService(Context.MIDI_SERVICE);

有关更多信息,您可以参考:

https://developer . Android . com/reference/Android/media/midi/package-summary . html

数字音频捕捉和回放

为数字音频采集和回放增加了两个新类别:

  • android.media.AudioRecord.Builder -数字音频捕捉
  • android.media.AudioTrack.Builder -数字音频播放

这些将有助于配置音频源和接收器属性。

音频和输入设备

新的hasMicrophone()方法已经添加到InputDevice类中。这将报告设备是否有开发人员可以使用的内置麦克风。假设您想从连接到安卓电视的控制器上启用语音搜索,您会收到用户搜索的onSearchRequested()回拨。然后,您可以验证回拨中是否有带有inputDevice对象的麦克风。

音频设备信息

新的AudioManager.getDevices(int flags)方法允许轻松检索当前连接到系统的所有音频设备。如果您希望在音频设备连接/断开时得到通知,您可以通过AudioManager.registerAudioDeviceCallback(AudioDeviceCallback callback, Handler handler)方法将您的应用注册到AudioDeviceCallback回拨。

音频管理器的变化

AudioManager类中引入了一些变化,具体如下:

  • 不支持使用AudioManager直接设置音量。
  • 不支持使用AudioManager来静音特定的流。
  • AudioManager.setStreamSolo(int streamType, boolean state)方法不推荐使用。如果需要独家音频播放,请使用AudioManager.requestAudioFocus(AudioManager.OnAudioFocusChangeListener l, int streamType, int durationHint)
  • AudioManager.setStreamMute(int streamType, boolean state)方法不推荐使用。如果需要使用AudioManager.adjustStreamVolume(int streamType, int direction, int flags)进行方向,可以使用新增加的常量之一。
  • ADJUST_MUTE将音量静音。请注意,如果流已经静音,则没有效果。
  • ADJUST_UNMUTE将取消音量静音。请注意,如果流没有静音,则没有效果。

视频特征

在安卓棉花糖中,视频处理 API 升级了新功能。一些新的方法,甚至一个新的类已经被添加,只为开发人员。

android.media.MediaSync

全新的MediaSync类旨在帮助我们实现同步音频和视频流的渲染。您也可以使用它来播放音频或视频流。您可以使用动态播放速率,并在带有回调返回的非阻塞操作中馈送缓冲区。有关正确用法的更多信息,请阅读:

https://developer . Android . com/reference/Android/media/mediasync . html

中码学。codeccaabilities . getMaxSupportedInstances-程式码可维护性. getmaxsupported instances

现在,我们有一个MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances助手方法来获得支持的最大并发编解码器实例数。然而,我们必须认为这只是一个上限。根据设备和使用时可用资源的数量,并发实例的实际数量可能会更少。

为什么我们需要知道这些?

让我们考虑一个案例,我们有一个媒体播放应用,我们想在播放的电影之间添加效果。我们将需要使用多个视频编解码器,解码两个视频,并将一个视频流编码回屏幕上显示。检查此应用编程接口将允许您添加更多依赖于多个编解码器实例的功能。

媒体播放器. setplaybackparams

我们现在可以设置快速或慢速运动播放的媒体播放速率。这将使我们有机会创建一个有趣的视频应用,我们可以在其中放慢部分速度或快速播放,在播放时创建一个新的视频。音频播放会相应地同步,因此你可能会听到一个人说得很慢,甚至很快。

摄像头特征

在安卓棒棒糖中,有新的Camera2应用编程接口,现在,在安卓棉花糖中,有更多的相机、手电筒和图像再处理功能的更新。

手电筒 API

几乎如今的每台设备都有摄像头,几乎每台摄像设备都有闪光灯。增加了setTorchMode()方法来控制闪光灯模式。

setTorchMode()方法的使用方式如下:

CameraManager.setTorchMode (String cameraId, boolean enabled)

cameraId元素是您想要用来更改手电筒模式的闪光单元相机的唯一标识。您可以使用getCameraIdList()获取相机列表,然后使用getCameraCharacteristics(String cameraId)检查该相机是否支持闪光灯。setTorchMode()方法允许您打开或关闭它,而无需打开相机设备,也无需请求相机的许可。一旦相机设备变得不可用,或者当具有手电筒的其他相机资源变得不可用时,手电筒模式将被关闭。其他应用也可以使用闪存单元,因此您需要在需要时检查模式或通过registerTorchCallback()方法注册回拨。

请参考示例 app、 Torchi ,查看完整代码:

https://github . com/matrix y/torchi

如果相机或其他相机资源正在使用,打开手电筒模式可能会失败。

后处理原料药

正如前面提到的,Camera2应用编程接口得到了一些提升,以允许增加对【YUV】和私有不透明格式图像再处理的支持。在使用这个 API 之前,我们需要检查这些功能是否可用。这就是为什么我们使用getCameraCharacteristics(String cameraId)方法并检查REPROCESS_MAX_CAPTURE_STALL键。

android.media.ImageWriter

这是安卓 6.0 新增的一个类。

它允许我们创建一个图像,并将其输入一个表面,然后返回CameraDevice。通常,ImageWriterImageReader连用。

android.media.ImageReader

这是安卓 6.0 新增的一个类。

它允许我们直接访问渲染在表面上的图像数据。ImageReaderImageWriter一起,允许我们的应用创建一个从相机到表面再回到相机进行再处理的图像馈送。

相机服务的变化

安卓棉花糖对先来T3、【先发球】T4 接入模式做了改动;现在,服务访问模型有了收藏夹进程——标记为高优先级的进程。这一变化为我们开发人员带来了更多与逻辑相关的工作。我们需要确保我们考虑到我们被提升(更高的优先级)或被拆封(由于我们的应用的改变而降低优先级)的情况。

让我们试着用几个简单的项目符号来解释这一点:

  • 当您想要访问相机资源或打开和配置相机设备时,您的访问权限将根据您的申请流程的优先级进行验证。具有前台活动(可见用户)的应用进程通常被赋予更高的优先级,这反过来允许在需要时更好地获得期望的访问。
  • 优先级的另一边,你可以找到低优先级的应用,当高优先级的应用试图使用摄像头时,这些应用可能会被丢弃(被取消访问权限)。比如使用Camera API 时,被驱逐时会得到onError()调用,使用Camera2 API 时,被驱逐时会得到onDisconnected()调用。
  • 一些野外设备可以允许单独的应用同时打开和使用单独的相机设备。相机服务现在可以检测和禁止由多进程使用引起的性能问题。当该服务检测到这样的问题时,它将驱逐低优先级的应用,即使只有一个应用正在使用该相机设备。
  • 在多用户环境中,当切换用户时,所有使用先前用户配置文件中相机的活动应用都将被驱逐,以便当前用户能够正确使用和访问应用。这意味着切换用户肯定会停止使用相机的应用使用相机。

总结

在本章中,我们介绍了安卓应用编程接口的一些变化和补充。安卓棉花糖更多的是帮助我们开发人员在使用音频、视频或相机 API 时获得更好的媒体支持并展示我们的想法。

在下一章中,我们将回顾一下安卓的一些特性,以了解这些特性、添加和更改。