

终止支持通知：2026 年 5 月 31 日， AWS 将终止对的支持。 AWS Panorama 2026 年 5 月 31 日之后，您将无法再访问 AWS Panorama 控制台或 AWS Panorama 资源。有关更多信息，请参阅[AWS Panorama 终止支持](https://docs.aws.amazon.com/panorama/latest/dev/panorama-end-of-support.html)。

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

# 应用程序节点
<a name="applications-nodes"></a>

节点包括模型、代码、相机流、输出和参数。节点有一个接口，用于定义其输入和输出。该接口可以在您账户中的程序包、AWS Panorama 提供的程序包或内置类型中定义。

在以下示例中，`code_node` 和 `model_node` 引用示例应用程序附带的示例代码和模型包。`camera_node` 使用 AWS Panorama 提供的软件包为您在部署期间指定的相机流创建占位符。

**Example graph.json - 节点**  

```
        "nodes": [
            {
                "name": "code_node",
                "interface": "123456789012::SAMPLE_CODE.interface"
            },
            {
                "name": "model_node",
                "interface": "123456789012::SQUEEZENET_PYTORCH_V1.interface"
            },
            {
                "name": "camera_node",
                "interface": "panorama::abstract_rtsp_media_source.rtsp_v1_interface",
                "overridable": true,
                "overrideMandatory": true,
                "decorator": {
                    "title": "IP camera",
                    "description": "Choose a camera stream."
                }
            }
      ]
```

## Edges
<a name="applications-manifest-edges"></a>

边缘将一个节点的输出映射到另一个节点的输入。在以下示例中，第一个边缘将相机流节点的输出映射到应用程序代码节点的输入。名称 `video_in` 和 `video_out` 在节点包的接口中定义。

**Example graph.json – 边缘**  

```
        "edges": [
            {
                "producer": "camera_node.video_out",
                "consumer": "code_node.video_in"
            },
            {
                "producer": "code_node.video_out",
                "consumer": "output_node.video_in"
            },
```

 在应用程序代码中，使用 `inputs` 和 `outputs` 属性从输入流中获取图像，并将图像发送到输出流。

**Example application.py – 视频输入和输出**  

```
    def process_streams(self):
        """Processes one frame of video from one or more video streams."""
        frame_start = time.time()
        self.frame_num += 1
        logger.debug(self.frame_num)
        # Loop through attached video streams
        streams = self.inputs.video_in.get()
        for stream in streams:
            self.process_media(stream)
        ...
        self.outputs.video_out.put(streams)
```

## 抽象节点
<a name="applications-manifest-abstract"></a>

在应用程序清单中，抽象节点是指由 AWS Panorama 定义的程序包，您可以将其用作应用程序清单中的占位符。AWS Panorama 提供两种类型的抽象节点。

****
+ **相机流** – 选择应用程序在部署期间使用的相机流。

  *软件包名称* – `panorama::abstract_rtsp_media_source`

  *接口名称* – `rtsp_v1_interface`
+ **HDMI 输出** – 指示应用程序输出视频。

  *软件包名称* – `panorama::hdmi_data_sink`

  *接口名称* – `hdmi0`

以下示例显示了一组基本的包、节点和边缘，用于处理相机流并将视频输出到显示器的应用程序。相机节点使用 AWS Panorama 中 `abstract_rtsp_media_source` 包的接口，可以接受多个相机流作为输入。引用 `hdmi_data_sink` 的输出节点允许应用程序代码访问从设备的 HDMI 端口输出的视频缓冲区。

**Example graph.json – 抽象节点**  

```
{
    "nodeGraph": {
        "envelopeVersion": "2021-01-01",
        "packages": [
            {
                "name": "123456789012::SAMPLE_CODE",
                "version": "1.0"
            },
            {
                "name": "123456789012::SQUEEZENET_PYTORCH_V1",
                "version": "1.0"
            },
            {
                "name": "panorama::abstract_rtsp_media_source",
                "version": "1.0"
            },
            {
                "name": "panorama::hdmi_data_sink",
                "version": "1.0"
            }
        ],
        "nodes": [
            {
                "name": "camera_node",
                "interface": "panorama::abstract_rtsp_media_source.rtsp_v1_interface",
                "overridable": true,
                "decorator": {
                    "title": "IP camera",
                    "description": "Choose a camera stream."
                }
            },
            {
                "name": "output_node",
                "interface": "panorama::hdmi_data_sink.hdmi0"
            }
        ],
        "edges": [
            {
                "producer": "camera_node.video_out",
                "consumer": "code_node.video_in"
            },
            {
                "producer": "code_node.video_out",
                "consumer": "output_node.video_in"
            }
        ]
    }
}
```