Fuchsia.media

添加次数:7

协议

ActivityReporter

fuchsia.media/activity_reporter.fidl 中定义

用于监控 AudioRenderer 和 AudioCapturer 使用活动的协议。

WatchCaptureActivity

每当活跃的 AudioCaptureUsages 集发生更改时,通知客户端。 它会在第一次调用时立即返回。

请求

<EMPTY>

响应

名称类型
active_usages vector<AudioCaptureUsage>[4]

WatchRenderActivity

每当活跃的 AudioRenderUsages 集发生更改时,通知客户端。 它会在第一次调用时立即返回。

请求

<EMPTY>

响应

名称类型
active_usages vector<AudioRenderUsage>[5]

音频

fuchsia.media/audio.fidl 中定义

CreateAudioCapturer

创建一个 AudioCapturer,用于从当前默认音频输入设备捕获音频,或者根据为环回标志传递的值从当前默认音频输出设备环回。

请求

名称类型
audio_capturer_request server_end<AudioCapturer>
loopback bool

CreateAudioRenderer

请求

名称类型
audio_renderer_request server_end<AudioRenderer>

AudioCapturer

fuchsia.media/audio_capturer.fidl 中定义

AudioCapturer

AudioCapturer 是从 fuchsia.media.Audio 的 CreateAudioCapturer 方法返回的接口;客户端可以使用它从当前默认音频输入设备或当前的默认音频输出设备捕获音频,具体取决于创建过程中传递的标志。

格式支持

请参阅下面的 (Get|Set)StreamType。默认情况下,捕获的流类型最初将由 AudioCapturer 在创建时绑定到的来源的当前配置流类型决定。用户可以使用 GetStreamType 提取此类型,也可以通过调用 SetStreamType 选择对媒体进行重新采样或转换为他们选择的类型。注意:只能在系统未运行时设置流类型,这意味着没有待处理的捕获区域(使用 CaptureAt 指定),并且系统当前未在“async”捕获模式下运行。

缓冲区和内存管理

在 AddPayloadBuffer 调用期间,将音频数据捕获到用户提供给 AudioCapturer 的共享内存缓冲区 (VMO) 中。请注意以下与载荷缓冲区管理相关的要求。

  • 在开始任何捕获操作之前,必须提供载荷缓冲区。如果在建立载荷缓冲区之前尝试(通过 CaptureAt 或 StartAsyncCapture)开始捕获,操作是错误的。
  • 当有待处理的捕获操作时,不得更改载荷缓冲区。
  • 设置载荷缓冲区后,将无法更改流类型。
  • 载荷缓冲区必须是音频帧大小的整数(以字节为单位)
  • 在“异步”模式下运行时(见下文),载荷缓冲区必须至少是 StartAsyncCapture 期间指定的 frame_per_packet 大小的两倍。
  • 用户提供的有效负载缓冲区的句柄必须是可读、可写、可映射和可传输的。
  • 用户应始终将载荷缓冲区视为只读。

同步与异步拍摄模式

AudioCapturer 接口可以在以下两种互斥模式之一中使用:同步和异步。下面介绍了每种模式及其利弊。

同步模式

默认情况下,AudioCapturer 实例会在“同步”模式下运行。仅当用户提供至少一个要通过 CaptureAt 方法捕获的区域时,它们才会捕获数据。以这种方式提供的区域将按照接收顺序(通过 CaptureAt 方法的返回值作为 StreamPackets 返回给客户端)进行填充。如果 AudioCapturer 实例有要捕获的数据,但没有放置它的位置(因为没有更多的待处理区域需要填充),则生成的下一个载荷将通过在下一个生成的 StreamPacket 上设置 Discontinuity 标记来指示其已经溢出。同步模式不能与异步模式结合使用。当系统仍在等待填充 CaptureAt 提供的区域时,尝试调用 StartAsyncCapture 会引发错误。

如果用户过去已提供了由 AudioCapturer 实例填充的区域,但现在希望收回这些区域,可以使用 UninstallAllPackets 方法来实现。调用 ExcludeAllPackets 方法将导致返回所有待处理的区域,但返回的是 NO_TIMESTAMP 作为其 StreamPacket 的 PTS。有关时间戳和不连续标志的讨论,请参阅下文的“时间和溢出”。在执行 CheckoutAllPackets 操作后,将生成一个 OnEndOfStream 事件。虽然在返回已完成的区域后,AudioCapturer 永远不会覆盖载荷缓冲区的任何区域,但它可能会覆盖由于 参数 Enum 操作而返回的部分填充缓冲区中未填充部分。

异步模式

在“异步”模式下运行时,客户端无需明确提供要由 AudioCapturer 实例填充的共享缓冲区区域。相反,客户端会通过调用 StartAsyncCapture 并提供回调接口以及要针对每个回调捕获的帧数来进入“异步”模式。在异步模式下运行时,AudioCapturer 实例将确定要捕获到的载荷缓冲区区域,捕获指定数量的帧,然后使用 OnPacketCapture FIDL 事件以 StreamPackets 形式传送这些帧。用户可以使用 StopAsyncCapture 方法停止捕获音频,并将 AudioCapturer 实例返回到“同步”模式。

如果尝试执行以下任一操作,都会被视为错误。

  • 在尚未建立载荷缓冲区的情况下尝试进入“异步”捕获模式。
  • 指定要为每个载荷捕获的帧数,该数量不允许已建立的共享载荷缓冲区中同时存在至少两个连续的捕获载荷。
  • 在 AudioCapturer 实例以“async”模式下运行时,使用 CaptureAt 方法发送要捕获的区域。
  • 在 AudioCapturer 实例以“async”模式下运行时尝试调用 UninstallAllPackets。
  • 如需尝试重新启动“异步”模式,请在不先停止的情况下捕获。
  • 在停止过程中尝试执行除 SetGain 之外的任何操作。

使用 StopAsyncCapture 操作进行同步

停止异步拍摄模式并返回到同步拍摄模式需要一些时间。调用 StopAsyncCapture 后(包括再次调用 StopAsyncCapture),直到停止操作完成为止,但 SetGain 除外。因此,让用户能够与停止操作同步非常重要。为此,我们提供了两种机制。

第一种是使用 StopAsyncCapture(而不是 NoReply 变体)。调用用户回调后,用户可以确定停止操作已完成,并且 AudioCapturer 实例已返回到同步操作模式。

确定停止操作是否已完成的第二种方法是,对在调用 StopAsyncCapture 后通过用户提供的 AudioCapturerCallback 接口传送的数据包使用标记。当请求停止时,任何部分填充的数据包都将返回给用户,并且返回的最终数据包将始终设置流结束标志 (kFlagsEos),以表明这是序列中的最后一帧。如果没有部分填充的数据包要返回,AudioCapturer 将合成一个没有时间戳且偏移量/长度设置为零的空数据包,以便传输已设置流结束标志的数据包。一旦用户在调用停止后看到流结束标志,AudioCapturer 就会完成停止操作并返回到同步操作模式。

时间和溢出

AudioCapturer 实例生成的所有媒体数据包都会用音频的捕获时间填充其 PTS 字段,以参考时钟时间轴提供的时间戳表示。注意:此时间戳实际上是捕获时间戳,而不是呈现时间戳(它更像是 CTS,而不是 PTS),旨在表示底层系统对音频第一帧的捕获时间的最佳估算值,包括所有外部和硬件引入的缓冲延迟。因此,AudioCapturer 生成的所有时间戳都应是流的参考时钟时间轴上“现在”的过去时间。

“所有内容都具有显式时间戳”规则的一个例外情况是,在同步模式下操作时舍弃已提交的区域。丢弃的数据包中没有任何数据,但 FIDL 要求执行所有待处理的方法返回值回调。因此,这些区域将被返回给用户,但其时间戳将设置为 NO_TIMESTAMP,而载荷大小将设置为零。任何部分填充的载荷都将具有有效的时间戳,但其大小会小于最初请求的载荷。最终被舍弃的载荷(如果有要舍弃的载荷)将后跟一个 OnEndOfStream 事件。

如果第二个数据包中包含的第一帧音频是在第一个数据包中最后一帧之后的一个标称帧时间,那么 AudioCapturer 实例传送的两个 StreamPacket 就是“连续”的。如果此关系不成立,则第二个 StreamPacket 的 flags 字段中设置 STREAM_PACKET_FLAG_DISCONTINUITY 位。

虽然在生成的每个 StreamPacket 上都提供了明确的时间戳,但我们建议有非常精确的时间要求的用户始终通过计算自上次不连续性以来传送的帧来推断时间,而不是简单地使用原始捕获时间戳。这是因为,根据捕获时间轴参考时钟的单位是否可以被所选音频帧速率整除,在连续数据包上写入的显式时间戳可能存在少量舍入误差。

用户应始终预料到,由 AudioCapturer 生成的第一个 StreamPacket 上会设置不连续的标记(因为没有上一个数据包可以连续)。同样,在 DialogflowAllPackets 或停止/开始循环之后的第一个 StreamPacket 始终是不连续的。此后,StreamPacket 不连续的原因仅有两个:

  1. 用户在同步模式下操作,并且未提供足够快速填充的区域。如果在需要从源缓冲区中清除下一个连续数据帧时尚未捕获到该数据帧,就会发生溢出,AudioCapturer 会将下一个捕获区域标记为不连续。
  2. 用户是在异步模式下操作,并且一些内部错误阻止 AudioCapturer 实例以连续的方式捕获下一帧音频。这可能是高系统负载或硬件错误,但一般情况下,这种情况绝不应发生。但实际上,如果发生这种情况,则下一个生成的数据包将被标记为不连续。

同步与异步权衡

选择在同步模式还是异步模式下运行由用户决定,根据用户的要求,每种选择都有一些优缺点。

同步模式在后台只需要一个 Zircon 通道,因此可以节省一些空间。此外,用户可以完全控制缓冲区管理。用户指定音频的捕获位置和顺序。因此,如果用户不需要一直进行捕获,则稍后可以轻松地停止并重启捕获(只需停止提供数据包,稍后恢复即可)。载荷的大小也不需要相同,客户端可以指定任意粒度的载荷。

在同步模式下运行的主要缺点是,对于要捕获的每个数据包,都需要发送两条消息。一个用于通知 AudioCapturer 要捕获哪个实例,另一个用于通知用户数据包已被捕获。这最终可能会增加开销,并可能使客户端设计变得复杂。

异步模式的优势在于,它只需要 1/2 的消息,但在“异步”模式下运行时,AudioCapturer 实例无法知道用户是否正在处理及时发送的 StreamPacket,也无法自动检测溢出情况。使用“异步”模式的用户应格外小心,使用足够大的缓冲区,以确保在 AudioCapturer 被强制覆盖数据之前他们能够处理自己的数据。

AddPayloadBuffer

向与连接关联的当前缓冲区集添加载荷缓冲区。StreamPacket 结构体会使用 StreamPacket.payload_buffer_id 字段来引用当前按 ID 设置的载荷缓冲区。

调用此方法时,ID 为 id 的缓冲区不得位于当前集中,否则服务将关闭连接。

请求

名称类型
id uint32
payload_buffer handle<vmo>

BindGainControl

绑定到该 AudioCapturer 的增益控件。

请求

名称类型
gain_control_request server_end<fuchsia.media.audio/GainControl>

CaptureAt

明确指定音频输入捕获到的共享载荷缓冲区的一个区域。

请求

名称类型
payload_buffer_id uint32
payload_offset uint32
frames uint32

响应

名称类型
captured_packet StreamPacket

DiscardAllPackets

请求

<EMPTY>

响应

<EMPTY>

DiscardAllPacketsNoReply

请求

<EMPTY>

GetReferenceClock

检索流的参考时钟。返回的句柄具有 READ、DUPLICATE 和 TRANSFER 权限,并且所引用的 zx::clock 分别为“MONOTONIC”和“CONTINUOUS”。

请求

<EMPTY>

响应

名称类型
reference_clock handle<clock>

GetStreamType

获取当前配置的流类型。注意:对于刚刚创建且尚未明确设置音频流类型的 AudioCapturer,这将检索 AudioCapturer 绑定到的来源(输入或环回输出)的流类型(在创建 AudioCapturer 时)。即使这与客户端所需的格式匹配,仍必须调用 SetPcmStreamType

请求

<EMPTY>

响应

名称类型
stream_type StreamType

OnEndOfStream

表示直播已结束。

响应

<EMPTY>

OnPacketProduced

传送服务生成的数据包。当客户端使用完载荷内存后,必须调用 ReleasePacket 以释放载荷内存。

响应

名称类型
packet StreamPacket

ReleasePacket

释放与之前通过 OnPacketProduced 传送的数据包相关联的载荷内存。

请求

名称类型
packet StreamPacket

RemovePayloadBuffer

从与连接关联的当前缓冲区集中移除载荷缓冲区。

调用此方法时,当前集中必须存在 ID 为 id 的缓冲区,否则服务将关闭连接。

请求

名称类型
id uint32

SetPcmStreamType

设置要传送的流的流类型。如果需要,使源素材重新设置格式/重新采样,以生成请求的流类型。必须在建立载荷缓冲区之前调用。

请求

名称类型
stream_type AudioStreamType

SetReferenceClock

设置用于控制此捕获器的播放速率的参考时钟。如果输入参数是有效的 zx::clock,必须具有 READ、DUPLICATE 和 TRANSFER 权限,并引用既是 MONOTONIC,又是 CONTINUOUS 的时钟。如果传入的时钟无效(例如未初始化的 zx::clock()),则表示该流会使用由 AudioCore 生成的“灵活”时钟来跟踪音频设备。

添加捕获器载荷缓冲区后,无法调用 SetReferenceClock。也无法再次调用它(甚至在捕获之前)。如果客户端想要一个初始为 CLOCK_MONOTONIC 的参考时钟,但可能会在稍后的某个时间偏离,他们应该创建一个单调时钟克隆,将此设为流的参考时钟,然后根据需要进行速率调整。

请求

名称类型
reference_clock handle<clock>?

SetUsage

设置捕获流的使用。这可能会实时更改,但传输中的数据包可能会受新用法的影响。默认情况下,创建 Capturer 时使用的是 FOREGROUND 用法。

请求

名称类型
usage AudioCaptureUsage

StartAsyncCapture

将 AudioCapturer 置于“异步”捕获模式,并开始生成每个数据包,每个数据包的帧数正好为“frames_per_packet”。StreamSink 的 OnPacketProduced 事件将用于通知客户端已生成的数据包。

请求

名称类型
frames_per_packet uint32

StopAsyncCapture

停止在“异步”捕获模式下进行捕获,并(可选)在需要显式同步时提供一个可供客户端使用的回调。

请求

<EMPTY>

响应

<EMPTY>

StopAsyncCaptureNoReply

请求

<EMPTY>

AudioConsumer

fuchsia.media/audio_consumer.fidl 中定义

用于播放和控制音频的界面。

BindVolumeControl

绑定到此 AudioConsumer 音量控件,以控制和通知。

请求

名称类型
volume_control_request server_end<fuchsia.media.audio/VolumeControl>

CreateStreamSink

使用指定属性为使用方创建 StreamSink

使用此方法可以获取多个数据流接收器,但这些接收器应按顺序使用,而非并发使用。使用此方法创建的第一个数据流接收器将用作传入逻辑使用方的数据包的唯一来源,直到该数据流接收器关闭或在该接收器上调用 EndOfStream 方法。此时,使用第二个流接收器,依此类推。

如果提供的压缩类型不受支持,stream_sink_request 请求将以 epitaph 值 ZX_ERR_INVALID_ARGS 关闭。

请求

名称类型
buffers vector<vmo>[16]
stream_type AudioStreamType
compression Compression?
stream_sink_request server_end<StreamSink>

OnEndOfStream

表示视频流结束前的最后一个数据包已呈现。

响应

<EMPTY>

SetRate

用于更改渲染程序播放速率的请求。1.0 表示正常播放。不支持负费率。新速率将反映在更新后的状态中。任何新创建的 StreamSink 的默认比率均为 1.0。

请求

名称类型
rate float32

开始

按照 flags 指示开始渲染。

media_time 表示与 reference_time 对应的数据包时间戳。 通常,这是将渲染的第一个数据包的时间戳。如果提供的数据包没有时间戳,则此值应为 NO_TIMESTAMP。传递 media_timeNO_TIMESTAMP 会选择默认媒体时间,具体设置如下: 1. 首次启动时,默认媒体时间是发送到数据流接收器的第一个数据包上的时间戳。2. 停止后恢复时,默认媒体时间是数据流停止的媒体时间。

reference_time 是单调系统时间,也就是应该开始渲染的时间。对于供应驱动型来源,该时间必须是发送(或即将)第一个数据包的时间加上准备时间,该时间必须在 AudioConsumerStatus 指明的范围内。对于需求驱动型来源,客户必须确保在开始时间满足准备时间要求。为 reference_time 传递默认值 0 会使使用方根据数据包可用性、准备时间要求以及是否指定 LOW_LATENCY 选择开始时间。

实际开始时间将反映在更新后的状态中。

请求

名称类型
flags AudioConsumerStartFlags
reference_time zx/Time
media_time int64

停止

调用此方法后,应尽快停止呈现。实际停止时间将反映在更新后的状态中。

请求

<EMPTY>

WatchStatus

使用长 get 模式获取使用方的当前状态。使用方会在状态发生变化时响应此方法 - 最初依据的是初始状态值,之后则是之前报告的状态值。

请求

<EMPTY>

响应

名称类型
status AudioConsumerStatus

AudioCore

fuchsia.media/audio_core.fidl 中定义

BindUsageVolumeControl

针对给定用例,绑定到音量控制协议。

请求

名称类型
usage Usage
volume_control server_end<fuchsia.media.audio/VolumeControl>

CreateAudioCapturer

创建一个 AudioCapturer,用于从当前默认音频输入设备捕获音频,或者根据为环回标志传递的值从当前默认音频输出设备环回。

请求

名称类型
loopback bool
audio_in_request server_end<AudioCapturer>

CreateAudioCapturerWithConfiguration

根据指定要求创建 AudioCapturer。

pcm_stream_type 用于设置要传送的流的流类型。这会导致系统在必要时对源素材进行格式调整/重新采样,以生成所请求的流类型。

Fuchsia 使用 usage 来制定有关用户体验的决策。如需了解详情,请参阅 AudioCaptureUsage

必须将 configuration 初始化为变体,否则无法创建任何 Capturer。

请求

名称类型
stream_type AudioStreamType
configuration AudioCapturerConfiguration
audio_capturer_request server_end<AudioCapturer>

CreateAudioRenderer

创建可将音频输出到默认设备的 AudioRenderer。

请求

名称类型
audio_out_request server_end<AudioRenderer>

EnableDeviceSettings

已弃用

请求

名称类型
enabled bool

GetDbFromVolume

针对特定 usage,查询映射到音量百分比 [0, 1] 的分贝值。 这与 BindUsageVolumeControl 中的 VolumeControl 使用的映射相同。

请求

名称类型
usage Usage
volume float32

响应

名称类型
gain_db float32

GetVolumeFromDb

查询映射到特定 usagegain_db 值的音量百分比 [0, 1]。这与 BindUsageVolumeControl 中的 VolumeControl 使用的映射相同。

请求

名称类型
usage Usage
gain_db float32

响应

名称类型
volume float32

LoadDefaults

重新加载平台政策配置。如果平台未提供配置,则回退到默认配置。

请求

<EMPTY>

ResetInteractions

重新初始化当前用于管理 audio_core 中音频流交互的一组规则。默认设置为“NONE”。

请求

<EMPTY>

SetCaptureUsageGain

设置应用于捕获器的使用增益。默认情况下,所有捕获用途的增益都设置为 Unity (0 db)。

请求

名称类型
usage AudioCaptureUsage
gain_db float32

SetInteraction

设置 audio_core 如何同时处理多个活跃流的交互。如果用法 active 的流正在处理音频,用法 affected 的流也在处理,则指定的行为将应用于用法 affected 的流。

请求

名称类型
active Usage
affected Usage
behavior Behavior

SetRenderUsageGain

设置应用于渲染程序的使用增益。默认情况下,所有渲染用例的增益都设置为 Unity (0 db)。

请求

名称类型
usage AudioRenderUsage
gain_db float32

AudioDeviceEnumerator

fuchsia.media/audio_device_enumerator.fidl 中定义

AddDeviceByChannel

弃用

StreamConfig 不再受支持,请改用音频复合材料。请参阅音频驱动程序架构

已弃用:20

请求

名称类型
device_name string[256]
is_input bool
channel fuchsia.hardware.audio/StreamConfig

GetDeviceGain

增益/静音/AGC 控制

请注意,所有这些操作都需要 device_token 以便定位正确的输入/输出。

Get 命令返回增益正在报告的设备的 device_token;如果请求的 device_token 无效,或者设备在处理 Get 命令之前已从系统中移除,则返回 ZX_KOID_INVALID

被赋予无效设备令牌的 set 命令会被忽略,对系统没有影响。此外,用户无需在每次通话时都控制音频设备的所有增益设置。只有设置了在 set_flags 参数中设置的相应标志的设置会受到影响。例如,传递 SetAudioGainFlag_MuteValid 会使 SetDeviceGain 调用仅关注 gain_info 结构中的静音设置,而传递 (SetAudioGainFlag_GainValid | SetAudioGainFlag_MuteValid) 将导致静音和增益状态同时发生更改。

请求

名称类型
device_token uint64

响应

名称类型
device_token uint64
gain_info AudioGainInfo

GetDevices

获取当前活跃音频设备的列表。

请求

<EMPTY>

响应

名称类型
devices vector<AudioDeviceInfo>

OnDefaultDeviceChanged

已弃用

响应

名称类型
old_default_token uint64
new_default_token uint64

OnDeviceAdded

添加或移除设备,或设备属性发生变化时发送的事件。

响应

名称类型
device AudioDeviceInfo

OnDeviceGainChanged

响应

名称类型
device_token uint64
gain_info AudioGainInfo

OnDeviceRemoved

响应

名称类型
device_token uint64

SetDeviceGain

请求

名称类型
device_token uint64
gain_info AudioGainInfo
valid_flags AudioGainValidFlags

AudioRenderer

fuchsia.media/audio_renderer.fidl 中定义

AudioRenderer 在任何时候都会处于以下两种状态之一:可配置或可操作。只要渲染程序有排队等待渲染的数据包,渲染程序就被视为可运行;否则,渲染程序是可配置的。AudioRenderer 进入操作状态后,不允许调用“配置”方法,并会导致音频服务断开客户端连接。以下配置被视为配置方法:AddPayloadBufferSetPcmStreamTypeSetStreamTypeSetPtsUnitsSetPtsContinuityThreshold

如果必须重新配置 AudioRenderer,则客户端必须确保在调用这些“配置”方法时不再将任何数据包加入队列。因此,在重新配置渲染程序之前,最好先在 AudioRenderer 上调用 DiscardAllPackets(最好在 DiscardAllPackets 之前调用 Stop)。

AddPayloadBuffer

向与连接关联的当前缓冲区集添加载荷缓冲区。StreamPacket 结构体会使用 StreamPacket.payload_buffer_id 字段来引用当前按 ID 设置的载荷缓冲区。

调用此方法时,ID 为 id 的缓冲区不得位于当前集中,否则服务将关闭连接。

请求

名称类型
id uint32
payload_buffer handle<vmo>

BindGainControl

绑定到该 AudioRenderer 的增益控件。

请求

名称类型
gain_control_request server_end<fuchsia.media.audio/GainControl>

DiscardAllPackets

舍弃之前通过 SendPacketSendPacketNoReply 发送但尚未发布的数据包。该响应会在所有数据包都发布后发送。

请求

<EMPTY>

响应

<EMPTY>

DiscardAllPacketsNoReply

舍弃之前通过 SendPacketSendPacketNoReply 发送但尚未发布的数据包。

请求

<EMPTY>

EnableMinLeadTimeEvents

启用或停用关于此 AudioRenderer 最短时钟准备时间(以纳秒为单位)的更改的通知。调用此方法并将“enabled”设为 true 时,会立即触发 OnMinLeadTimeChanged 事件,其中包含 AudioRenderer 的当前最短准备时间。如果值发生更改,会使用新值引发 OnMinLeadTimeChanged 事件。此行为将持续到用户调用 EnableMinLeadTimeEvents(false) 为止。

最短时钟准备时间是指比参考时钟了解“现在”要提前多长时间,数据包需要到达时间(相对于播放时钟转换),混音器才能对数据包进行混音。例如...

  • 将数据包 X 的 PTS 设为 P(X)
  • 将转换 PTS -> RefClock 的函数设为 R(p)(此函数由对 Play(...) 的调用确定)
  • 将最短交货期设为 MLT

如果 R(P(X)) < RefClock.Now() + MLT,那么数据包会延迟,需要跳过数据包的部分或全部载荷,才能在预定时间显示数据包。

min_lead_time_nsec = 0 是一个特殊值,表示 AudioRenderer 尚未路由到输出设备。如果在路由 AudioRenderer 之前调用 Play,则所有播放的数据包都将被丢弃。客户端应等到 min_lead_time_nsec > 0 后再调用 Play

请求

名称类型
enabled bool

EndOfStream

表示直播已结束。此方法的精确语义由继承接口决定。

请求

<EMPTY>

GetMinLeadTime

虽然可以在 SetPcmStreamType 之前调用 GetMinLeadTime,但这样做的理由很少。这是因为准备时间是格式/费率的函数,因此准备时间将在 SetPcmStreamType 之后重新计算。如果在 SetPcmStreamType 之前启用最短准备时间事件(通过 EnableMinLeadTimeEvents(true)),系统将生成事件来响应 SetPcmStreamType

请求

<EMPTY>

响应

名称类型
min_lead_time_nsec int64

GetReferenceClock

检索流的参考时钟。返回的句柄具有 READ、DUPLICATE 和 TRANSFER 权限,并且所引用的 zx::clock 分别为“MONOTONIC”和“CONTINUOUS”。

请求

<EMPTY>

响应

名称类型
reference_clock handle<clock>

OnMinLeadTimeChanged

响应

名称类型
min_lead_time_nsec int64

暂停

立即将 AudioRenderer 置于暂停状态,然后报告已建立的媒体和参考时间轴之间的关系(如果请求的话)。

如果在调用该方法时,AudioRenderer 已处于暂停状态,则返回之前建立的时间轴值(如果请求的话)。

请求

<EMPTY>

响应

名称类型
reference_time int64
media_time int64

PauseNoReply

请求

<EMPTY>

Play

立即让 AudioRenderer 进入播放状态。使用调用方提供的特定值(如果未指定,则使用默认值)启动媒体时间轴的前进。在可选回调中,返回最终使用的时间戳值,这些值会设置媒体时间轴与参考时间轴之间的持续关系(即如何在呈现时间戳的网域与本地系统时间领域之间转换)。

当地系统时间以纳秒为单位指定;media_time 以用户在 SetPtsUnits 函数中定义的单位指定;如果未调用 SetPtsUnits,则以纳秒为单位指定。

将 AudioRenderer 置于播放状态这一行为会在 1) 此特定 AudioRenderer 的用户定义媒体(或呈现)时间轴与 2) 实际系统参考时间轴之间建立关系。为了传达如何在时间轴之间转换,Play() 回调会在每个时域中提供一个等效的时间戳。第一个值(“reference_time”)由该渲染程序的参考时钟指定;第二个值(“media_time”)是媒体即时与相应当地时间完全匹配的那个时间。重申一下,根据参考时钟,音频流中“media_time”处的帧应显示在“reference_time”时。

注意:调用此 API 时,media_time 会立即开始提前。调用方有可能(如果不常见)指定过去或很久内的未来系统时间。此媒体时间与指定的媒体时间一起仅用于确定媒体时间与“现在”对应的时间,然后将该媒体时间与已提交数据包的呈现时间戳相交,以确定接下来应呈现哪些媒体帧。

借助相应的 reference_time 和 media_time 值,用户可以将任意时间值从一个时间轴转换为另一个时间轴。调用 SetPtsUnits(pts_per_sec_numerator, pts_per_sec_denominator) 并指定 Play 中的“ref_start”和“media_start”值后,对于任何“ref_time”:

media_time = ( (ref_time - ref_start) / 1e9 * (pts_per_sec_numerator / pts_per_sec_denominator) ) + media_start

相反,对于任何呈现时间戳“media_time”:

ref_time = ( (media_time - media_start) * (pts_per_sec_denominator / pts_per_sec_numerator) * 1e9 ) + ref_start

用户可根据其使用情形,选择不指定这两个时间戳中的一个或全部。通过提供特殊值“NO_TIMESTAMP”,可以省略时间戳。AudioRenderer 使用以下规则自动推导任何省略的时间戳值:

参考时间 如果省略“reference_time”,AudioRenderer 将根据当前绑定到此 AudioRenderer 的输出设备的最短准备时间选择“安全”参考时间开始呈现。例如,如果 AudioRenderer 绑定到准备时间至少为 3 毫秒的内部音频输出,而 HDMI 输出需要至少 75 毫秒的准备时间,则 AudioRenderer 可能会(如果省略“reference_time”)选择从现在起 80 毫秒后的参考时间。

媒体时间 如果省略 media_time,AudioRenderer 将从两个值中选择一个值。

  • 如果 AudioRenderer 从暂停状态恢复,并且自暂停后数据包没有被舍弃,则 AudioRenderer 将使用与演示暂停的时刻对应的 media_time。
  • 如果在启动或执行“舍弃数据包”操作后,AudioRenderer 首次进入播放状态,则初始 media_time 将设置为待处理数据包队列中第一个载荷的 PTS。如果待处理队列为空,初始 media_time 将设置为零。

返回值 在收到请求时,AudioRenderer 将在 play 调用的返回值中返回选择和使用(无论是否明确指定)的“reference_time”和“media_time”。

示例

  1. 用户使用 SendPacket 将一些音频加入队列,只是希望他们尽快开始播放。用户可以在不提供明确的时间戳(即 Play(NO_TIMESTAMP, NO_TIMESTAMP))的情况下调用 Play。

  2. 用户已使用 SendPacket 将一些音频加入队列,并希望在指定的“reference_time”处开始播放,并与一些其他媒体流同步(无论是在初始播放还是舍弃数据包之后)。用户将调用 Play(reference_time, NO_TIMESTAMP)

  3. 用户使用 SendPacket 将一些音频加入队列。第一个数据包的 PTS 为零,用户希望尽快开始播放,但希望跳过 PTS 0 和 PTS“media_time”之间的所有音频内容。用户将调用 Play(NO_TIMESTAMP, media_time)

  4. 用户使用 SendPacket 将一些音频加入队列,并希望将此媒体与其他设备中的另一个播放器同步呈现。分布式播放器组的协调者向每个播放器发送一条显式消息,告知他们在 PTS“media_time”的“reference_time”时间(基于该组的共享参考时钟)开始呈现音频。在此示例中,用户将调用 Play(reference_time, media_time)

请求

名称类型
reference_time int64
media_time int64

响应

名称类型
reference_time int64
media_time int64

PlayNoReply

请求

名称类型
reference_time int64
media_time int64

RemovePayloadBuffer

从与连接关联的当前缓冲区集中移除载荷缓冲区。

调用此方法时,当前集中必须存在 ID 为 id 的缓冲区,否则服务将关闭连接。

请求

名称类型
id uint32

SendPacket

将数据包发送到服务。使用关联的载荷内存完成服务后,系统会发送此响应。

packet 必须对当前缓冲区集有效,否则服务将关闭连接。

请求

名称类型
packet StreamPacket

响应

<EMPTY>

SendPacketNoReply

将数据包发送到服务。此接口没有定义客户端如何知道接收器何时使用关联的载荷内存完成。继承接口必须定义这一点。

packet 必须对当前缓冲区集有效,否则服务将关闭连接。

请求

名称类型
packet StreamPacket

SetPcmStreamType

设置客户端要传送的流的类型。使用此方法意味着流编码为 AUDIO_ENCODING_LPCM

必须在 PlayPlayNoReply 之前调用此方法。调用 SetPcmStreamType 后,客户端必须发送 AddPayloadBuffer 请求,然后发送各种 StreamSink 方法,例如 SendPacket/SendPacketNoReply

请求

名称类型
type AudioStreamType

SetPtsContinuityThreshold

设置用户提供的明确 PTS 与预期 PTS(通过插值确定)之间的最大阈值(以秒为单位)。超过此阈值后,渲染程序就不会再将视频流视为“连续”。

默认采用半个 PTS“tick”的时间间隔,使用当前定义的 PTS 单位。大多数用户无需更改此值的默认值。

示例:用户正在从容器中播放 48KHz 音频,该容器也包含视频,需要与音频同步。时间戳由容器按数据包明确提供,以 mSec 为单位表示。这意味着媒体时间轴的单个 tick(1 毫秒)恰好代表 48 帧音频。在这种情况下,应用将音频数据包传送到 AudioRenderer,每个数据包正好有 470 帧音频,每个数据包都带有一个显式时间戳,设置为最能准确表示呈现时间(给定此媒体时钟的分辨率)。因此,从零开始,时间戳将为...

[ 0、10、20、29、39、49、59、69、78、88... ]

在此示例中,如果尝试使用呈现时间来计算数据包中音频的起始帧数,大部分时间都是错误的。第一个时间戳是正确的(根据定义),但在时间戳和帧号恢复一致之前是 24 个数据包(第 24 个数据包将从第 11280 个音频帧开始,并且 PTS 正好为 235)。

解决此问题的一种方法是将数据流的 PTS 连续性阈值(以下简称“CT”)设置为等于媒体时钟的单个 tick 中包含的帧数所花时间的 1/2(向上取整)。在此情况下,就是 24.0 帧音频,即 500 uSec。如果数据包的预期 PTS 在明确提供的 PTS 的 +/-CT 帧内,均被视为是上一音频帧的延续。在此示例中,调用“SetPtsContinuityThreshold(0.0005)”即可正常运行。

其他可能的用途:对于相对于未配置为参考时钟的时钟,明确调度音频的用户,可以在引入不连续性之前使用此值来控制可接受的最大同步误差。例如,如果用户根据恢复的通用媒体时钟来调度音频,并且未将该时钟发布为参考时钟,并且他们将 CT 设置为 20 mSec,则在 AudioRenderer 有意插入呈现不连续性来解释该错误之前,可能会累积长达 20 毫秒的偏移误差。

如果用户需要处理其时间戳可能甚至不如 PTS tick 的 +/- 1/2 的容器正确,可以将此值设为更大的值。这应该是容器时间戳中的最大不准确性级别(如果已知)。否则,可以设置为在明确遵循绝对时间戳之前允许的最大偏移误差。最后,用户可以将此数字设置为非常大的值(例如 86400.0 秒),以有效地导致系统在第一个时间戳之后忽略所有时间戳,从而将所有音频与之前传送的数据包视为连续。相反,如果用户希望始终明确地调度其音频数据包,则可以将 CT 指定为 0。

注意:明确指定高频 PTS 单元会相应地降低默认连续性阈值。在内部,此阈值以 1/8192 个子帧的整数形式存储。默认阈值的计算公式如下:RoundUp((AudioFPS/PTSTicksPerSec) * 4096) / (AudioFPS * 8192)

请求

名称类型
threshold_seconds float32

SetPtsUnits

设置演示文稿(媒体)时间轴使用的单位。默认情况下,PTS 单位为纳秒(就像使用分子 1e9 和分母 1 调用时一样)。此比率必须介于 1/60(每分钟 1 次跳)和 1e9/1(每跳 1 纳秒)之间。

请求

名称类型
tick_per_second_numerator uint32
tick_per_second_denominator uint32

SetReferenceClock

设置控制此渲染程序播放速率的参考时钟。如果输入参数是有效的 zx::clock,必须具有 READ、DUPLICATE 和 TRANSFER 权限,并引用既是 MONOTONIC,又是 CONTINUOUS 的时钟。如果传入的时钟无效(例如未初始化的 zx::clock()),则表示该流会使用由 AudioCore 生成的“灵活”时钟来跟踪音频设备。

一旦调用 SetPcmStreamType,便无法调用 SetReferenceClock。它也无法再次调用(即使尚未设置渲染程序格式)。 如果客户端想要一个最初为 CLOCK_MONOTONIC 的参考时钟,但可能会在稍后的某个时间偏离,他们应该创建一个单调时钟克隆,将此设为流的参考时钟,然后根据需要对其进行速率调整。

请求

名称类型
reference_clock handle<clock>?

SetUsage

设置渲染流的使用。在调用 SetPcmStreamType 后,可能无法调用此方法。默认用法是 MEDIA

请求

名称类型
usage AudioRenderUsage

ProfileProvider

fuchsia.media/profile_provider.fidl 中定义

RegisterHandlerWithCapacity

将线程注册为媒体线程。这会通知媒体子系统应向该线程应用提升的调度配置文件,以便满足音频或视频的截止时间。

name 是要应用到 thread_handle 指定的线程的系统调度角色的名称 - 不同的产品可能会根据所请求的角色自定义底层调度策略。period 是建议的调度间隔。如果线程没有首选调度间隔,则 period 可能为零。capacity 是线程为实现良好性能或满足 period 定义的调度截止时间而需要运行的调度间隔比例。如果工作负载没有明确的运行时要求,则 capacity 可能为零。请注意,根据线程需要每个时间段的最糟糕的运行时,capacity 应该是诚信的估算值。过多的容量请求可能会被拒绝,或者导致其他线程的性能降低以满足资源限制。

容量、最长运行时间和期限具有以下关系:

容量 = 最长运行时 / 周期

其中:

0 <= 最长运行时 <= 周期,0 <= 容量 <= 1

对于异构系统,应针对系统中的最高性能处理器规划 / 测量容量。系统会自动调整有效容量以适应较慢的处理器和操作点,并避开速度太慢而无法满足请求的调度参数的处理器和操作点(前提是它们合理)。

返回应用的周期和容量(实际上是最长运行时间),其中任何一项都可以为零以表示不适用。

请求

名称类型
thread_handle handle<thread>
name string[64]
period zx/Duration
capacity float32

响应

名称类型
period zx/Duration
capacity zx/Duration

RegisterMemoryRange

注册用于媒体处理的内存范围。这会通知媒体子系统应该对该内存应用提升的内存配置文件,以便满足音频或视频的截止时间要求。

name 是要应用于 vmar_handle 所提供内存的系统内存角色的名称 - 不同的产品可能会根据所请求的角色自定义底层内存策略。

添加数量:15

请求

名称类型
vmar_handle handle<vmar>
name string[64]

响应

<EMPTY>

UnregisterHandler

将线程的调度配置文件重置为默认值。

请求

名称类型
thread_handle handle<thread>
name string[64]

响应

<EMPTY>

UnregisterMemoryRange

重置内存范围的内存配置文件。

添加数量:15

请求

名称类型
vmar_handle handle<vmar>

响应

<EMPTY>

SessionAudioConsumerFactory

fuchsia.media/audio_consumer.fidl 中定义

用于创建绑定到会话的音频使用方的接口。

CreateAudioConsumer

创建绑定到特定会话的 AudioConsumer(用于播放音频的接口)。session_id 是要呈现音频的媒体会话的标识符。

请求

名称类型
session_id uint64
audio_consumer_request server_end<AudioConsumer>

SimpleStreamSink

fuchsia.media/stream.fidl 中定义

使用 StreamBufferSet 进行缓冲区管理的 StreamSink。

AddPayloadBuffer

向与连接关联的当前缓冲区集添加载荷缓冲区。StreamPacket 结构体会使用 StreamPacket.payload_buffer_id 字段来引用当前按 ID 设置的载荷缓冲区。

调用此方法时,ID 为 id 的缓冲区不得位于当前集中,否则服务将关闭连接。

请求

名称类型
id uint32
payload_buffer handle<vmo>

DiscardAllPackets

舍弃之前通过 SendPacketSendPacketNoReply 发送但尚未发布的数据包。该响应会在所有数据包都发布后发送。

请求

<EMPTY>

响应

<EMPTY>

DiscardAllPacketsNoReply

舍弃之前通过 SendPacketSendPacketNoReply 发送但尚未发布的数据包。

请求

<EMPTY>

EndOfStream

表示直播已结束。此方法的精确语义由继承接口决定。

请求

<EMPTY>

RemovePayloadBuffer

从与连接关联的当前缓冲区集中移除载荷缓冲区。

调用此方法时,当前集中必须存在 ID 为 id 的缓冲区,否则服务将关闭连接。

请求

名称类型
id uint32

SendPacket

将数据包发送到服务。使用关联的载荷内存完成服务后,系统会发送此响应。

packet 必须对当前缓冲区集有效,否则服务将关闭连接。

请求

名称类型
packet StreamPacket

响应

<EMPTY>

SendPacketNoReply

将数据包发送到服务。此接口没有定义客户端如何知道接收器何时使用关联的载荷内存完成。继承接口必须定义这一点。

packet 必须对当前缓冲区集有效,否则服务将关闭连接。

请求

名称类型
packet StreamPacket

StreamBufferSet

fuchsia.media/stream.fidl 中定义

管理数据流的一组载荷缓冲区。此接口通常与 StreamSinkStreamSource 一起继承,用于在客户端和服务之间传输基本流。

AddPayloadBuffer

向与连接关联的当前缓冲区集添加载荷缓冲区。StreamPacket 结构体会使用 StreamPacket.payload_buffer_id 字段来引用当前按 ID 设置的载荷缓冲区。

调用此方法时,ID 为 id 的缓冲区不得位于当前集中,否则服务将关闭连接。

请求

名称类型
id uint32
payload_buffer handle<vmo>

RemovePayloadBuffer

从与连接关联的当前缓冲区集中移除载荷缓冲区。

调用此方法时,当前集中必须存在 ID 为 id 的缓冲区,否则服务将关闭连接。

请求

名称类型
id uint32

StreamProcessor

fuchsia.media/stream_processor.fidl 中定义

操作概览:

  1. 创建
  • 通过 CodecFactory 创建 - 请参阅 CodecFactory
  • 通过 LicenseSession 创建 - 请参阅 LicenseSession
  1. 获取输入约束条件
  • OnInputConstraints() - 流处理器创建后不久由流处理器发送。
  1. 提供输入缓冲区
  • SetInputBufferPartialSettings()
  1. 提供输入数据
  • QueueInputPacket() + OnFreeInputPacket(),只要它花了时间,可能会重复处理所有输入数据包...
  1. 获取输出约束条件和格式
  • OnOutputConstraints()
  • 除非客户端至少发送了一条 QueueInput* 消息,否则该消息不会发送,即使 StreamProcessor 背后的底层处理器从根本上不需要任何输入数据来确定其输出约束条件也是如此。此服务器行为可防止客户端对在传送输入之前显示的输出约束条件产生错误依赖。
  • 客户端必须容忍此延迟到达,直到传送大量输入数据之后才会到达,包括通过 OnFreeInputPacket() 回收大量输入数据包。
  • 此消息可能会在第一个输出数据之前多次到达。
  1. 提供输出缓冲区
  • SetOutputBufferPartialSettings() / CompleteOutputBufferPartialSettings()
  1. 具有可选 EndOfStream 的数据流
  • OnOutputPacket() / RecycleOutputPacket() / QueueInputPacket() / OnFreeInputPacket() / QueueInputEndOfStream() / OnOutputEndOfStream()

半可信 StreamProcessor 服务器 - 为防止解码 SW 存在可用于接管 StreamProcessor 服务器的漏洞,软件解码器会在隔离环境中运行(功能非常少)。与某些其他接口相比,使用解码器和处理单独安全上下文的流处理器接口的流处理器接口的客户端需要保护自身免受无效服务器行为(例如,双重释放 Packet_index 和任何其他无效服务器行为)的影响。馈入一个安全上下文的压缩数据后,不要过于信任单个 StreamProcessor 实例,以免在曾听说 StreamProcessor 服务器的任何缓冲区中混合数据。而是应创建单独的 StreamProcessor 实例,供具有安全性的客户端上下文使用。虽然基于硬件的解码器的图片看起来略有不同,并且超出了本段的讨论范围,但客户端应始终为安全性独立的客户端上下文使用单独的 StreamProcessor 实例。

此协议的方法所执行的操作和状态的说明,就像流处理器服务器同步执行这些方法一样,但实际上,正如 FIDL 接口的典型情况一样,消息处理是异步的。除非另有说明,否则上述状态将被视为从客户端的角度读取的状态。当然,从服务器返回的事件是异步传送的,因此每个 StreamProcessor 实例处理多个数据流的客户端需要注意给定事件是来自当前数据流,还是来自一些较旧的数据流。

Sync() 方法的主要目的是让客户端有力地防止在系统中同时分配新旧缓冲区,因为媒体缓冲区可能很大。为了实现此目的,Sync() 方法只在之前对 StreamProcessor 协议的所有调用都在 StreamControl 排序网域中实际生效后才提供响应。如果客户端有可能过于领先于 StreamProcessor 服务器(例如请求连续创建大量的流),也可使用 Sync() 来等待流处理器服务器赶上响应。此外,它还可以在调试期间使用,以确保流处理器服务器不会卡住。调用 Sync() 完全是可选操作,从不要求必须调用才能确保正确性,只有在取消重叠资源时才需要使用。

您可以将 StreamProcessor 实例重复用于其他数据流,而且这样做有时会跳过重新分配缓冲区。对于在 StreamProcessor 接口(看起来像是切换到新数据流)上搜寻新位置等情况,这种做法会很有帮助。

CloseCurrentStream

此操作会“关闭”当前信息流,不留下任何当前信息流。此外,此消息可以选择释放输入缓冲区或输出缓冲区。

如果从未存在过任何活跃数据流,则 stream_lifetime_ordinal 必须为零,否则服务器将关闭该通道。如果存在活跃数据流,则 stream_lifetime_ordinal 必须是最新的活跃数据流(无论该数据流是否仍处于活动状态)。否则,服务器将关闭该通道。

这条消息中的多条消息之间若没有新的活跃流不视为错误,因此客户端可以使用此消息关闭当前流,以停止在用户不再关心的流上浪费处理能力,然后决定应释放缓冲区,并使用 release_input_buffers 和/或 release_output_oldbuffers true 再次发送此消息(如果客户端不考虑新缓冲区和新缓冲区的使用,并且客户端不考虑新缓冲区的使用,则客户端不会释放这些缓冲区)。

另请参阅 Sync()。

请求

名称类型
stream_lifetime_ordinal uint64
release_input_buffers bool
release_output_buffers bool

CompleteOutputBufferPartialSettings

在 SetOutputBufferPartialSettings() 之后,服务器不会发送 OnOutputConstraints()、OnOutputFormat()、OnOutputPacket() 或 OnOutputEndOfStream(),直到客户端发送 CompleteOutputBufferPartialSettings()。

某些客户端或许能够在 SetOutputBufferPartialSettings() 之后立即发送 CompleteOutputBufferPartialSettings(),在这种情况下,客户端需要做好准备,在不知道缓冲区计数或数据包计数的情况下接收输出。此类客户端可能会在内部延迟对收到的输出的处理,直到客户端收到来自 sysmem 的消息(也就是客户端将获知缓冲区计数和数据包计数的时间)。

其他客户端可以先等待 sysmem 进行分配,准备接收输出,然后发送 CompleteOutputBufferPartialSettings()。

请求

名称类型
buffer_lifetime_ordinal uint64

EnableOnStreamFailed

允许服务器使用 OnStreamFailed(),而不是服务器在流失败时仅关闭整个 StreamProcessor 通道。

如果服务器在数据流失败时尚未看到此消息,则会关闭 StreamProcessor 通道,而不是发送 OnStreamFailed()。

请求

<EMPTY>

FlushEndOfStreamAndCloseStream

此消息为可选消息。

此消息仅在此数据流的 QueueInputEndOfStream() 之后有效。stream_lifetime_ordinal 输入参数必须与 QueueInputEndOfStream() 的 stream_lifetime_ordinal 匹配,否则服务器将关闭通道。

客户端可以使用此消息刷新(而不是舍弃)流的最后输入数据,以便流处理器服务器在服务器移至下一个流之前为所有输入数据生成相应的输出数据,而无需强制客户端等待 OnOutputEndOfStream() 将另一个流的数据加入队列。

QueueInputEndOfStream() 和 FlushEndOfStreamAndCloseStream() 之间的区别:QueueInputEndOfStream() 来自客户端的承诺,即流将不再有任何输入数据(某些流处理器需要此信息,流处理器才能发出最后的输出数据)。已发送的 QueueInputEndOfStream() 不会阻止客户端通过关闭当前流(无论是否使用流切换)完全舍弃当前流的其余内容。相比之下,FlushEndOfStreamAndCloseStream() 是一个来自客户端的请求,要求在转到任何较新的数据流之前处理所有先前排队的输入数据,包括逻辑“EndOfStream”(在成功情况下)。这实质上是将关闭数据流的处理从舍弃改为仅刷新。

使用此消息的客户端可以开始为新流提供输入数据,而不会舍弃旧流数据。这就是此消息的用途 - 允许客户端刷新(而不是舍弃)旧数据流的最后数据(而不是在关闭或切换被舍弃的数据流时采用默认值)。

由于旧数据流尚未完成处理,并且旧数据流的数据未被舍弃,因此客户端必须准备好继续处理 OnOutputConstraints() 消息,直到 stream_lifetime_ordinal 完成为止。当 OnOutputEndOfStream()、OnStreamFailed() 或 StreamProcessor 通道关闭时,客户端将知道 stream_lifetime_ordinal 已完成。

请求

名称类型
stream_lifetime_ordinal uint64

OnFreeInputPacket

当流处理器处理完此数据包中的数据(但不一定已完成数据处理)且客户端可以重新填充数据包时,服务器会发送此消息。

当新的 boot_lifetime_ordinal 启动时,不会为所有数据包发送此值,在这种情况下,客户端最初的所有数据包都是免费的。

在通过此事件收到可用的输入缓冲区后,流处理器客户端可以稍后调用 QueueInputBuffer,同时设置适当的偏移量和长度并使用相同的 packet_index,来重复使用 Packet_index。

OnFreeInputPacket() 并不表示输入数据包中的数据已成功处理,只是表示 StreamProcessor 不再需要输入数据。如果客户端需要知道哪些输入数据生成了相应的输出,建议使用 timestamp_ish 值。

不建议依赖 OnFreeInputPacket() 和 OnStreamFailed() 的相对顺序。而应使用 timstamp_ish 值来确定哪些输入数据包生成了相应的输出数据包。请注意,即使使用 timestamp_ish 值,也并不一定意味着具有给定 timestamp_ish 值的输入数据的处理已完全完成,因为在某些 StreamProcessor 中,从输入数据包衍生的数据可以在输入数据生成其主要输出数据(附加到 timestamp_ish 值的输出数据)后长时间(通常是无限期)保留以供参考。StreamProcessor 接口目前未提供任何方式来确定从输入数据包派生的所有数据是否已被 StreamProcessor 舍弃,而且如果这种机制已添加到 StreamProcessor 协议,那么它就属于可选的 StreamProcessor 功能,因为对于一些依赖外部方式处理数据的 StreamProcessor 实现,如果采用外部方式处理数据包时,其外部方式不一定提供信息,那么实现该机制时就不一定能实现。输入包的派生数据永远不会为其他流生成任何输出数据,也不会对这些数据有所贡献。

OnFreeInputPacket() 的顺序不一定与 QueueInputPacket() 的顺序相同。我们强烈建议不要依赖于相同的顺序,并且已废弃此顺序。即使 OnFreeInputPacket() 消息的顺序是有意地彼此加扰(但目前不在 OnStreamFailed() 之间)加扰,客户端也应正常工作。

响应

名称类型
free_input_packet PacketHeader

OnInputConstraints

服务器会在 StreamProcessor 创建后不久发送它,以指示输入缓冲区限制。“min”和“max”输入约束条件在 StreamProcessor 的生命周期内不会发生变化。

缓冲区大小和计数的“max”值足够大,可支持服务器支持的对输入要求最严苛的格式。“推荐”值应该可与在 StreamProcessor 创建期间传送的输入 FormatDetails 配合使用。如果客户端使用 QueueInputFormatDetails() 更改输入格式,则“推荐”值不一定适合。在这种情况下,由客户端来确定合适的值,方法是创建新的 StreamProcessor 实例,或知道此协议范围之外的合适值。

请参阅关于 StreamBufferConstraints 的注释。

创建 StreamProcessor 的过程中或创建之后不久,便会保证不请求地将此消息发送到 StreamProcessor 客户端。客户端不应依赖其作为最先到达客户端的消息。

对于给定的 StreamProcessor 实例,保证“最小”和“最大”输入约束条件不会改变。当服务器处理 QueueInputFormatDetails() 时,“推荐”值可能会有效更改。除了为客户端创建新的 StreamProcessor 实例之外,协议中没有其他方式来获取这些新的“推荐”值。

响应

名称类型
input_constraints StreamBufferConstraints

OnOutputConstraints

此事件会通知客户端新的输出限制条件。

此消息是相对于其他输出(例如输出数据包、输出格式、流结尾的输出)进行排序。

在流的第一个 OnOutputPacket() 之前,服务器会保证至少发送一个 OnOutputConstraints() 和一个 OnOutputFormat()。如果缓冲区配置已经适合信息流,则服务器不得在 OnOutputConstraints() 中将 buffer_constraints_action_required 设为 true(buffer_constraints_action_required false 表示缓冲区配置已经没有问题)。客户端必须容忍多个 OnOutputConstraints()(以及 1 个 OnOutputFormat() 消息)出现在第一个输出数据包之前。只要客户端尚未移至新的数据流,服务器就会等到客户端配置输出缓冲区之后再发送另一个 OnOutputConstraints()。

此消息可由服务器在流式传输过程中发送。如果 buffer_constraints_action_required false,则消息可以安全忽略,但客户端可以选择隐藏新的约束条件,以供下次客户端想要单方面重新配置缓冲区(如果允许)时使用。如果以后服务器需要更改输出配置,则服务器可能会发送新的 OnOutputConstraints(),并将 buffer_constraints_action_required 设为 true。

在缓冲区_constraints_action_required 为 true 时,如果客户端不想完全处理中流输出缓冲区配置更改,则应完全放弃处理,或至少按照指定的方式重新配置输出,然后再启动新流(如果客户端需要的话,还可能需要重新传送输入数据)。这样可以避免从输出缓冲区配置变更前开始的新数据流进行无用的重试,因为新数据流会再次遇到同样的中等数据流输出配置变更。

同样,某些服务器可能仅部分支持中流格式更改,或者仅在缓冲区足够大,以处理格式更改之前和之后的情况时,才支持中流格式更改。此类服务器仍应指示 buffer_constraints_action_required 为 true,但在客户端重新配置输出缓冲区后发送 OnStreamFailed()(当然,无缝处理中流输出配置更改当然更好,但并非总是可行,具体取决于格式)。当客户端从客户端整个逻辑媒体时间轴中的邻近位置开始重试新数据流时,输出缓冲区已经适合较大大小的输出,因此新数据流无需重新配置任何中流输出缓冲区,只需要使用中流缓冲区的 OnOutputFormat()。此策略可避免因客户端再次使用新数据流配置而发生变化时重试输出缓冲区时发生的问题。不建议服务器仅发送 OnStreamFailed(),仅仅是因为中流需要使用不同的输出缓冲区配置,而不是先发送包含 buffer_constraints_action_required 的 OnOutputConstraints(),并等待客户端重新配置输出缓冲区(避免在配置更改之前无用的客户端从某个逻辑位置使用新信息流进行重试)。

如果 Buffer_constraints_action_required 为 true,那么在客户端配置/重新配置输出缓冲区之前,服务器不会为此数据流发送任何 OnOutputPacket()。

如果客户端放弃在任何中流 OnOutputConstraints() 或中流 OnOutputFormat() 中处理流,应完全忽略任何包含 buffer_constraints_action_required false 值的 OnOutputConstraints()。否则,客户端可能会不必要地导致处理失败,或者服务器实现可能无法使用 buffer_constraints_action_required false,担心更简单的客户端只是断开连接。

所有客户端(即使是那些不希望支持任何中流输出缓冲区重新配置或中流 OnOutputFormat() 的客户端)都需要在第一个输出数据包之前处理 1..多条 OnOutputConstraints() 消息,并在第一个输出数据包之前处理 1 条 OnOutputFormat() 消息。

此消息根据输出数据包和 OnOutputFormat() 进行排序。

响应

名称类型
output_config StreamOutputConstraints

OnOutputEndOfStream

StreamProcessor 客户端发送 QueueInputEndOfStream() 后,StreamProcessor 服务器将在合理时间内发送相应的 OnOutputEndOfStream()。与 QueueInputEndOfStream() 类似,OnOutputEndOfStream() 在每个流中最多发送一次。

此消息结束后,系统不会再发送此直播的其他直播数据。此数据流的所有输入数据均已处理。

虽然 QueueInputEndOfStream() 不需要 StreamProcessor 客户端(除非客户端想使用 FlushEndOfStreamAndCloseStream()),但是如果 StreamProcessor 服务器收到 QueueInputEndOfStream(),并且客户端尚未关闭流,那么如果未发生任何问题,StreamProcessor 服务器必须生成相应的 OnOutputEndOfStream(),或者必须发送 OnStreamFailed() 的结束,或者必须关闭服务器理想的 StreamProcessor 服务器可以通过 error_ 标志处理和报告流错误,并完成流处理,而无需发送 OnStreamFailed(),但在任何情况下,只有上面列出的选项才是 OnOutputEndOfStream() 在 QueueInputEndOfStream() 之后不发生的唯一方式。

在此消息之后,就不会再有此 stream_lifetime_ordinal 的 OnOutputPacket() 或 OnOutputConstraints() 消息了。如果服务器未遵循此规则,客户端应关闭 StreamProcessor 通道。

error_detected_before bool 的语义与 OnOutputPacket() 中的 error_detected_before bool 的语义相同。

响应

名称类型
stream_lifetime_ordinal uint64
error_detected_before bool

OnOutputFormat

此消息由服务器在任何流的第一个输出数据包之前发送,可能在流的输出数据包之间的中间发送,根据输出数据包排序,并根据 OnOutputConstraints() 排序。

服务器可保证每个数据流的第一个数据包都将在 OnOutputFormat() 之前执行。

服务器可保证 OnOutputConstraints() 与 buffer_constraints_action_required 为 true,与 OnOutputPacket() 之间会有一个 OnOutputFormat()。换言之,客户端基本上可以忘记任何 OnOutputConstraints() 上包含 buffer_constraints_action_required 的输出格式,因为服务器会在任何 OnOutputPacket() 之前承诺后续的 OnOutputPacket()。

如果服务器在 OnOutputConstraints() 中将 buffer_constraints_action_required 设置为 true,则服务器不会发送 OnOutputFormat()(因此也不会发送 OnOutputPacket()),直到客户端重新配置输出缓冲区。

允许服务器在两个输出数据包的中间流中发送 OnOutputFormat()。

如果之间没有输出数据包,服务器不会发送两条相邻的 OnOutputFormat() 消息。但是,OnOutputFormat() 消息不能保证后续数据包,例如,服务器可能会发送 OnOutputEndOfStream() 或 OnStreamFailed()。

如果客户端不想无缝处理中流输出格式更改,则应确保该客户端处理的流从不会发生任何中流格式更改,或者客户端应确保在旧格式结束且新格式开始这一点(逻辑上)或之后的某个点开始新尝试,否则客户端可能会再次遇到相同的中流格式更改。

例如,在流式传输过程中发送此消息的一个示例是,视频解码器输出的视频帧尺寸在流式传输过程中发生变化。

并非所有服务器都支持无缝处理格式更改。支持无缝处理格式更改的应用可能要求格式更改也不需要重新配置输出缓冲区,以便无缝处理。请参阅 OnOutputConstraints() 的注释块,详细了解服务器和客户端的行为方式,尤其是当服务器和客户端无法无缝处理输出约束更改和/或输出格式更改时。

如果在数据流开始时,服务器没有按预期发送此消息,最常见的原因是客户端尚未处理值为 true 的 OnOutputConstraints()(通过使用 SetOutputBufferPartialSettings() 等配置输出缓冲区)。

响应

名称类型
output_format StreamOutputFormat

OnOutputPacket

这就是流处理器将输出数据包发送到流处理器客户端的方式。

顺序很重要。

客户端最终应调用 RecycleOutputPacket()(可能在多次切换数据流之后),除非 buffer_lifetime_ordinal 已改变。数据流更改不会改变客户端的繁忙数据包与服务器繁忙的数据包。

相关缓冲区始终是数据包的 buffer_index 字段中指定的缓冲区。

对于支持它的低级别缓冲区类型,StreamProcessor 可以在低级别缓冲区实际具有任何可用数据之前自由发出输出数据包,该机制通过机制来表明数据存在独立于 OnOutputPacket() 消息。对于此类低级别缓冲区类型,来自已发出数据包的数据的下游使用者必须参与低级别缓冲区信号机制,以了解何时可以安全地使用数据。在使用视频解码器和 gralloc 样式缓冲区时,这很可能是最相关的。

error_bool(s) 允许(但不要求)StreamProcessor 服务器报告在 AU 期间或 AU 之间发生的错误。

error_detected_before 的范围从此流上最后一个传送的输出数据包的结尾开始,或此流上之前没有输出数据包时至此流的开头。范围在 output_packet 开头处结束。

error_detected_before bool 是分开的,因此系统可以单独指明不连续情况,以及当前数据包是否受损。

error_detected_during 的范围是从此 output_packet 的开始至结束。

响应

名称类型
output_packet Packet
error_detected_before bool
error_detected_during bool

OnStreamFailed

数据流已失败,但 StreamProcessor 实例仍可用于新的数据流。

只有在客户端之前发送 EnableOnStreamFailed() 的情况下,服务器才会发送此消息。如果客户端未发送 EnableOnStreamFailed(),则服务器会改为关闭 StreamProcessor 通道。

建议 StreamProcessor 服务器实现处理流错误(最好也通过 OnOutputPacket() 和 OnOutputEndOfStream() 的 error_ 布尔值报告这些错误),而不会使整个流失败,但如果流处理器服务器无法做到这一点,但仍可以完全包含流的故障,流处理器服务器可以指示 Stream 处理器服务器在没有调用 EnableOnStreamProcessFailed() 的情况下

理想的 StreamProcessor 服务器可以在不发送此消息的情况下处理输入数据的问题,但如果 StreamProcessor 服务器可以完全可靠地包含数据流中的数据流故障,而不会对后续的数据流造成任何不利影响,则最好发送此消息,而不是关闭 StreamProcessor 通道的服务器端。

服务器不会再收到关于数据流失败的消息。这包括客户端原本预期的任何 OnOutputEndOfStream()。

响应

名称类型
stream_lifetime_ordinal uint64
error StreamError

QueueInputEndOfStream

告知服务器此流的所有 QueueInputPacket() 消息均已发送。

如果流未先(由客户端、通过 OnStreamFailed() 或 StreamProcessor 通道关闭)关闭,则稍后会有相应的 OnOutputEndOfStream()。

只有在服务器在看到客户端关闭流之前(例如,启动新的流)之前,服务器完成了流的处理,才会生成相应的 OnOutputEndOfStream() 消息。强制服务器在关闭流之前完成流的一种方法是在 QueueInputEndOfStream() 之后在任何新流之前使用 FlushEndOfStreamAndCloseStream()。强制服务器在关闭流之前完成流的另一种方法是等待 OnOutputEndOfStream(),然后再执行任何关闭流的操作。

除了用作“EndOfStream”标记让客户端在处理所有输入数据后显而易见之外,如果客户端从未发送 QueueInputEndOfStream(),则等待的时间不一定会导致所有输入数据都得到处理并传到输出。某些流处理器有一些内部延迟的数据,这些数据只能通过其他输入数据或此 EndOfStream 标记来推送。从这个意义上讲,此消息可视为 InputData 域级别的刷新,但仅当流处理器在流刚刚在 StreamControl 域级别关闭之前就这么远时,刷新才会生效。仅有此消息并不足以作为在 StreamControl 层面的整体快速浏览。为此,请先发送此消息,然后再发送 FlushEndOfStreamAndCloseStream()(此时,可以将新数据流的输入数据加入队列,而不会导致此旧数据流的数据被舍弃),或者等待 OnOutputEndOfStream() 后再关闭当前数据流。

如果客户端在此流的第一个 QueueInputEndOfStream() 之后针对此流发送 QueueInputPacket()、QueueInputFormatDetails() 和 QueueInputEndOfStream(),则服务器应关闭 StreamProcessor 通道。

请求

名称类型
stream_lifetime_ordinal uint64

QueueInputFormatDetails

如果输入格式详细信息仍与 StreamProcessor 创建期间指定的相同,则不需要此消息,也不需要发送。

如果数据流尚不存在,则此消息会创建数据流。

服务器只有在客户端至少发送了一条 QueueInput* 消息之后,才会发送 OnOutputConstraints()。

只要 StreamProcessor 实例支持新格式,所有服务器都必须在流开始时允许 QueueInputFormatDetails() 且不会失败。从技术上讲,这使得服务器只能支持在 StreamProcessor 创建期间设置的确切输入格式,这是设计目的。如果客户端尝试切换格式并获得 StreamProcessor 通道故障,则应在创建期间使用通过 CodecFactory 通过新的输入格式创建的新 StreamProcessor 实例重试一次,然后再放弃。

这些格式详情仅会替换在创建流处理器时为此数据流指定的格式详情。下一个流将默认恢复为流处理器创建期间设置的格式详情。

允许在第一个数据流的开头(就像在任何数据流的开头一样)显示此消息。指定的格式不需要与流处理器创建期间指定的格式匹配,但如果不匹配,StreamProcessor 通道可能会按上述方式关闭。

请求

名称类型
stream_lifetime_ordinal uint64
format_details FormatDetails

QueueInputPacket

此消息将输入数据排入队列,到流处理器进行处理。

如果数据流尚不存在,则此消息会创建新数据流。

服务器只有在客户端至少发送了一条 QueueInput* 消息之后,才会发送 OnOutputConstraints()。

即使流处理器尚未生成第一个 OnOutputConstraints(),并且 StreamProcessor 为先前加入队列的输入数据包生成 OnFreeInputPacket(),客户端也必须继续通过此消息传送输入数据。只要有免费数据包,可以确信服务器会生成第一个 OnOutputConstraints(),输入数据就必须继续。

请求

名称类型
packet Packet

RecycleOutputPacket

客户端处理完输出数据包后,需要告知流处理器可通过此方法将输出数据包重复用于更多输出。

不允许回收已由流处理器服务器释放的输出数据包。允许但建议客户端回收已由显式或隐式输出缓冲区 de-configuration() 解除的输出数据包。如需了解详情,请参阅 buffer_lifetime_ordinal。服务器必须忽略任何此类过时的 RecycleOutputPacket() 调用。

请求

名称类型
available_output_packet PacketHeader

SetInputBufferPartialSettings

这是 SetInputBufferSettings() 的替代方法。

当客户端使用 sysmem 分配缓冲区时,会使用此消息代替 SetInputBufferSettings()+AddInputBuffer()。相反,单个 SetInputBufferPartialSettings() 可为 StreamProcessor 提供客户端指定的输入设置和 BufferCollectionToken,StreamProcessor 将使用它将约束传达给 sysmem。sysmem 通过其 BufferCollection 通道(而不是通过 StreamProcessor 通道)直接告知客户端和 StreamProcessor 分配的缓冲区。

除非 sysmem 通知客户端缓冲区分配已完成并成功,否则客户端不得 QueueInput...()。

服务器应该做好准备,以便在服务器不一定从系统必须收到分配缓冲区的信息之前看到 QueueInput...()。服务器必须容忍任一排序,因为 QueueInput...() 和系统内存分配完成通知到达不同的通道,因此客户端听说分配已完成,并不意味着服务器知道分配已经完成。但是,服务器可以认为分配实际上已经完成,并且可以预期在从 sysmem 请求信息时立即从 sysmem 获取分配信息。

请求

名称类型
input_settings StreamBufferPartialSettings

SetOutputBufferPartialSettings

这是 SetOutputBufferSettings() 的替代项。

当客户端使用 sysmem 分配缓冲区时,会使用此消息而不是 SetOutputBufferSettings()+AddOutputBuffer()。相反,单个 SetOutputBufferPartialSettings() 可以为 StreamProcessor 提供客户端指定的输出设置和 BufferCollectionToken,StreamProcessor 将使用它将限制传递给 sysmem。sysmem 通过其 BufferCollection 通道(而不是通过 StreamProcessor 通道)直接通知客户端和 StreamProcessor 分配的缓冲区。

在客户端收到 OnOutputConstraints() 后,必须配置输出缓冲区,并且 buffer_constraints_action_required 为 true 且 stream_lifetime_ordinal 等于客户端当前的 stream_lifetime_ordinal(即使有活动的信息流),并且只要当前没有信息流,系统就会允许配置输出缓冲区。

关闭当前流发生在 StreamControl 排序域上,因此在 CloseCurrentStream() 或 FlushEndOfStreamAndCloseStream() 之后,客户端必须在知道当前流已经不再存在之前收到后续的 Sync() 完成。

另请参阅 CompleteOutputBufferPartialSettings()。

请求

名称类型
output_settings StreamBufferPartialSettings

同步

完成后,所有之前的 StreamProcessor 调用都会完成它们将在服务器端执行的操作,但使用 QueueInputPacket() 处理排队的数据除外

此调用的主要目的是让客户端能够等到将 release_input_buffers 和/或 release_output_buffers 设置为 true 的 CloseCurrentStream() 生效,然后再分配新缓冲区和重新设置输入和/或输出缓冲区。对于可能会占用资源类型的媒体缓冲区,这种资源用量去重叠是值得的,而且与使用的资源相比,总体池不一定庞大的类型。尤其是在客户端多次重新配置缓冲区的情况下。

请注意,在分配新的媒体缓冲区之前的 Sync() 并不足以在整个系统范围内实现媒体缓冲区资源使用的非重叠,但它是实现这一点的一个有用部分。

Sync() 会传输输出排序域和 StreamControl 排序域,但不会传输 InputData 排序域。

此请求可用于避免达到 kMaxInFlightStreams(目前为 10)。如果客户端保持在 8 个以内流的数量,则可以轻松保持在 10 个以内。虽然协议允许使用重复的 SetInputBufferSettings() 等,但滥用该通道的客户端可能会认为,如果服务器或通道本身太远落后,通道将直接关闭。

请求

<EMPTY>

响应

<EMPTY>

StreamSink

fuchsia.media/stream.fidl 中定义

消耗数据包流。此接口通常与 StreamBufferSet 一起继承,以实现将基本流从客户端传输到服务。

DiscardAllPackets

舍弃之前通过 SendPacketSendPacketNoReply 发送但尚未发布的数据包。该响应会在所有数据包都发布后发送。

请求

<EMPTY>

响应

<EMPTY>

DiscardAllPacketsNoReply

舍弃之前通过 SendPacketSendPacketNoReply 发送但尚未发布的数据包。

请求

<EMPTY>

EndOfStream

表示直播已结束。此方法的精确语义由继承接口决定。

请求

<EMPTY>

SendPacket

将数据包发送到服务。使用关联的载荷内存完成服务后,系统会发送此响应。

packet 必须对当前缓冲区集有效,否则服务将关闭连接。

请求

名称类型
packet StreamPacket

响应

<EMPTY>

SendPacketNoReply

将数据包发送到服务。此接口没有定义客户端如何知道接收器何时使用关联的载荷内存完成。继承接口必须定义这一点。

packet 必须对当前缓冲区集有效,否则服务将关闭连接。

请求

名称类型
packet StreamPacket

StreamSource

fuchsia.media/stream.fidl 中定义

生成数据包流。此接口通常与 StreamBufferSet 一起继承,以实现将基本流从服务传输到客户端。

DiscardAllPackets

请求

<EMPTY>

响应

<EMPTY>

DiscardAllPacketsNoReply

请求

<EMPTY>

OnEndOfStream

表示直播已结束。

响应

<EMPTY>

OnPacketProduced

传送服务生成的数据包。当客户端使用完载荷内存后,必须调用 ReleasePacket 以释放载荷内存。

响应

名称类型
packet StreamPacket

ReleasePacket

释放与之前通过 OnPacketProduced 传送的数据包相关联的载荷内存。

请求

名称类型
packet StreamPacket

UsageAudioConsumerFactory

fuchsia.media/audio_consumer.fidl 中定义

用于创建本地渲染的音频使用方的接口。

CreateAudioConsumer

在指定使用值的情况下,创建 AudioConsumer,即用于播放音频的接口。提交给此类消费者的音频始终在本地呈现。

请求

名称类型
usage AudioRenderUsage
audio_consumer_request server_end<AudioConsumer>

UsageGainListener

fuchsia.media/usage_reporter.fidl 中定义

用于监控用量增益设置变更的协议。

该通道将在设备不存在时关闭。

OnGainMuteChanged

连接后立即调用,并且会在使用增益设置发生变化时立即调用。

客户端必须做出响应才能确认事件。未确认其事件的客户端最终将断开连接。

注意:此 API 未实现静音报告功能;muted 始终为 false。

请求

名称类型
muted bool
gain_dbfs float32

响应

<EMPTY>

UsageGainReporter

fuchsia.media/usage_reporter.fidl 中定义

用于设置使用增益观察者的协议。

RegisterListener

将监听器连接到由 device_token 标识的设备上 usage 的使用增益设置更改流。使用增益不是由任何客户端直接设置的;它是每个设备的使用音量设置的转换,与主动静音/闪避增益调整相加。

设备可能会将同一音量级别映射到不同的 dbfs,因此需要使用 device_unique_id 来识别设备。

如果客户端需要在运行时选择 ID,则 AudioDeviceEnumerator 会提供对设备及其唯一 ID 的程序化访问。

请求

名称类型
device_unique_id string[36]
usage Usage
usage_gain_listener UsageGainListener

UsageReporter

fuchsia.media/usage_reporter.fidl 中定义

用于设置音频使用情况观察者的协议。

观看

请求

名称类型
usage Usage
usage_watcher UsageWatcher

UsageWatcher

fuchsia.media/usage_reporter.fidl 中定义

用于监听音频使用情况政策状态更改的协议。

此 API 不会反映用户操作(例如降低音量或将音频流静音)。

OnStateChanged

在首次连接时以及监控的使用情况发生变化时调用。提供的用法将始终是绑定用法;提供它是为了此协议的实现可以绑定到多种用法。

客户端必须做出响应才能确认事件。未确认其事件的客户端最终将断开连接。

请求

名称类型
usage Usage
state UsageState

响应

<EMPTY>

结构

AacConstantBitRate

fuchsia.media/stream_common.fidl 中定义

野战类型说明默认
bit_rate uint32

每秒比特数

无默认取景方式

AacEncoderSettings

fuchsia.media/stream_common.fidl 中定义

野战类型说明默认
transport AacTransport 无默认取景方式
channel_mode AacChannelMode 无默认取景方式
bit_rate AacBitRate 无默认取景方式
aot AacAudioObjectType 无默认取景方式

AacTransportAdts

fuchsia.media/stream_common.fidl 中定义

ADTS 内的 AAC

<EMPTY>

AacTransportLatm

fuchsia.media/stream_common.fidl 中定义

LATM 内的 AAC

野战类型说明默认
mux_config_present bool

是否存在 MuxConfiguration 流元素

无默认取景方式

AacTransportRaw

fuchsia.media/stream_common.fidl 中定义

原始 AAC 访问单元。

<EMPTY>

AudioCompressedFormatAac

fuchsia.media/stream_common.fidl 中定义

<EMPTY>

AudioCompressedFormatSbc

fuchsia.media/stream_common.fidl 中定义

<EMPTY>

AudioDeviceInfo

fuchsia.media/audio_device_enumerator.fidl 中定义

野战类型说明默认
name string 无默认取景方式
unique_id string 无默认取景方式
token_id uint64 无默认取景方式
is_input bool 无默认取景方式
gain_info AudioGainInfo 无默认取景方式
is_default bool 无默认取景方式

AudioGainInfo

fuchsia.media/audio_device_enumerator.fidl 中定义

野战类型说明默认
gain_db float32 无默认取景方式
flags AudioGainInfoFlags 无默认取景方式

AudioStreamType

fuchsia.media/stream_type.fidl 中定义

描述音频基本流的类型。

野战类型说明默认
sample_format AudioSampleFormat 无默认取景方式
channels uint32 无默认取景方式
frames_per_second uint32 无默认取景方式

“Compression”(压缩)

fuchsia.media/stream_type.fidl 中定义

描述应用于流的压缩。此类型可与 AudioStreamTypeVideoStreamType 结合使用,用于表示特定媒介的压缩类型。

野战类型说明默认
type CompressionType

应用于数据流的压缩类型。这通常是 ENCODING 值之一,但不得使用 AUDIO_ENCODING_LPCMVIDEO_ENCODING_UNCOMPRESSED,因为这些编码被视为未压缩。

无默认取景方式
parameters vector<uint8>[8192]?

特定于类型的不透明“带外”参数,用于描述流的压缩。

无默认取景方式

EncryptionPattern

fuchsia.media/stream_common.fidl 中定义

EncryptionPattern

模式加密在下样本的受保护范围(SubsampleEntry 的加密字节)上采用经过加密的清除 16 字节块的模式。此结构指定加密数据块的数量,后跟清除数据块的数量。

野战类型说明默认
clear_blocks uint32 无默认取景方式
encrypted_blocks uint32 无默认取景方式

元数据

fuchsia.media/metadata.fidl 中定义

野战类型说明默认
properties vector<Property> 无默认取景方式

参数

fuchsia.media/stream_common.fidl 中定义

参数

通用参数。

我们希望通过原生定义尽可能多的特定于数据流的参数语义,尽可能减少这种通用“参数”结构的使用。

野战类型说明默认
scope string 无默认取景方式
name string 无默认取景方式
value Value 无默认取景方式

PcmFormat

fuchsia.media/stream_common.fidl 中定义

PcmFormat

PCM 音频格式详细信息。

野战类型说明默认
pcm_mode AudioPcmMode 无默认取景方式
bits_per_sample uint32 无默认取景方式
frames_per_second uint32 无默认取景方式
channel_map vector<AudioChannelId>[16] 无默认取景方式

属性

fuchsia.media/metadata.fidl 中定义

野战类型说明默认
label string 无默认取景方式
value string 无默认取景方式

SbcEncoderSettings

fuchsia.media/stream_common.fidl 中定义

SBC 编码器的设置。

SBC 编码器获取有符号的小端序 16 位线性 PCM 样本,并返回已编码的 SBC 帧。分批 sub_bands * block_count PCM 帧的 SBC 编码器 PCM 数据。该编码器将接受任意帧边界上的 PCM 数据,但在 EOS 排入队列时刷新的输出可以零填充,以形成整批编码。

野战类型说明默认
sub_bands SbcSubBands SbcSubBands.SUB_BANDS_8
allocation SbcAllocation SbcAllocation.ALLOC_LOUDNESS
block_count SbcBlockCount SbcBlockCount.BLOCK_COUNT_4
channel_mode SbcChannelMode 无默认取景方式
bit_pool uint64

SBC 位池值。

无默认取景方式

StreamPacket

fuchsia.media/stream.fidl 中定义

描述由 StreamSink 消耗或由 StreamSource 生成的数据包。

野战类型说明默认
pts int64

数据包呈现的时间(根据演示时钟)。

NO_TIMESTAMP
payload_buffer_id uint32

用于此数据包的载荷缓冲区的 ID。

将此结构体与 StreamBufferSet 一起使用时,此字段是通过 StreamBufferSet.AddPayloadBuffer 提供的载荷缓冲区的 ID。在这种情况下,此值必须标识当前集合中的载荷缓冲区。其他接口可能会为此字段定义不同的语义。

无默认取景方式
payload_offset uint64

数据包载荷在载荷缓冲区中的偏移量。

此值加上 payload_size 值必须小于或等于引用的载荷缓冲区的大小。

无默认取景方式
payload_size uint64

载荷的大小(以字节为单位)。

此值加上 payload_offest 值必须小于或等于引用的载荷缓冲区的大小。

无默认取景方式
flags uint32

一组按位或按位的标志(请参见下面的常量),用于描述此数据包的属性。

0
buffer_config uint64

与此数据包相关联的缓冲区配置。此字段的语义取决于与此结构体一起使用的接口。在很多情况下,不使用此字段。此字段适用于明确标识缓冲区配置(即载荷缓冲区组)的情况。在这种情况下,payload_buffer_id 会引用此字段标识的缓冲区配置中的载荷缓冲区。

0
stream_segment_id uint64

与此数据包相关联的音频流片段。此字段的语义取决于使用此结构体的接口。在许多情况下,不使用此字段。此字段用于区分视频流的连续片段,其中的视频流属性(例如编码)可能因片段而异。

0

StreamType

fuchsia.media/stream_type.fidl 中定义

描述基本流的类型。

野战类型说明默认
medium_specific MediumSpecificStreamType

特定于媒介的类型信息。

无默认取景方式
encoding string[255]

编码(请参阅下面的常量)。此值以字符串表示,因此无需修改此文件即可引入新编码。

无默认取景方式
encoding_parameters vector<uint8>?

编码专用参数,有时称为“带外数据”。通常,此数据与压缩的流相关联,并提供解压缩流所需的参数。通常,该数据对除流的提供方和使用方外的所有各方都是不透明的。

无默认取景方式

SubpictureStreamType

fuchsia.media/stream_type.fidl 中定义

说明子图片基本流的类型。

<EMPTY>

SubsampleEntry

fuchsia.media/stream_common.fidl 中定义

SubsampleEntry

子样本是样本中的字节范围,由一个清晰的字节范围后跟一个加密的字节范围组成。此结构指定下样本中每个范围的大小。

野战类型说明默认
clear_bytes uint32 无默认取景方式
encrypted_bytes uint32 无默认取景方式

TextStreamType

fuchsia.media/stream_type.fidl 中定义

描述文本基本流的类型。

<EMPTY>

TimelineFunction

fuchsia.media/timeline_function.fidl 中定义

TimelineFunction 表示主题时间轴和参考时间轴之间的关系,它具有线性关系。

例如,假设有一个常见用例,参考时间是系统的单调时钟,而主题时间是某些媒体(如视频)的预期呈现时间。

reference_time 是播放开始时单调时钟的值。subject_time 为 0(假设从媒体开头开始播放)。然后,我们选择 reference_deltasubject_delta,使 subject_delta / reference_delta 代表所需的播放速率,例如 0/1 表示暂停,1/1 表示正常播放。

公式

借助函数,我们可以使用以下公式根据参考时间轴值 r 确定主题时间轴值 s(其中 reference_delta > 0):

s = (r - 参考时间) * (subject_delta / reference_delta) + subject_time

同样,我们可以使用以下公式根据主题时间轴值 s 找到参考时间轴值 r(其中 subject_delta > 0):

r = (s - subject_time) * (reference_delta / subject_delta) + referenceenc_time

选择时间值

时间值可以是任意的,我们的线性关系当然是相同的,但我们可以用它们来表示分段线性关系中片段的边界。

例如,如果用户执行跳过章节,我们可能需要使用 TimelineFunction 来描述这种情况,其 subject_time 是跳到的时间,reference_time 现在加上一些 epsilon,而对于正常播放速率,增量比率为 1/1。

野战类型说明默认
subject_time int64

主题时间轴中的值,与 reference_time 相关联。

0
reference_time int64

参考时间轴中的值,与 subject_time 相关。

0
subject_delta uint32

与 reference_delta 对应的主题时间轴中的更改。

0
reference_delta uint32

与 subject_delta 对应的参考时间轴变化。 不能为零。

1

VideoStreamType

fuchsia.media/stream_type.fidl 中定义

说明视频基本流的类型。

野战类型说明默认
pixel_format fuchsia.images/PixelFormat
已废弃:13
无默认取景方式
color_space ColorSpace 无默认取景方式
width uint32

视频帧的尺寸,以像素为单位。

无默认取景方式
height uint32 无默认取景方式
coded_width uint32

视频帧的尺寸,以像素编码。这些值必须等于或大于相应的宽度/高度值。

无默认取景方式
coded_height uint32 无默认取景方式
pixel_aspect_ratio_width uint32

以预期显示的单个像素作为帧的宽高比。

无默认取景方式
pixel_aspect_ratio_height uint32 无默认取景方式
stride uint32

主视频平面中每个“已编码”行的字节数。

无默认取景方式

VideoUncompressedFormat

fuchsia.media/stream_common.fidl 中定义

VideoUncompressedFormat

未压缩视频格式详细信息。

野战类型说明默认
image_format fuchsia.sysmem/ImageFormat_2 无默认取景方式
fourcc uint32 无默认取景方式
primary_width_pixels uint32 无默认取景方式
primary_height_pixels uint32 无默认取景方式
secondary_width_pixels uint32 无默认取景方式
secondary_height_pixels uint32 无默认取景方式
planar bool 无默认取景方式
swizzled bool 无默认取景方式
primary_line_stride_bytes uint32 无默认取景方式
secondary_line_stride_bytes uint32 无默认取景方式
primary_start_offset uint32 无默认取景方式
secondary_start_offset uint32 无默认取景方式
tertiary_start_offset uint32 无默认取景方式
primary_pixel_stride uint32 无默认取景方式
secondary_pixel_stride uint32 无默认取景方式
primary_display_width_pixels uint32 无默认取景方式
primary_display_height_pixels uint32 无默认取景方式
has_pixel_aspect_ratio bool false
pixel_aspect_ratio_width uint32 1
pixel_aspect_ratio_height uint32 1

Void

fuchsia.media/audio_consumer.fidl 中定义

<EMPTY>

枚举

AacAudioObjectType 严格

类型:uint32

fuchsia.media/stream_common.fidl 中定义

名称说明
0

MPEG-2 低复杂性

1

MPEG-4 低复杂性

AacChannelMode 严格

类型:uint32

fuchsia.media/stream_common.fidl 中定义

名称说明
0
2

AacVariableBitRate 严格

类型:uint32

fuchsia.media/stream_common.fidl 中定义

可变比特率模式。实际产生的比特率因输入信号和其他编码设置而异。

请参阅 https://wiki.hydrogenaud.io/index.php?title=Fraunhofer_FDK_AAC#Bitrate_Modes

名称说明
1
2
3
4
5

AudioBitrateMode 严格

类型:uint32

fuchsia.media/stream_common.fidl 中定义

名称说明
0
1
2

AudioCaptureUsage 严格

类型:uint32

fuchsia.media/audio_core.fidl 中定义

对用于捕获音频的流的目的的说明。音频政策使用 AudioCaptureUsage 来指示音频流如何彼此交互。

名称说明
0

系统会在后台使用信息流录制音频。这些流可能在任何时候处于活跃状态,并被视为特权流。示例:监听启动指令

1

视频流旨在实现正常的拍摄功能。当音频流创建者在前台运行时用于捕获音频的流应使用此配置。示例:录音机

2

信息流用于与系统代理进行交互。只有在用户表明他们有意与相关方进行互动时,才应使用此维度。 示例:Google 助理、Siri、Alexa

3

数据流旨在用于某种形式的实时用户间通信。语音/视频聊天应使用此选项。

AudioChannelId 严格

类型:uint32

fuchsia.media/stream_common.fidl 中定义

AudioChannelId

用于指定哪个声道对应哪种扬声器位置 / 类型。

TODO(dustingreen):还需要频道 ID 吗?

名称说明
0
1
2
3
4
5
6
7
8
9
10
1862270976
2147483647

AudioOutputRoutingPolicy 严格

类型:uint32

fuchsia.media/audio_core.fidl 中定义

名称说明
0
1

AudioPcmMode 严格

类型:uint32

fuchsia.media/stream_common.fidl 中定义

AudioPcmMode

名称说明
0
1
2

AudioRenderUsage 严格

类型:uint32

fuchsia.media/audio_core.fidl 中定义

用注解标记了用于渲染音频的流的目的。 AudioRenderer 的使用情况一经创建便无法更改。音频政策使用 AudioRenderUsage 来指示音频流如何彼此交互。

名称说明
0

视频流只能播放环境音或背景音。对于不会造成任何后果的中断,则应使用此设置。

1

信息流旨在提供正常功能。属于正常功能的数据流应使用此功能。

2

音频流旨在中断设备任何正在进行的功能。 用于中断通知(如通知)的数据流应采用此做法。

3

信息流用于与系统代理进行交互。这应该用于响应用户发起的触发器。

4

数据流旨在用于某种形式的实时用户间通信。语音/视频聊天应使用此选项。

AudioSampleFormat 严格

类型:uint32

fuchsia.media/stream_type.fidl 中定义

枚举支持的音频样本格式。

名称说明
1

8 位无符号样本,样本大小为 1 字节。

2

16 位有符号样本,主机端字节序,样本大小 2 字节。

3

32 位的 24 位有符号样本,主机端字节顺序,样本大小为 4 个字节。

4

32 位浮点样本,样本大小为 4 个字节。

行为严格

类型:uint32

fuchsia.media/audio_core.fidl 中定义

当多个数据流处于活动状态时应用于数据流的行为。

名称说明
0

混录不同的直播。

1

应用增益可降低其中一个音频流的音量。(-14.0db)

2

应用增益以将其中一个流静音。(-160.0db)

CodecProfile 灵活

类型:uint32

fuchsia.media/stream_common.fidl 中定义

允许的编解码器配置文件列表。此列表应该非常灵活,因为编解码器可以并且将来会添加。如果需要,此文件可同时包含视频和音频配置文件。

添加:11

名称说明
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

ColorSpace 严格

类型:uint32

fuchsia.media/stream_type.fidl 中定义

名称说明
0
1
2
3
4

Lc3FrameDuration灵活

类型:uint32

fuchsia.media/stream_common.fidl 中定义

添加了:HEAD

名称说明
1
2

SbcAllocation 严格

类型:uint32

fuchsia.media/stream_common.fidl 中定义

名称说明
0
1

SbcBlockCount 严格

类型:uint32

fuchsia.media/stream_common.fidl 中定义

名称说明
4
8
12
16

SbcChannelMode 严格

类型:uint32

fuchsia.media/stream_common.fidl 中定义

名称说明
0
1
2
3

SbcSubBands 严格

类型:uint32

fuchsia.media/stream_common.fidl 中定义

名称说明
4
8

StreamError 严格

类型:uint32

fuchsia.media/stream_common.fidl 中定义

StreamError

此错误代码封装了可能来自 StreamProcessor 服务器的各种错误。该事件可以作为 OnStreamFailed 事件或频道的歌名片形式发送。

名称说明
1

内部错误,未指定原因。

2

客户端提供了无效输入格式的详细信息。

3

服务器收到了不适合执行操作的缓冲区。例如,解码器收到的输出缓冲区太小,无法对帧进行解码。

4

输入 EOS(流结尾)处理失败,因此流失败。 目前,如果核心编解码器监控计时器在处理 EOS 时触发了,则可能会发生这种情况。

16777217

内部解码器错误,原因不明。

16777218

无法解析的输入数据。这种方式只会报告部分解析问题/错误。损坏的输入数据可能会报告为其他 StreamError,或者不会导致 StreamError。

33554433

内部编码器错误,原因不明。

50331649

内部解密工具错误,原因不明。

50331650

解密工具无法使用所请求的 KeyId。如果该密钥可用,客户端可能会稍后重试。

VideoColorSpace 严格

类型:uint32

fuchsia.media/stream_common.fidl 中定义

名称说明
0

AudioCompressedFormatCvsd

fuchsia.media/stream_common.fidl 中定义

AudioCompressedFormatCvsd 中目前不包含任何字段,因为我们将使用蓝牙核心规范 v5.3 第 9.2 节中建议的参数值。

添加了:HEAD

序数野战类型说明

AudioCompressedFormatLc3

fuchsia.media/stream_common.fidl 中定义

AudioCompressedFormatLc3 不包含任何字段。设置解码器的必需参数会嵌入 FormatDetails.oob_bytes 中的 Codec_Specific_Configuration(分配的编号部分(第 6.12.5 部分))。

添加了:HEAD

序数野战类型说明

AudioConsumerStatus

fuchsia.media/audio_consumer.fidl 中定义

表示使用方的状态。在初始状态下,errorpresentation_timeline 不存在。交货期字段始终显示。

序数野战类型说明
error AudioConsumerError

如果存在,则表示当前有效的错误条件。如果没有错误,则不存在。

presentation_timeline TimelineFunction

如果存在,则表示呈现时间轴和局部单调时钟之间的当前关系(均以纳秒为单位)。如果不存在,则表示没有关系。最初缺失。

“呈现时间轴”是指数据包上的 pts(呈现时间戳)值。此时间轴函数可用于根据数据包的 pts 值确定将呈现数据包的本地单调时钟时间。

min_lead_time uint64

表示此 AudioConsumer 支持的最短准备时间(以纳秒为单位)。换句话说,提供给 AudioConsumer.Startmedia_time 与第一个数据包中的 pt 之间的差距有多小。系统会裁剪此范围之外的值。

max_lead_time uint64

表示此 AudioConsumer 支持的最长准备时间(以纳秒为单位)。换句话说,提供给 AudioConsumer.Startmedia_time 与第一个数据包中的 pt 之间的差距有多大。系统会裁剪此范围之外的值。

CvsdEncoderSettings

fuchsia.media/stream_common.fidl 中定义

CVSD 编码器的设置。它目前不包含任何字段,因为我们将使用蓝牙核心规范 v5.3 第 9.2 节中建议的参数值。

添加了:HEAD

序数野战类型说明

DecryptedFormat

fuchsia.media/stream_common.fidl 中定义

DecryptedFormat

此属性说明了解密后内容的格式。StreamProcessor 服务器需要在传送输出数据包之前发送它。解密输出目前没有其他格式详情。

序数野战类型说明
ignore_this_field bool

EncryptedFormat

fuchsia.media/stream_common.fidl 中定义

EncryptedFormat

解密流处理器的流格式详情载荷。这是一个稀疏填充的表,用于指定解密所需的参数(数据流除外)。只有在字段发生更改时,才需要更新字段,但如果值重复,则无需更新错误。

序数野战类型说明
init_vector InitVector

init_vector 与密钥和内容块结合使用,以创建链中的第一个加密分块,并派生加密分块链中的后续加密分块。 用法:

  • 必须在将输入数据包传送给解密器之前设置该参数。
  • 这可能会在数据流期间多次更改。
subsamples vector<SubsampleEntry>

subsamples 用于标识下采样的清除和加密部分。用法:

  • 对于整个示例加密,不应发送此参数。
  • 这可能会在数据流期间多次更改。
pattern EncryptionPattern

pattern 用于标识基于模式的加密的清除和加密块。用法:

  • CENC 和 CBC1 不允许执行此操作,CENS 和 CBCS 要求执行此操作。
  • 如果需要,必须在将输入数据包传送给解密器之前设置该参数。
  • 这可能会在数据流期间多次更改。
scheme string

scheme 指定要使用的加密方案,例如 fuchsia.media.ENCRYPTION_SCHEME_CENC。用法:

  • 该值需要在传送输入数据包之前设置。
  • 仅在某些情况下,只允许在流式传输过程中更改架构。为数据流选择加密架构后,架构只能设置为 fuchsia.media.ENCRYPTION_SCHEME_UNENCRYPTED 或相同的初始加密架构。架构可以随时设置为 fuchsia.media.ENCRYPTION_SCHEME_UNENCRYPTED
key_id KeyId

key_id 可标识用于解密后续数据的密钥。 用法:

  • 必须先设置此字段,然后才能将输入数据包传送给解密器。
  • 这可能会在数据流期间多次更改。

FormatDetails

fuchsia.media/stream_common.fidl 中定义

FormatDetails

本部分介绍/详细说明 StreamProcessor 的输入或输出格式(输入与输出有各自的实例)。

序数野战类型说明
format_details_version_ordinal uint64
mime_type string
oob_bytes vector<uint8>
domain DomainFormat
pass_through_parameters vector<Parameter>
encoder_settings EncoderSettings

向编码器指示如何对原始数据进行编码。

解码器可能会忽略此字段,但由于没有意义,设置此字段时却有权接收被拒的请求。

timebase uint64

输入包的 timestamp_ish 值的时基基点数。

仅当适用于输入数据包有效部分的字节 0 的输入时间戳不直接对应于任何输出数据包的有效部分字节 0 时,时基仅用于可选推断 timestamp_ish 值。

如果无需进行时间戳外推,原因可能是输入时缺少时间戳,或输入是以编码器输入分块大小为增量提供的(基于编码器设置,并由客户端独立计算)。如果已知需要或已知客户端可以接受时间戳推断,则设置此字段。

profile CodecProfile

指定编码器或解码器的编解码器配置文件。

对于编码器:此值完全是可选的。客户端可能需要指定出于协议兼容性原因(例如 WebRTC)使用的编解码器配置文件。不过,如果未设置该值,则编码器可以自由选择任何受支持的编解码器配置文件。

对于解码器:此值是可选的,但最好提供此值(至少是未加密的数据流)。容器格式包括编码的配置文件,应提供给解码器。某些格式(如 VP9 和 AV1)在其基本比特流中包含编码配置文件,因此这些解码器可以弄清流的编码配置文件。无论如何,客户端都应该尽可能提供经过编码的配置文件。

添加:11

H264EncoderSettings

fuchsia.media/stream_common.fidl 中定义

H264 编码器的设置。

序数野战类型说明
bit_rate uint32

编码流的目标每秒比特数。 如果省略,则解释为 200,000。

frame_rate uint32

编码流的目标每秒帧数。 如果省略,则解读为 30。

gop_size uint32

每个关键帧的图片数。设置为 0 会停用关键帧编码,除非 force_key_frame 设置为 true。 如果省略,则解读为 8。

variable_frame_rate bool

是否启用帧速率调整功能以符合目标比特率。 如果省略,则解释为 false。

min_frame_rate uint32

如果 variable_frame_rate 已启用,允许的最低帧速率。如果省略,则解读为 10。

force_key_frame bool

如果为 true,则编码的下一帧将是一个关键帧。如果省略,则解释为 false。

quantization_params H264QuantizationParameters

允许自定义用于编码的量化参数。在进行此设置后提交的每个帧都将使用新的值。如果省略,则不会对编码器默认值进行任何更改。

H264QuantizationParameters

fuchsia.media/stream_common.fidl 中定义

自定义 h264 编码器参数,以实现宏块量化。值的范围在 0 到 51 之间,数字越小表示质量/比特率越高。虽然编码器应尽可能支持这些字段,但有些编码器可能会忽略这些字段。可以不设置此表,也可以不设置此表中的某些字段,因为编码器可以确定自己的默认值。如果无法使用指定值实现目标比特率,那么用户应该会知道生成的编码流比特率与请求的比特率不同。

序数野战类型说明
i_base uint32

关键帧量化的起始值。

i_min uint32

允许对关键帧进行量化的最小值。

i_max uint32

可用于量化关键帧的最大值。

p_base uint32

预测帧量化的起始值。

p_min uint32

可用于对预测帧进行量化的最小允许值。

p_max uint32

用于对预测帧进行量化的最大允许值。

HevcEncoderSettings

fuchsia.media/stream_common.fidl 中定义

HEVC/H265 编码器设置。

序数野战类型说明
bit_rate uint32

编码流的目标每秒比特数。如果省略,则默认为 200,000。

frame_rate uint32

编码流的目标每秒帧数。如果省略,则默认为 30。

gop_size uint32

每个关键帧的图片数。如果省略,则默认为 8。

InputAudioCapturerConfiguration

fuchsia.media/audio_capturer.fidl 中定义

用于从输入设备接收数据流的捕获器的配置。

序数野战类型说明
usage AudioCaptureUsage

Lc3EncoderSettings

fuchsia.media/stream_common.fidl 中定义

LC3 编码器的设置。包含 LC3 规范 v1.0 中规定的参数。 包含未由 PcmFormat 表示的字段。

添加了:HEAD

序数野战类型说明
nbytes uint16

用于音频帧编码的外部字节数值。 根据 LC3 规范 v1.0,每个音频通道可以具有不同的输出字节大小值,但对于 Fuchsia 用例,我们会对所有通道使用相同的 nbytes 值。

frame_duration Lc3FrameDuration

帧时长与采样率结合使用来确定帧大小。

LoopbackAudioCapturerConfiguration

fuchsia.media/audio_capturer.fidl 中定义

将接收环回流系统输出的捕获器的配置。

序数野战类型说明

MSbcEncoderSettings

fuchsia.media/stream_common.fidl 中定义

mSBC 编码器的设置。没有设置,因为 mSBC 编码器使用 HFP 规范 v1.8 要求的值。

添加了:HEAD

序数野战类型说明

fuchsia.media/stream_processor.fidl 中定义

数据包表示传入或传出流处理器的输入或输出数据块。

流处理器输出:

当数据包通过 OnOutputPacket() 向客户端发送时,流处理器将避免修改引用的输出数据。在客户端调用 RecycleOutputPacket(packet_index) 后,流处理器会通知客户端再次接受引用的数据发生变化。

流处理器输入:

客户端最初有所有 packet_index 可供填充,稍后会获取 packet_index,可以再次通过 OnFreeInputPacket() 进行填充。客户端不得修改 QueueInputPacket() 和 OnFreeInputPacket() 之间引用的数据。

序数野战类型说明
header PacketHeader
buffer_index uint32

此数据包指的是哪个缓冲区。对于单缓冲区模式,此字段始终为 0;但对于多缓冲区模式,数据包的给定传输中间隔可以引用任何缓冲区。仅当数据包正在传输中时,数据包才具有关联的缓冲区,当数据包空闲时,才具有关联的缓冲区。

默认值降低意外不当使用索引 0 的可能性(如果未填充,往往会以显而易见的方式抱怨,而不是在重复解码缓冲区 0 时而不是对正确的缓冲区进行解码时不明显的数据损坏)。

TODO(dustingreen):尝试让 FIDL 表默认值具有意义,并且在访问该字段时不要指出 !has。目前,此处指定的默认值不起任何作用。

stream_lifetime_ordinal uint64

值 1 是创建流处理器后允许的最低值。客户端发送的值必须为奇数。值只能增加。

stream_lifetime_ordinal 表示流的生命周期。特定于某个流的所有消息都具有 stream_lifetime_ordinal 值,并且该值对于与给定流相关的所有消息都相同。

start_offset uint32

此数据包使用的是相关缓冲区的哪个部分。它们适用于流向流处理器传输的输入数据,适用于来自流处理器的输出数据。

对于压缩格式和未压缩的音频,[start_offset, start_offset + valid_length_bytes) 中的数据是此数据包引用的连续有效数据。

对于未压缩的视频帧,FormatDetails 是确定哪些字节相关的主要方式。FormatDetails 中的偏移量相对于此处的 start_offset。valid_length_bytes 必须足够大,以便包含完整的最后一行像素数据,包括最后一行的整行步长(而不仅仅是最后一行的宽度(以像素为单位)。

尽管这些缓冲区已经填充,但 CPU 无法读取某些未压缩的视频缓冲区的类型。此处的这些字段并不意味着 CPU 能读取未压缩的帧。

valid_length_bytes uint32

此值必须大于 0。

每个数据包的有效数据的语义因数据类型而异,如下所示。

未压缩的视频 - 无法将视频帧拆分到多个数据包中。每个数据包都是一个视频帧。

未压缩的音频 - 无论浮点数、整数、线性或 uLaw 或声道数量,数据包都必须包含非负数量的完整音频帧,其中单个音频帧由同一时间点的所有声道的数据组成。StreamProcessor 服务器实现应该隐藏任何特定于流处理器的内部详细信息,包括 LFE 信道等的较低速率采样。

压缩数据输入 - 数据包必须包含至少一个数据字节。 另请参阅 stream_input_bytes_min。允许在任意字节边界上拆分 AU,包括在 AU 标头中的边界。

压缩数据输出 - 流处理器不需要完全填满每个输出数据包的缓冲区。

timestamp_ish uint64

这个值并非严格意义上的时间戳。它是任意无符号的 64 位数字,在某些情况下,流处理器将未经修改从输入数据包传递到恰好对应的输出数据包。

如需从输入传播到输出的 timestamp_ish 值,必须满足以下条件:

  • promise_split_access_units_on_input 必须为 true
  • 对于给定的输入数据包,has_timestamp_ish 必须为 true,才能将该时间戳值(有可能)传播到输出
  • StreamProcessor 实例本身会决定(异步)输入包生成输出包。如果给定的输入从未生成输出包,则输入上的 timestamp_ish 值永远不会在任何输出包上显示 - 具体取决于输入和输出格式的特性,以及解码器是否愿意加入流中等,这种可能性可能会增加或减少,根据时间戳显示,但从不应该将发生崩溃的程度视为发生崩溃。
start_access_unit bool

如果 promise_standalone_access_units_on_input (TODO(dustingreen): 或任何类似输出模式) 为 true,则必须根据字节 0 是还是不是访问单元的开头适当设置此布尔值。客户端必须知晓这一点,并且需要正确设置此布尔值。服务器可以推断,如果此布尔值为 false,字节 0 是之前启动的 AU 的延续的第一个字节。(start_offset 中的字节是“byte 0”。)

如果 promise_split_access_units_on_input 为 false,则忽略此布尔值。

known_end_access_unit bool

客户无需将此布尔值设为 true。

如果 promise_installed_access_units_on_input 为 true,对于输入数据,如果此数据包的最后一个字节不是 AU 的最后一个字节,此布尔值必须为 false;如果此数据包的最后一个字节是 AU 的最后一个字节,此布尔值可能为 true。如果客户端希望通过解码器尽可能缩短延迟时间,则一次传送一个 AU,如果可以将此布尔值设置为 true,则应将此布尔值设置为 true。

如果 promise_split_access_units_on_input 为 false,则忽略此布尔值。

key_frame bool

用于压缩的视频数据包。如果不存在,应假定为未知。如果为 false,则表示数据包不是关键帧的一部分。如果为 true,则表示数据包是关键帧的一部分。

PacketHeader

fuchsia.media/stream_processor.fidl 中定义

PacketHeader

在提及免费数据包时,我们只使用 PacketHeader 而不是 Packet,因为虽然数据包是可用的,但它实际上没有有意义的偏移或长度等。

填充的数据包还包含 PacketHeader。

序数野战类型说明
buffer_lifetime_ordinal uint64

这是此标头所引用的缓冲区配置生命周期。

package_index 仅对于特定的 buffer_lifetime_ordinal 才有实际意义。

请参阅 StreamBufferPartialSettings.buffer_lifetime_ordinal。

对于 QueueInputPacket(),如果服务器接收的 buffer_lifetime_ordinal 不是当前输入 buffer_lifetime_ordinal,则系统会关闭该通道。

对于 OnFreeInputPacket() 和 RecycleOutputPacket(),接收器(客户端或服务器)必须忽略包含过时 buffer_lifetime_ordinal 的消息。

packet_index uint32

整个 package_index 值集从 0..count-1 中密集打包,以用于单独输入和输出。它们可以按任意顺序加入队列。

客户端和服务器都应根据已知边界验证 packet_index,如果超出边界,则断开连接。

在单缓冲区模式下运行时,缓冲区索引始终为 0。

package_index 值并不表示任何关于数据包使用顺序的内容。客户端不应期望排序会随时间保持不变,流处理器可以自由保留输入或输出数据包一段时间,在此期间其他 packet_index 值可以被多次使用。

对于正常运行的给定 StreamProcessor 实例,pack_index 值在并发未完成的数据包中是唯一的。服务器应验证客户端没有重复使用数据包,客户端应根据需要进行验证,以避免未定义或意外的客户端行为。

StreamBufferConstraints

fuchsia.media/stream_processor.fidl 中定义

此结构体表示 buffer_constraints_version_ordinal。

过去,此表传达的字段比当前数量多,但这些字段都被废弃了,取而代之的是使用 sysmem。

此结构体有单独的实例以用于流输入和流输出。

关于字段的注意事项:

对于未压缩的视频,始终需要在单独的缓冲区(每个数据包缓冲区模式)将单独的帧和完整帧放在各自的缓冲区中。

序数野战类型说明
buffer_constraints_version_ordinal uint64

这是服务器针对限制条件设置的版本号,以允许服务器确定客户端何时达到了服务器发送的最新限制条件。在客户端配置包含 buffer_constraints_version_ordinal >= 最新 buffer_constraints_version_ordinal 且 buffer_constraints_action_required 为 true 时的输出设置和缓冲区之前,服务器不会发出输出数据。如需了解详情,请参阅 buffer_constraints_action_required 注释。

为简化初始状态处理,不得将 buffer_constraints_version_ordinal 设置为 0。除 0 外,允许使用奇数和偶数版本序数(与 stream_lifetime_ordinal 相反,客户端和服务器都没有理由将最新版本视为过时,因此禁止使用偶数值没有任何好处)。

default_settings StreamBufferSettings

已弃用 - 忽略。使用 fuchsia.sysmem.BufferCollection.SetConstraints()

per_packet_buffer_bytes_min uint32

已弃用 - 忽略。使用 fuchsia.sysmem.BufferCollection.SetConstraints()

per_packet_buffer_bytes_max uint32

已弃用 - 忽略。使用 fuchsia.sysmem.BufferCollection.SetConstraints()

packet_count_for_server_min uint32

已弃用 - 忽略。使用 fuchsia.sysmem.BufferCollection.SetConstraints()

packet_count_for_server_max uint32

已弃用 - 忽略。使用 fuchsia.sysmem.BufferCollection.SetConstraints()

packet_count_for_client_min uint32

已弃用 - 忽略。使用 fuchsia.sysmem.BufferCollection.SetConstraints()

packet_count_for_client_max uint32

已弃用 - 忽略。使用 fuchsia.sysmem.BufferCollection.SetConstraints()

single_buffer_mode_allowed bool

已弃用 - 忽略。已过时。

is_physically_contiguous_required bool

已弃用 - 忽略。使用 fuchsia.sysmem.BufferCollection.SetConstraints()

StreamBufferPartialSettings 资源

fuchsia.media/stream_processor.fidl 中定义

序数野战类型说明
buffer_lifetime_ordinal uint64

包含的消息开始一个新的 buffer_lifetime_ordinal。

输入和输出分别有一个单独的 buffer_lifetime_ordinal。

不允许重复使用相同的值。值必须为奇数。值只能增加(允许增加超过 2)。

billing_lifetime_ordinal 生命周期从 SetInputBufferSettings() 或 SetOutputBufferSettings() 开始,在设置了 release_input_buffers/release_output_buffers 的 CloseCurrentStream() 或具有新的 buffer_lifetime_ordinal(如果中流输出配置发生更改)的 SetOutputBufferSettings() 中,以较早的时间结束。

buffer_constraints_version_ordinal uint64

此值指示客户端到目前为止知道/知道哪个版本的限制条件。

对于输入,此字段必须始终为 0,因为输入的约束条件不会改变(设置可以更改,但输入不存在设置与当前限制条件的同步问题)。

对于输出,服务器可以先了解客户端何时充分捕获,然后再生成更多输出。

当没有活跃数据流时,客户端可以使用同一 buffer_constraints_version_ordinal 再次重新配置缓冲区。

single_buffer_mode bool

已弃用 - 忽略。已过时。

packet_count_for_server uint32

已弃用 - 忽略。使用 fuchsia.sysmem.BufferCollection.SetConstraints()

packet_count_for_client uint32

已弃用 - 忽略。使用 fuchsia.sysmem.BufferCollection.SetConstraints()

sysmem_token fuchsia.sysmem/BufferCollectionToken

BufferCollectionToken 通道的客户端端,StreamProcessor 将利用该通道向 sysmem 提供约束条件并了解 sysmem 分配的缓冲区。

客户端可保证 sysmem 已知晓该令牌(通过 BufferCollectionToken.Sync()、BufferCollection.Sync() 或 BufferCollectionEvents.OnDuplicatedTokensKnownByServer())。

StreamBufferSettings

fuchsia.media/stream_processor.fidl 中定义

已弃用。请改用 SetStreamBufferPartialSettings() 和 StreamBufferPartialSettings。

已弃用 - 忽略。请改用 SetStreamBufferPartialSettings。

序数野战类型说明
buffer_lifetime_ordinal uint64

已弃用 - 忽略。请改用 SetStreamBufferPartialSettings。

buffer_constraints_version_ordinal uint64

已弃用 - 忽略。请改用 SetStreamBufferPartialSettings。

packet_count_for_server uint32

已弃用 - 忽略。请改用 SetStreamBufferPartialSettings。

packet_count_for_client uint32

已弃用 - 忽略。请改用 SetStreamBufferPartialSettings。

per_packet_buffer_bytes uint32

已弃用 - 忽略。请改用 SetStreamBufferPartialSettings。

single_buffer_mode bool

已弃用 - 忽略。请改用 SetStreamBufferPartialSettings。

StreamOutputConstraints

fuchsia.media/stream_processor.fidl 中定义

流处理器控制的输出配置,包括用于输出的 StreamBufferConstraints 和用于输出的 FormatDetails。

序数野战类型说明
stream_lifetime_ordinal uint64

如果客户端始终在收到 OnOutputConstraints() 时将输出缓冲区设为 true,则始终会立即重新配置输出缓冲区,并且可放心地忽略此字段。

如果客户端知道服务器已被告知已告知服务器丢弃具有相同 stream_lifetime_ordinal 的数据流的其余部分或此 stream_lifetime_ordinal 字段设置为 0,则即使设置了 buffer_constraints_action_required,客户端也可以忽略 OnOutputConstraints() 消息。如果最新完成的服务器端输出配置还不是服务器对新数据流的需求/需求,服务器需要通过 OnOutputConstraints() 重新发送所需的输出配置(并将新 stream_lifetime_ordinal 和 buffer_constraints_action_required 设为 true)。

buffer_constraints_action_required bool

传递缓冲区限制条件时,它们会指示是否需要执行操作。此处的 false 值允许传送时效性更高的约束条件,而无需强制重新配置缓冲区。如果该值为 false,则客户端无法假定立即重新配置输出缓冲区是安全的。如果为 true,则客户端可以假定立即配置输出缓冲区一次是安全的。

客户端可以忽略具有 buffer_constraints_action_required false 的缓冲区约束版本。不允许服务器针对相同的 buffer_constraints_version_ordinal 将 buffer_constraints_action_required 从 false 更改为 true。

对于每项配置,客户端都必须使用新的缓冲区,绝不会之前用于任何其他用途的缓冲区,以及以前用于任何其他 StreamProcessor 用途的缓冲区。这条规则存在多个合理原因,与流中变化以及数据流边界的变化相关。客户端每次应该只使用新的缓冲区。

如果为 true,则服务器已经尽可能多地对低级别输出缓冲区进行去引用,同时仍会高效过渡到新缓冲区,并尽快取消引用其余缓冲区。在相关格式有效允许的范围内,无需使用 Sync() 来实现资源使用的非重叠。

如果 buffer_constraints_action_required 为 true,则服务器在客户端配置(或重新配置)输出缓冲区之前,不得传递更多输出数据。

buffer_constraints StreamBufferConstraints

StreamOutputFormat

fuchsia.media/stream_processor.fidl 中定义

序数野战类型说明
stream_lifetime_ordinal uint64

如果客户端知道服务器已被告知已告知服务器丢弃具有相同 stream_lifetime_ordinal 的数据流的其余部分,或者此 stream_lifetime_ordinal 字段设置为 0,则即使设置了 buffer_constraints_action_required 时,客户端也可以忽略 OnOutputFormat() 消息。如果最新完成的服务器端输出配置还不是服务器对新数据流的需求/需求,服务器需要通过 OnOutputConstraints() 重新发送所需的输出配置(并将新 stream_lifetime_ordinal 和 buffer_constraints_action_required 设为 true)。

服务器必须在流的第一个输出数据包之前发送 OnOutputFormat()。

format_details FormatDetails

如果 format_details.format_details_version_ordinal 发生更改,客户端应检查新格式详细信息并确定是否必须调整到新格式。服务器可以保证,如果格式发生更改,format_details.format_details_version_ordinal 就会发生更改,但更改为 format_details.format_details_version_ordinal 并不能保证格式详情实际上会发生更改。强烈建议服务器在数据流的第一个输出数据之前,不要更改 format_details.format_details_version_ordinal,除非数据流中确实发生了格式更改。不必要的中流格式更改可能会导致更简单的客户端(无需处理中流格式更改而直接关闭通道)。在此上下文中,流的第一个输出数据之前的格式更改不是“中流”,这可能有助于检测 / 设置流格式。

请注意,如果实际上在格式发生变化后并不需要重新配置输出缓冲区,我们建议(但并非必需)服务器在传达新格式详细信息的消息上设置 buffer_constraints_action_required false。简单的服务器可能只是将整个输出情形视为一件大事,并要求在输出情形任何变化时重新配置输出缓冲区。

客户端不一定会实际处理包含 buffer_constraints_action_required false 值的新 buffer_constraints,但客户端应始终跟踪最新的 format_details。

更新后的 format_details 将根据发出的输出数据包进行排序,并且适用于所有后续数据包,直到 version_ordinal 更大的下一个 format_details 为止。不打算处理中流格式更改的简单客户端仍应跟踪最近收到的 format_details,直至第一个输出数据包到达,然后锁定格式详情、处理这些格式详情,并验证从服务器收到的任何 format_details.format_details_version_ordinal 均与锁定的 format_details 项相同,直到客户端处理完流。即使是这样一个简单的客户端,也必须容忍在数据流(任何数据流 - 第一个数据流或后续数据流)开始数据输出之前多次发生 format_details.format_details_version_ordinal 更改。这样一来,流处理器就可以请求以推测性方式配置输出缓冲区和输出格式,并在服务器知道需要知晓的所有信息以充分建立初始输出格式详细信息之后,服务器可以在第一次输出数据流之前选择性地调整输出配置。这样可以简化流处理器服务器的实现,并允许聪明的流处理器服务器在输入数据之前猜测其输出配置以缩短延迟时间,同时还能在猜测结果错误时修复输出配置(包括格式详情)。

format_details.format_details_version_ordinal 实际上是否会在流式传输过程中更改是每个数据流处理器和每个数据流的详细信息,此处的注释未指定,而且在大多数情况下,还取决于格式是否会因数据流处理器的输入而发生变化。客户端使用从技术上支持中流格式更改的格式可能很常见,但客户端恰好知道客户端打算处理的所有流都不会有中流格式更改。

UsageStateDucked

fuchsia.media/usage_reporter.fidl 中定义

一种音频使用状态。在此状态下,系统已做出政策决策,暂时降低使用此音频串流的所有音频流的音量。

序数野战类型说明

UsageStateMuted

fuchsia.media/usage_reporter.fidl 中定义

一种音频使用情况状态,在此状态下,系统已做出以下决定,暂时将使用此音频的所有音频流的音量设为静音。

序数野战类型说明

UsageStateUnadjusted

fuchsia.media/usage_reporter.fidl 中定义

一种音频使用状态,在此状态下,系统不会对使用该音频的任何流执行任何政策操作。

序数野战类型说明

联合

AacBitRate 严格

fuchsia.media/stream_common.fidl 中定义

序数变体类型说明
constant AacConstantBitRate
variable AacVariableBitRate

AacTransport 灵活

fuchsia.media/stream_common.fidl 中定义

序数变体类型说明
raw AacTransportRaw
latm AacTransportLatm
adts AacTransportAdts

AudioCapturerConfiguration 严格

fuchsia.media/audio_capturer.fidl 中定义

音频捕获器的配置。

序数变体类型说明
loopback LoopbackAudioCapturerConfiguration
input InputAudioCapturerConfiguration

AudioCompressedFormat

fuchsia.media/stream_common.fidl 中定义

序数变体类型说明
aac AudioCompressedFormatAac
sbc AudioCompressedFormatSbc
cvsd AudioCompressedFormatCvsd
添加了:HEAD
lc3 AudioCompressedFormatLc3
添加了:HEAD

AudioConsumerError 严格

fuchsia.media/audio_consumer.fidl 中定义

表示 AudioConsumer 错误情况。

序数变体类型说明
place_holder Void

AudioFormat 严格

fuchsia.media/stream_common.fidl 中定义

AudioFormat

序数变体类型说明
compressed AudioCompressedFormat
uncompressed AudioUncompressedFormat

AudioUncompressedFormat 严格

fuchsia.media/stream_common.fidl 中定义

AudioUncompressedFormat

序数变体类型说明
pcm PcmFormat

CryptoFormat灵活

fuchsia.media/stream_common.fidl 中定义

CryptoFormat

加密(加密或解密)格式详细信息。

序数变体类型说明
encrypted EncryptedFormat
decrypted DecryptedFormat

DomainFormat 严格

fuchsia.media/stream_common.fidl 中定义

DomainFormat

序数变体类型说明
audio AudioFormat
video VideoFormat
crypto CryptoFormat

EncoderSettings灵活

fuchsia.media/stream_common.fidl 中定义

编码器设置,用于告诉它们如何对原始格式进行编码。

序数变体类型说明
sbc SbcEncoderSettings
aac AacEncoderSettings
h264 H264EncoderSettings
hevc HevcEncoderSettings
cvsd CvsdEncoderSettings
添加了:HEAD
lc3 Lc3EncoderSettings
添加了:HEAD
msbc MSbcEncoderSettings
添加了:HEAD

MediumSpecificStreamType 严格

fuchsia.media/stream_type.fidl 中定义

所有特定于媒介的流类型结构体的并集。

序数变体类型说明
audio AudioStreamType
video VideoStreamType
text TextStreamType
subpicture SubpictureStreamType

使用严格

fuchsia.media/audio_core.fidl 中定义

序数变体类型说明
render_usage AudioRenderUsage
capture_usage AudioCaptureUsage

UsageState 灵活

fuchsia.media/usage_reporter.fidl 中定义

对一个或一组流实施音频政策的状态。

序数变体类型说明
unadjusted UsageStateUnadjusted
ducked UsageStateDucked
muted UsageStateMuted

严格

fuchsia.media/stream_common.fidl 中定义

在通用“参数”结构体中使用的通用“value”。

序数变体类型说明
bool_value bool
uint64_value uint64
int64_value int64
string_value string
bytes_value vector<uint8>

VideoCompressedFormat 严格

fuchsia.media/stream_common.fidl 中定义

VideoCompressedFormat

压缩的视频格式详细信息。

序数变体类型说明
temp_field_todo_remove uint32

VideoFormat 严格

fuchsia.media/stream_common.fidl 中定义

VideoFormat

视频(压缩或未压缩)格式详细信息。在这种情况下,“未压缩”可包括基于块的图片压缩格式,仍允许非常快速地随机访问图片数据。

序数变体类型说明
compressed VideoCompressedFormat
uncompressed VideoUncompressedFormat

BITS

AudioConsumerStartFlags 严格

类型:uint32

fuchsia.media/audio_consumer.fidl 中定义

传递给 AudioConsumer.Start 的标志。

名称说明
1

表示应尽可能缩短延迟时间。

2

表示数据包传送时间由外部进程决定,而非基于需求。设置此标志后,由于数据包到达率和呈现速率不匹配,服务应会出现下溢或上溢。如果未设置此标志,数据包会按需到达。

AudioGainInfoFlags 严格

类型:uint32

fuchsia.media/audio_device_enumerator.fidl 中定义

名称说明
1
2
4

AudioGainValidFlags 严格

类型:uint32

fuchsia.media/audio_device_enumerator.fidl 中定义

名称说明
1
2
4

常量

名称类型说明
AUDIO_ENCODING_AAC fuchsia.media.aac String

音频编码。

AUDIO_ENCODING_AACLATM fuchsia.media.aaclatm String
AUDIO_ENCODING_AMRNB fuchsia.media.amrnb String
AUDIO_ENCODING_AMRWB fuchsia.media.amrwb String
AUDIO_ENCODING_APTX fuchsia.media.aptx String
AUDIO_ENCODING_FLAC fuchsia.media.flac String
AUDIO_ENCODING_GSMMS fuchsia.media.gsmms String
AUDIO_ENCODING_LPCM fuchsia.media.lpcm String
AUDIO_ENCODING_MP3 fuchsia.media.mp3 String
AUDIO_ENCODING_OPUS fuchsia.media.opus String
AUDIO_ENCODING_PCMALAW fuchsia.media.pcmalaw String
AUDIO_ENCODING_PCMMULAW fuchsia.media.pcmmulaw String
AUDIO_ENCODING_SBC fuchsia.media.sbc String
AUDIO_ENCODING_VORBIS fuchsia.media.vorbis String
CAPTURE_USAGE_COUNT 4 uint8
ENCRYPTION_SCHEME_CBC1 cbc1 String
ENCRYPTION_SCHEME_CBCS cbcs String
ENCRYPTION_SCHEME_CENC cenc String
ENCRYPTION_SCHEME_CENS cens String
ENCRYPTION_SCHEME_UNENCRYPTED unencrypted String
MAX_ENCRYPTION_SCHEME_SIZE 100 uint32
MAX_FRAMES_PER_RENDERER_PACKET 262143 int64

单个 StreamPacket 中可以包含的帧数上限。

MAX_INIT_VECTOR_SIZE 16 uint32
MAX_KEY_ID_SIZE 16 uint32
MAX_PCM_CHANNEL_COUNT 8 uint32
MAX_PCM_FRAMES_PER_SECOND 192000 uint32
METADATA_LABEL_ALBUM fuchsia.media.album String
METADATA_LABEL_ARTIST fuchsia.media.artist String
METADATA_LABEL_COMPOSER fuchsia.media.composer String
METADATA_LABEL_EPISODE fuchsia.media.episode String
METADATA_LABEL_GENRE fuchsia.media.genre String
METADATA_LABEL_PUBLISHER fuchsia.media.publisher String
METADATA_LABEL_RELEASE_DATE fuchsia.media.release_date String
METADATA_LABEL_SEASON fuchsia.media.season String
METADATA_LABEL_STUDIO fuchsia.media.studio String
METADATA_LABEL_SUBTITLE fuchsia.media.subtitle String
METADATA_LABEL_TITLE fuchsia.media.title String
METADATA_LABEL_TRACK_NUMBER fuchsia.media.track_number String
METADATA_SOURCE_TITLE fuchsia.media.source_title String

媒体来源(例如播放器、在线媒体服务或网站)的标题。

MIN_PCM_CHANNEL_COUNT 1 uint32

AudioRenderer 和 AudioCapturer 的允许范围

MIN_PCM_FRAMES_PER_SECOND 1000 uint32
NO_TIMESTAMP 9223372036854775807 int64

当用作 StreamPacket.pts 值时,表示数据包没有特定的呈现时间戳。此类数据包的有效呈现时间取决于使用 StreamPacket 的上下文。

RENDER_USAGE_COUNT 5 uint8
STREAM_PACKET_FLAG_DISCONTINUITY 4 uint32

表示其他按时间顺序的数据包序列中的不连续性。此标志的精确语义取决于使用 StreamPacket 的上下文。

STREAM_PACKET_FLAG_DROPPABLE 2 uint32

表示不引用该数据包,该数据流中的所有其他数据包都可以理解。这通常在压缩的流中用于识别包含哪些帧的数据包,这些帧可能会被舍弃,而不会影响其他帧。

STREAM_PACKET_FLAG_KEY_FRAME 1 uint32

表示数据包无需考虑数据流中的其他数据包即可理解。这通常在压缩的流中用于识别包含关键帧的数据包。

VIDEO_ENCODING_H263 fuchsia.media.h263 String

视频编码。

VIDEO_ENCODING_H264 fuchsia.media.h264 String
VIDEO_ENCODING_MPEG4 fuchsia.media.mpeg4 String
VIDEO_ENCODING_THEORA fuchsia.media.theora String
VIDEO_ENCODING_UNCOMPRESSED fuchsia.media.uncompressed_video String
VIDEO_ENCODING_VP3 fuchsia.media.vp3 String
VIDEO_ENCODING_VP8 fuchsia.media.vp8 String
VIDEO_ENCODING_VP9 fuchsia.media.vp9 String
kMaxOobBytesSize 8192 uint64

别名

名称说明
CompressionType string[256]

压缩类型的标识符。

EncryptionScheme string[MAX_ENCRYPTION_SCHEME_SIZE]
InitVector vector[MAX_INIT_VECTOR_SIZE]
KeyId vector[MAX_KEY_ID_SIZE]