

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

# 播放 Kinesis 视频流中的媒体
<a name="producersdk-cpp-rpi-playback"></a>

打开 [Kinesis Video St](https://console.aws.amazon.com//kinesisvideo/home/) **reams 控制台，**然后为你创建的直播选择直播名称。

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

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

直播开始播放后，你可以在控制台中尝试以下功能：
+ 在 **Video preview** (视频预览) 部分中，使用导航控件后退和快进流。
+ 在**直播信息**部分，查看直播的编解码器、分辨率和比特率。Raspberry Pi 上的分辨率和比特率值被故意设置为较低，以最大限度地减少本教程的带宽使用量。

  要查看正在为您的直播创建的 Amazon CloudWatch 指标，请在中选择**查看直播指标 CloudWatch**。
+ 在 **Data retention period** (数据保留期) 下面，可以看到视频流保留 1 天。您可以编辑该值并将其设置为 **No data retention** (不保留数据)，或者设置 1 天到几年之间的值。
+ 在**服务器端加密**下，请注意，您的数据是使用由 AWS Key Management Service (AWS KMS) 维护的密钥进行静态加密的。

## 播放问题
<a name="rpi-troubleshoot-playback"></a>

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

### 没有媒体，但日志中有 PERSITED Ack
<a name="rpi-troubleshoot-no-media"></a>

如果你在日志中看到 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`](examples-gstreamer-plugin-parameters.md#kvssink-region)有关 kvssink 如何确定要使用哪个区域的更多信息，请参阅。

### 媒体需要很长时间才能加载到 AWS 管理控制台
<a name="rpi-troubleshoot-load-time"></a>

**重要**  
主机播放体验与 HLS 和 DASH 的播放体验不同。也可以使用中的示例媒体播放器[托管的网页](https://aws-samples.github.io/amazon-kinesis-video-streams-media-viewer/) GitHub 来测试播放。该网页的源代码可以[在这里](https://github.com/aws-samples/amazon-kinesis-video-streams-media-viewer)找到。

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

**视频编码基础知识：**
+ H.264 和 H.265 编码器使用关键帧（I 帧）和预测帧（P 帧）来实现高效压缩。
+ 关键帧包含完整的图像数据，而 P 帧仅包含与之前帧相比的更改。
+ “关键帧间隔” 决定了关键帧在视频流中出现的频率。

**直播中的碎片：**
+ 在 Kinesis Video Streams 中，新的片段从每个关键帧开始。有关更多信息，请参阅 [Kinesis Video Streams 数据模型](how-data.md)。
+ *片段长度（以秒为单位）可以估计为：*关键帧间隔 ^帧速*率*

  **示例**：

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

  片段长度 = 30 ε 15 = 2 秒

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

**解决方法：**

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

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

```
x264enc bframes=0 key-int-max=60
```

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

### 媒体失真或有伪影
<a name="rpi-troubleshoot-distortion"></a>

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

在您的 GStreamer 管道中，`kvssink`使用`autovideosink`或`matroskamux`和替换`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](https://gstreamer.freedesktop.org/documentation/opencv/dewarp.html?gi-language=c)）可以校正 fish eye 相机的输出。

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

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