多媒体隧道
多媒体隧道使压缩的视频数据能够通过硬件视频解码器直接传送到显示器,而无需通过应用程序代码或 Android 框架代码进行处理。 Android 堆栈下方的设备特定代码通过将视频帧呈现时间戳与以下类型的内部时钟之一进行比较来确定将哪些视频帧发送到显示器以及何时发送它们:
-
对于 Android 5 或更高版本中的点播视频播放, AudioTrack时钟与应用传入的音频演示时间戳同步
-
对于 Android 11 或更高版本的直播播放,由Tunner驱动的节目参考时钟 (PCR) 或系统时钟 (STC)
Android 上的传统视频播放会在压缩视频帧被解码时通知应用程序。然后,应用程序将解码的视频帧发布到显示器,以与相应的音频帧在相同的系统时钟时间进行渲染,检测AudioTimestamps实例以计算正确的时间。
由于隧道式视频播放绕过了应用程序代码并减少了作用于视频的进程数量,因此它可以根据 OEM 实现提供更高效的视频渲染。它还可以通过避免由 Android 请求渲染视频的时间和真正的硬件 vsync 的时间之间的潜在偏差引入的时间问题,为所选时钟(PRC、STC 或音频)提供更准确的视频节奏和同步。但是,隧道也可以减少对 GPU 效果的支持,例如画中画 (PiP) 窗口中的模糊或圆角,因为缓冲区绕过 Android 图形堆栈。
下图显示了多媒体隧道如何简化视频播放过程。
对于应用程序开发人员<button class="devsite-heading-link button-flat material-icons" type="button" aria-label="Copy link to this section: 对于应用程序开发人员" data-title="Copy link to this section: 对于应用程序开发人员" data-id="app-developers"></button>
由于大多数应用程序开发人员都集成了用于播放实现的库,因此在大多数情况下,实施只需要重新配置该库以进行隧道播放。对于隧道视频播放器的低级实现,请使用以下说明。
对于 Android 5 或更高版本中的点播视频播放:
-
创建一个
SurfaceView
实例。 -
创建一个
audioSessionId
实例。 -
使用步骤 2 中创建的
audioSessionId
实例创建AudioTrack
和MediaCodec
实例。 -
使用音频数据中第一个音频帧的呈现时间戳将音频数据排队到
AudioTrack
。
对于 Android 11 或更高版本的直播播放:
-
创建一个
SurfaceView
实例。 -
从
Tuner
获取一个avSyncHwId
实例。 -
使用在步骤 2 中创建的
avSyncHwId
实例创建AudioTrack
和MediaCodec
实例。