播放 Kinesis 视频流中的媒体 - Amazon Kinesis Video Streams
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

播放 Kinesis 视频流中的媒体

打开 Kinesis Video St reams 控制台,然后为你创建的直播选择直播名称。

将在控制台中显示从 Raspberry Pi 发送的视频流。

注意

视频可能需要几秒钟才能显示在控制台中。

直播开始播放后,你可以在控制台中尝试以下功能:

  • Video preview (视频预览) 部分中,使用导航控件后退和快进流。

  • 直播信息部分,查看直播的编解码器、分辨率和比特率。Raspberry Pi 上的分辨率和比特率值被故意设置为较低,以最大限度地减少本教程的带宽使用量。

    要查看正在为您的直播创建的 Amazon CloudWatch 指标,请在中选择查看直播指标 CloudWatch

  • Data retention period (数据保留期) 下面,可以看到视频流保留 1 天。您可以编辑该值并将其设置为 No data retention (不保留数据),或者设置 1 天到几年之间的值。

  • 在 “服务器端加密” 下,请注意,您的数据是使用 Amazon Key Management Service (Amazon KMS) 维护的密钥进行静态加密的。

播放问题

以下是一些经常遇到的播放问题以及如何解决这些问题。

没有媒体,但日志中有 PERSITED Ack

如果你在日志中看到 PERSISTED Acks,则表示 Kinesis Video Streams 已成功摄取并存储了上传的媒体。kvssink从 Kinesis Video Streams 收到的 acks 看起来像这样。在 JSON 中,查看"EventType"密钥的值。

{"EventType":"RECEIVED","FragmentTimecode":252200,"FragmentNumber":"12345678901234567890123456724587702494771079511"} {"EventType":"BUFFERING","FragmentTimecode":252467,"FragmentNumber":"12345678901234567890123456781729223736853277017"} {"EventType":"RECEIVED","FragmentTimecode":252467,"FragmentNumber":"12345678901234567890123456781729223736853277017"} {"EventType":"BUFFERING","FragmentTimecode":253000,"FragmentNumber":"12345678901234567890123456738870744847093249408"} {"EventType":"PERSISTED","FragmentTimecode":252200,"FragmentNumber":"12345678901234567890123456724587702494771079511"} {"EventType":"PERSISTED","FragmentTimecode":252467,"FragmentNumber":"1234567890123456789012345671729223736853277017"}

解决方案:

在 Kinesis Video Streams 控制台中等待一两分钟,然后使用双右箭头。如果未显示任何媒体,请确认您的直播已发送到正确的区域,并检查直播名称的拼写。你可以在日志中找到这些信息。

提供一个区域给 kvssink有关 kvssink 如何确定要使用哪个区域的更多信息,请参阅。

媒体需要很长时间才能加载到 Amazon Web Services Management Console

重要

主机播放体验与 HLS 和 DASH 的播放体验不同。也可以使用中的示例媒体播放器托管的网页 GitHub 来测试播放。该网页的源代码可以在这里找到。

由于网络带宽差或设备受限,控制台中的媒体加载速度可能很慢,但也可能与视频编码和分段有关。

视频编码基础知识:

  • H.264 和 H.265 编码器使用关键帧(I 帧)和预测帧(P 帧)来实现高效压缩。

  • 关键帧包含完整的图像数据,而 P 帧仅包含与之前帧相比的更改。

  • “关键帧间隔” 决定了关键帧在视频流中出现的频率。

直播中的碎片:

  • 在 Kinesis Video Streams 中,新的片段从每个关键帧开始。有关更多信息,请参阅 Kinesis Video Streams 数据模型

  • 片段长度(以秒为单位)可以估计为:关键帧间隔 ^帧速

    示例

    对于关键帧间隔为 30、帧速为 15 fps 的直播:

    片段长度 = 30 ε 15 = 2 秒

由于键帧间隔较大,较长的片段会增加流媒体的延迟。

解决方案:

要缩短加载时间,请考虑缩短关键帧间隔。这将创建更短的片段,从而减少延迟,但也会增加视频文件的大小。

对于x264enc GStreamer 元素,您可以通过属性显式设置关键帧间隔:key-int-max

x264enc bframes=0 key-int-max=60

查看日志输出时,请注意上传客户端 ACKs从 Kinesis Video Streams 接收日志的频率。生成的关键帧越多,返回的关键帧 ACKs 就越多。

媒体失真或有伪影

要解决此问题,请确保所有电缆都连接紧密。查看相机模块的输出libcamera-hello(或raspistill传统的 Pi 相机)。

在您的 GStreamer 管道中,kvssink使用autovideosinkmatroskamux和替换filesink。例如:

... x264enc tune=zerolatency speed-preset=ultrafast bframes=0 key-int-max=60 byte-stream=true ! h264parse ! matroskamux ! filesink location=output.mkv

查看使用时打开的媒体播放器的输出文件autovideosink,看看是否还有伪影。filesink

另请查看以下管道的输出:

gst-launch-1.0 autovideosrc ! videoconvert ! autovideosink

在管道中添加元素(例如 dewarp)可以校正 fish eye 相机的输出。

查看相机支持的输出编解码器,并根据需要调整元素。

例如,如果您的 USB 摄像头仅支持 JPEG 输出,则需要使用jpegparsejpegdec元素来转换媒体,然后再使用将其编码为 H.264。x264enc在 GStreamer 论坛上搜索其他具有类似管道和/或网络摄像头设置的用户的帮助。