View a markdown version of this page

Kinesis 视频流数据模型 - Amazon Kinesis Video Streams

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Kinesis 视频流数据模型

上传到 Kinesis Video Streams使用解析器库观看摄像机的输出 以某种格式发送和接收视频数据,此格式支持随视频数据一起嵌入信息。此格式基于 Matroska (MKV) 规范。

MKV 格式是适用于媒体数据的开放规范。亚马逊 Kinesis Video Streams 开发者指南中的所有库和代码示例均以 MKV 格式发送或接收数据。

上传到 Kinesis Video Streams使用StreamDefinitionFrame类型生成 MKV 流标头、帧头和帧数据。

有关完整 MKV 规范的信息,请参阅 Matroska 规范

以下各节描述了生成的 MKV-formatted 数据的组成部分C++

流标头元素

StreamDefinition 使用以下 MKV 标头元素 (在 StreamDefinition.h 中定义)。

Element 说明 典型值
stream_name 对应于 Kinesis 视频流的名称。 my-stream
retention_period 流媒体数据由 Kinesis Video Streams 保存的时长(以小时为单位)。0指定不保留数据的直播。 24
tags 用户数据的键-值集合。此数据显示在 AWS 管理控制台 中,可由客户端应用程序读取以筛选或获取有关流的信息。
kms_key_id 如果存在,则使用用户定义的 AWS KMS 密钥对流中的数据进行加密。如果不存在,则使用 Kinesis-supplied 密钥 (aws/kinesisvideo) 对数据进行加密。 01234567-89ab-cdef-0123-456789ab
streaming_type 目前,唯一有效的流式处理类型是 STREAMING_TYPE_REALTIME STREAMING_TYPE_REALTIME
content_type 用户定义的内容类型。对于要在控制台中播放的流视频数据,内容类型必须为 video/h264 video/h264
max_latency 该值当前未使用,应设置为 0。 0
fragment_duration 这是对片段应持续时间的估计,用于优化。实际的片段持续时间由流数据决定。 2
timecode_scale

表示帧时间戳使用的比例。默认为 1 毫秒。指定 0 还将分配 1 毫秒的默认值。此值可以介于 100 纳秒到 1 秒之间。

有关更多信息,请参阅 Matroska 文档TimecodeScale中的内容。

key_frame_fragmentation 如果为 true,则流在收到关键帧时将启动一个新集群。 true
frame_timecodes 如果是true,Kinesis Video Streams 使用接收到帧的演示时间戳 (pts) 和解码时间戳 (dts) 值。如果是false,Kinesis Video Streams 会在收到帧时使用系统生成的时间值标记帧。 true
absolute_fragment_time 如果为 true,则集群时间码将解释为使用绝对时间 (例如,来自创建者的系统时钟)。如果为 false,则集群时间码将解释为相对于流的开始时间。 true
fragment_acks 如果是true,则在 Kinesis Video Streams 收到数据时发送确认 (ACK)。可使用 KinesisVideoStreamFragmentAckKinesisVideoStreamParseFragmentAck 回调接收确认。 true
restart_on_error 指示在发生流错误后是否应继续传输流。 true
nal_adaptation_flags 指示内容中是否有 NAL (网络抽象层) 改编或编解码器私有数据。有效标记包括 NAL_ADAPTATION_ANNEXB_NALSNAL_ADAPTATION_ANNEXB_CPD_NALS NAL_ADAPTATION_ANNEXB_NALS
frame_rate 内容帧速率的估计值。此值用于优化;实际帧速率由传入数据的速率决定。指定 0 将分配默认值 24 24
avg_bandwidth_bps 内容带宽的估计值,以 Mbps 为单位。此值用于优化;实际速率由传入数据的带宽决定。例如,对于按 25 FPS 运行的 720p 分辨率视频流,您可预计平均带宽为 5 Mbps。 5
buffer_duration 要在创建者中缓冲的内容的持续时间。如果网络延迟较低,则可以降低该值。如果网络延迟很高,则增加该值可防止由于分配无法将帧放入较小的缓冲区而导致帧在发送之前丢弃。
replay_duration 连接中断时视频数据流 “倒带” 的时间量。如果不考虑因连接丢失而导致的帧丢失,则此值可以为零。如果消费应用程序可以删除冗余框架,则可以增加该值。该值应小于缓冲持续时间,否则使用缓冲持续时间。
connection_staleness 在未收到数据时保持连接的持续时间。
codec_id 内容使用的编解码器。有关更多信息,请参阅 Matroska 规范中的 CodecID V_MPEG2
track_name 用户定义的音轨名称。 my_track
编解码器 PrivateData 编码器提供的数据,用于对许多下游使用者所需的帧数据(例如,以像素表示的帧宽度和高度)进行解码。在 C++ 制作者库中,中的gMkvTrackVideoBits数组MkvStatics.cpp包括框架的像素宽度和高度。
编解码器 PrivateDataSize codecPrivateData 参数中数据的大小。
track_type 流的轨道的类型。 MKV_TRACK_INFO_TYPE_AUDIOMKV_TRACK_INFO_TYPE_VIDEO
segment_uuid User-defined 分段 uuid(16 字节)。
default_track_id 轨道的唯一非零编号。 1

流式传输轨道数据

StreamDefinition 使用以下 MKV 轨道元素(在 StreamDefinition.h 中定义)。

Element 说明 典型值
track_name User-defined 曲目名称。例如,“audio”代表音轨。 audio
codec_id 轨道的编解码器 ID。例如,“A_AAC”代表音轨。 A_AAC
cpd 编码器提供的数据用于对帧数据进行解码。帧数据可以包括帧的像素宽度和高度,许多下游使用者都需要帧数据。在 C++ 制作者库中,中的 g MkvTrackVideoBits 数组 MkvStatics.cpp 包括框架的像素宽度和高度。
cpd_size 编解码器PrivateData 参数中数据的大小。
track_type 轨道的类型。例如,您可以对音频使用 MKV_TRACK_INFO_TYPE_AUDIO 的枚举值。 MKV_TRACK_INFO_TYPE_AUDIO

帧头元素

Frame (在 mkvgen/Include.h 中的 KinesisVideoPic 程序包中定义) 将使用以下 MKV 标头:

  • Frame Index:一个单调递增的值。

  • Flags:帧的类型。有效值包括:

    • FRAME_FLAGS_NONE

    • FRAME_FLAG_KEY_FRAME:如果在流上设置 key_frame_fragmentation,关键帧将启动新的片段。

    • FRAME_FLAG_DISCARDABLE_FRAME:告知解码器可在解码速度较慢时放弃此帧。

    • FRAME_FLAG_INVISIBLE_FRAME:此数据块的持续时间为 0。

  • 解码时间戳:解码此帧时的时间戳。如果先前的帧依赖此帧进行解码,则此时间戳可能早于较早帧的时间戳。该值相对于片段的开头。

  • 演示时间戳:显示此帧时的时间戳。该值相对于片段的开头。

  • Duration:帧的播放持续时间。

  • Size:帧数据的大小 (以字节为单位)

MKV 帧数据

frame.frameData 中的数据可能仅包含帧的媒体数据,或可能包含进一步嵌套的标头信息,具体取决于使用的编码架构。要在中显示 AWS 管理控制台,必须在编H.264解码器中对数据进行编码,但是 Kinesis Video Streams 可以接收任何格式的时间序列化数据流。