

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Raspberry Pi에서 C\$1\$1 생산자 SDK 사용
<a name="producersdk-cpp-rpi"></a>

Raspberry Pi는 기본 컴퓨터 프로그래밍 기술을 가르치고 학습하는 데 사용할 수 있는 저렴한 소형 컴퓨터입니다. 이 자습서에서는 Raspberry Pi 디바이스에서 Amazon Kinesis Video Streams C\$1\$1 생산자 SDK를 설정하고 사용하는 방법을 설명합니다. 또한 이러한 단계에는 GStreamer 데모 애플리케이션을 사용하여 설치를 확인하는 방법도 포함되어 있습니다.

**Topics**
+ [사전 조건](producersdk-cpp-rpi-prerequisites.md)
+ [Kinesis Video Streams에 쓸 수 있는 권한이 있는 IAM 사용자 생성](producersdk-cpp-rpi-iam.md)
+ [Raspberry Pi를 Wi-Fi 네트워크에 조인](producersdk-cpp-rpi-wifi.md)
+ [Raspberry Pi에 원격으로 연결](producersdk-cpp-rpi-connect.md)
+ [Raspberry Pi 카메라 구성](producersdk-cpp-rpi-camera.md)
+ [소프트웨어 사전 조건 설치](producersdk-cpp-rpi-software.md)
+ [Kinesis Video Streams C\$1\$1 생산자 SDK 다운로드 및 빌드](producersdk-cpp-rpi-download.md)
+ [Kinesis 비디오 스트림으로 비디오 스트리밍](producersdk-cpp-rpi-run.md)
+ [Kinesis 비디오 스트림에서 미디어 재생](producersdk-cpp-rpi-playback.md)
+ [C\$1\$1 생산자 SDK for Raspberry Pi의 빌드 문제 해결](troubleshoot-rpi.md)

# 사전 조건
<a name="producersdk-cpp-rpi-prerequisites"></a>

Raspberry Pi에서 C\$1\$1 생산자 SDK를 설정하기 전에 다음 사전 요구 사항이 있는지 확인합니다.
+ 다음과 같이 구성된 Raspberry Pi 디바이스:
  + 보드 버전: 3 모델 B 이상
  + 연결된 [카메라 모듈](https://www.raspberrypi.com/documentation/accessories/camera.html) 또는 연결된 USB 카메라(웹캠).
  + 8GB 이상의 용량이 남아 있는 SD 카드
  + 설치된 Raspbian 운영 체제(커널 버전 4.9 이상) Raspberry Pi [웹 사이트에서 최신 Raspberry Pi OS(이전에는 Raspbian](https://www.raspberrypi.com/software/)이라고 함) 이미지를 다운로드할 수 있습니다. Raspberry Pi 지침에 따라 [다운로드한 이미지를 SD 카드에 설치](https://www.raspberrypi.com/documentation/computers/getting-started.html#install-an-operating-system)합니다.
+ Kinesis 비디오 스트림이 AWS 계정 있는 . 자세한 내용은 [Kinesis 비디오 스트림 시작하기](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/getting-started.html)를 참조하십시오.

# Kinesis Video Streams에 쓸 수 있는 권한이 있는 IAM 사용자 생성
<a name="producersdk-cpp-rpi-iam"></a>

아직 설정하지 않은 경우 Kinesis 비디오 스트림에 쓸 수 있는 권한이 있는 AWS Identity and Access Management (IAM) 사용자를 설정합니다.

이 절차는 AWS 액세스 키 페어 사용을 빠르게 시작하는 데 도움이 됩니다. 디바이스는 X.509 인증서를 사용하여 연결할 수 있습니다 AWS IoT. 인증서 기반 인증을 사용하도록 디바이스를 구성하는 방법에 대한 자세한 내용은 [를 사용하여 Kinesis Video Streams 리소스에 대한 액세스 제어 AWS IoT](how-iot.md) 섹션을 참조하세요.

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) IAM 콘솔을 엽니다.

1. 왼쪽 탐색 메뉴에서 **사용자**를 클릭합니다.

1. 새 사용자를 생성하려면 **사용자 추가**를 선택합니다.

1. 사용자에 설명적 **사용자 이름**을 지정합니다(예: **kinesis-video-raspberry-pi-producer**).

1. **액세스 유형**에서 **프로그래밍 방식 액세스**를 선택합니다.

1. **다음: 권한**을 선택합니다.

1. **kinesis-video-raspberry-pi-producer에 대한 권한 설정**에서 **기존 정책 직접 연결**을 선택합니다.

1. **정책 생성**을 선택합니다. 새 웹 브라우저 탭에서 **정책 생성** 페이지가 열립니다.

1. **JSON** 탭을 선택합니다.

1. 다음 JSON 정책을 복사해 텍스트 영역에 붙여 넣습니다. 이 정책은 사용자에게 Kinesis 비디오 스트림에 데이터를 생성하고 쓸 수 있는 권한을 부여합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [{
       "Effect": "Allow",
         "Action": [
         "kinesisvideo:DescribeStream",
         "kinesisvideo:CreateStream",
         "kinesisvideo:GetDataEndpoint",
         "kinesisvideo:PutMedia"
       ],
       "Resource": [
         "*"
       ]
     }]
   }
   ```

------

1. **정책 검토**를 선택합니다.

1. 정책에 **이름**을 지정합니다(예: **kinesis-video-stream-write-policy**).

1. **정책 생성**을 선택합니다.

1. 브라우저에서**사용자 추가** 탭으로 돌아가서 **새로 고침**을 선택합니다.

1. 검색 상자에 생성한 정책 이름을 입력합니다.

1. 목록에서 새 정책 옆의 확인란을 선택합니다.

1. **다음: 검토**를 선택합니다.

1. **사용자 생성**을 선택합니다.

1. 콘솔에 새 사용자의 **액세스 키 ID**가 표시됩니다. **표시**를 선택해 **보안 액세스 키**를 표시합니다. 애플리케이션을 구성할 때 필요하므로 이러한 값을 기록해 둡니다.

# Raspberry Pi를 Wi-Fi 네트워크에 조인
<a name="producersdk-cpp-rpi-wifi"></a>

연결된 모니터와 키보드를 사용하는 경우에는 [Raspberry Pi 카메라 구성](producersdk-cpp-rpi-camera.md).

이 지침은 *헤드리스* 모드에서, 즉 연결된 키보드, 모니터 또는 네트워크 케이블 없이 실행할 때 Raspberry Pi를 설정하는 데 도움이 되도록 작성되었습니다. 아래 지침에 따라 지정된 네트워크에 자동으로 연결을 시도하도록 Raspberry Pi를 구성하여 호스트 시스템이 SSH로 연결할 수 있도록 합니다.

1. 컴퓨터에서 `wpa_supplicant.conf`라는 이름의 파일을 하나 만듭니다.

1. 다음 텍스트를 복사하여 `wpa_supplicant.conf` 파일에 붙여 넣습니다.

   ```
   country=US
   ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
   update_config=1
   
   network={
   ssid="Your Wi-Fi SSID"
   scan_ssid=1
   key_mgmt=WPA-PSK
   psk="Your Wi-Fi Password"
   }
   ```

   Wi-Fi 네트워크에 대한 정보로 `ssid` 및 `psk` 값을 바꿉니다.

1. `wpa_supplicant.conf` 파일을 SD 카드로 복사합니다. `boot` 볼륨의 루트에 복사해야 합니다.

1. SD 카드를 Raspberry Pi에 삽입하고 디바이스의 전원을 켭니다. 그러면 디바이스가 Wi-Fi 네트워크에 연결되고 SSH가 활성화됩니다.

# Raspberry Pi에 원격으로 연결
<a name="producersdk-cpp-rpi-connect"></a>

연결된 모니터와 키보드를 사용하는 경우에는 [Raspberry Pi 카메라 구성](producersdk-cpp-rpi-camera.md).

이 지침은 *헤드리스* 모드에서, 즉 연결된 키보드, 모니터 또는 네트워크 케이블 없이 실행할 때 Raspberry Pi를 설정하는 데 도움이 되도록 작성되었습니다. 아래 지침에 따라 네트워크에서 Raspberry Pi를 찾고 호스트 시스템에서 SSH를 찾습니다.

1. Raspberry Pi 디바이스에 원격으로 연결하기 전에 다음 중 하나를 수행하여 이 디바이스의 IP 주소를 확인합니다.
   + 네트워크의 Wi-Fi 라우터에 액세스할 수 있는 경우 연결된 Wi-Fi 디바이스를 찾습니다. `Raspberry Pi`라는 디바이스를 찾아 디바이스의 IP 주소를 확인합니다.
   + 네트워크의 Wi-Fi 라우터에 액세스할 수 없는 경우에는 다른 소프트웨어를 사용하여 네트워크의 디바이스를 찾을 수 있습니다. [Fing](https://www.fing.com/)은 Android 및 iOS 디바이스에서 사용할 수 있는 널리 사용되는 애플리케이션입니다. 이 애플리케이션의 무료 버전을 사용하여 네트워크에 있는 디바이스의 IP 주소를 찾을 수 있습니다.

1. Raspberry Pi 디바이스의 IP 주소를 알고 있는 경우에는 임의의 터미널 애플리케이션을 사용해 연결할 수 있습니다.
   + macOS 또는 Linux에서는 `ssh`를 사용합니다.

     ```
     ssh pi@<IP address>
     ```
   + Windows에서는 Windows용 무료 SSH 클라이언트인 [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)를 사용합니다.

   Raspbian을 새로 설치할 경우 사용자 이름은 **pi**이고 암호는 **raspberry**입니다. [기본 암호를 변경하는 것이 좋습니다](https://www.raspberrypi.com/documentation/computers/configuration.html#change-user-password-nonint).

# Raspberry Pi 카메라 구성
<a name="producersdk-cpp-rpi-camera"></a>

다음 단계에 따라 디바이스에서 Kinesis 비디오 스트림으로 비디오를 전송하도록 [Raspberry Pi 카메라 모듈을](https://www.raspberrypi.com/documentation/accessories/camera.html) 구성합니다.

**참고**  
USB 웹캠을 사용하는 경우 로 건너뜁니다[소프트웨어 사전 조건 설치](producersdk-cpp-rpi-software.md).

------
#### [ Camera module 1 ]

다음 지침에 따라 모듈 파일을 업데이트하고, 카메라 인터페이스를 활성화하고, 카메라의 기능을 확인합니다. 모듈 파일을 업데이트하면 Raspberry Pi에 부팅 시 로드할 커널 모듈을 알려줍니다. 카메라를 사용하지 않는 Raspberry Pi 디바이스의 시스템 리소스를 절약하기 위해 카메라 드라이버가 기본적으로 로드되지 않습니다.

1.  편집기를 열어 모듈 파일을 변경합니다. 터미널을 열고 다음 명령을 사용하여 `nano` 편집기를 사용하여 파일을 편집합니다.

   ```
   sudo nano /etc/modules
   ```

1. 없는 경우 이 파일의 끝에 다음 행을 추가합니다.

   ```
   bcm2835-v4l2
   ```

1. 파일을 저장하고 편집기를 종료합니다. `nano` 편집기를 사용하여 저장하고 종료하려면 Ctrl\$1X를 사용합니다.

1. Raspberry Pi를 재부팅합니다.

   ```
   sudo reboot
   ```

1. 원격으로 연결되어 있는 경우 디바이스가 재부팅되면 터미널 애플리케이션을 통해 다시 연결합니다.

1. Open `raspi-config`:

   ```
   sudo raspi-config
   ```

1. **인터페이스 옵션**, **레거시 카메라를** 선택합니다. Raspbian 운영 체제의 이전 빌드에서는이 메뉴 옵션이 **인터페이스 옵션**, **카메라** 아래에 있을 수 있습니다.

   아직 활성화되지 않은 경우 카메라를 활성화하고 메시지가 표시되면 재부팅합니다.

1. 다음 명령을 입력하여 카메라가 작동하는지 확인합니다.

   ```
   raspistill -v -o test.jpg
   ```

   카메라가 올바르게 구성된 경우이 명령은 카메라에서 이미지를 캡처하여 라는 파일에 저장`test.jpg`하고 정보 메시지를 표시합니다.

------
#### [ Camera module 2 or 3 ]

카메라 모듈 2를 사용하는 경우 `bcm2835-v4l2` (레거시) 또는 `libcamera` (현대)를 사용합니다. 그러나 지원 및 기능을 개선하려면 `libcamera` 스택을 사용하는 것이 좋습니다. 아래 단계에 따라가 시스템에서 up-to-date `libcamera` 상태인지 확인합니다.

1. [libcamera](https://www.raspberrypi.com/documentation/computers/camera_software.html#libcamera)는 Raspberry Pi에 사전 설치되어 있어야 합니다. 버그 수정 및 보안 업데이트에 대한 최신 버전 업데이트가 있는지 확인합니다. 터미널을 열고 다음 명령을 입력합니다.

   ```
   sudo apt-get update
   sudo apt-get upgrade
   ```

1. 업데이트가 적용되도록 시스템을 재부팅합니다.

   ```
   sudo reboot
   ```

1. 카메라를 테스트합니다. 이 애플리케이션은 카메라 미리 보기 스트림을 시작하고 화면에 표시합니다.

   ```
   libcamera-hello
   ```

   카메라 모듈에 문제가 있는 경우 [Raspberry Pi 설명서](https://raspberrypi.com/documentation/computers/camera_software.html#troubleshooting)에서 문제 해결을 참조하세요.

------

# 소프트웨어 사전 조건 설치
<a name="producersdk-cpp-rpi-software"></a>

C\$1\$1 생산자 SDK를 사용하려면 Raspberry Pi에 다음 소프트웨어 사전 조건을 설치해야 합니다.

1. 패키지 목록을 업데이트하고 SDK를 빌드하는 데 필요한 라이브러리를 설치합니다. 터미널을 열고 다음 명령을 입력합니다.

   ```
   sudo apt-get update
   sudo apt-get install -y \
     automake \
     build-essential \
     cmake \
     git \
     gstreamer1.0-plugins-base-apps \
     gstreamer1.0-plugins-bad \
     gstreamer1.0-plugins-good \
     gstreamer1.0-plugins-ugly \
     gstreamer1.0-tools \
     gstreamer1.0-omx-generic \
     libcurl4-openssl-dev \
     libgstreamer1.0-dev \
     libgstreamer-plugins-base1.0-dev \
     liblog4cplus-dev \
     libssl-dev \
     pkg-config
   ```

1. `libcamera` 스택을 사용하는 경우 `libcamerasrc` GStreamer 플러그인도 설치합니다. 이 GStreamer 플러그인은 기본적으로 설치되지 않습니다.

   ```
   sudo apt-get install gstreamer1.0-libcamera
   ```

1. 다음 PEM 파일을 `/etc/ssl/cert.pem`에 복사합니다.

   ```
   sudo curl https://www.amazontrust.com/repository/AmazonRootCA1.pem -o /etc/ssl/AmazonRootCA1.pem
   sudo chmod 644 /etc/ssl/AmazonRootCA1.pem
   ```

# Kinesis Video Streams C\$1\$1 생산자 SDK 다운로드 및 빌드
<a name="producersdk-cpp-rpi-download"></a>

아래 절차에 따라 [Kinesis Video Streams C\$1\$1 생산자 SDK](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp)를 다운로드하고 빌드합니다. 소프트웨어 사전 조건을 설치했는지 확인합니다. 해당 단계는 [소프트웨어 사전 조건 설치](producersdk-cpp-rpi-software.md) 섹션을 참조하세요.

1. 디렉터리 다운로드로 이동합니다. 터미널을 열고 원하는 다운로드 디렉터리로 변경합니다.

   예제:

   ```
   cd ~/Downloads
   ```

1. SDK 리포지토리를 복제합니다. `git clone` 명령을 사용하여 GitHub 리포지토리에서 SDK를 다운로드합니다. 유형: 

   ```
   git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git --single-branch -b master kvs-producer-sdk-cpp
   ```

   이 명령은 단일 브랜치(`master`브랜치)만 복제하여 다운로드 크기와 시간을 줄입니다. 또한 다운로드한 콘텐츠를 현재 디렉터리 `kvs-producer-sdk-cpp` 내에서 라는 폴더에 배치합니다.

1. 다운로드를 확인합니다. 복제 프로세스가 완료되면 `kvs-producer-sdk-cpp` 폴더의 내용을 나열하여 SDK가 다운로드되었는지 확인합니다.

   ```
   ls kvs-producer-sdk-cpp
   ```

1. 빌드 디렉터리를 준비합니다. 유형: 

   ```
   mkdir -p kvs-producer-sdk-cpp/build
   cd kvs-producer-sdk-cpp/build
   ```

1. 빌드를 구성합니다. 다음 `cmake` 명령을 실행하여 특정 옵션으로 빌드 환경을 구성합니다.

   ```
   cmake .. -DBUILD_GSTREAMER_PLUGIN=ON -DBUILD_DEPENDENCIES=OFF -DALIGNED_MEMORY_MODEL=ON
   ```

   [CMake](https://cmake.org/cmake/help/latest/manual/cmake.1.html)는 다음 옵션을 사용하여 적절한를 생성합니다`Makefiles`.
   + 프로젝트 폴더(`..`)를 소스 디렉터리로 사용합니다.
   + 빌드 출력에 현재 디렉터리(`.`)(`build/`)를 사용합니다.
   + `-DBUILD_GSTREAMER_PLUGIN=ON`를 사용하면 GStreamer 플러그인 kvssink를 빌드할 수 있습니다.
   + `-DBUILD_DEPENDENCIES=OFF`는 소스에서 외부 종속성 빌드를 비활성화합니다. 프로젝트는 이전 단계에서 설치된 외부 종속성을 찾아 사용합니다.
   + `-DALIGNED_MEMORY_MODEL=ON`는 정렬되지 않은 메모리 모델을 비활성화합니다. 정렬되지 않은 메모리 액세스는 특정 Raspberry Pi 디바이스에서 지원되지 않습니다.
**참고**  
CMake 인수의 전체 목록은 섹션을 참조하세요[C\$1\$1 생산자 라이브러리 코드 다운로드 및 구성](producersdk-cpp-download.md).

1. 프로젝트를 빌드합니다. 빌드를 구성한 후 `make` 명령을 사용하여에서 `Makefile` 생성된를 사용하여 컴파일합니다`cmake`.

   ```
   make -j$(nproc)
   ```

   에 대한 `-j` 인수를 `make` 사용하면 여러 컴파일 작업을 병렬로 실행할 수 있습니다. 빌드 시간을 줄이려면 `nproc` 명령을 사용하여 Raspberry Pi의 CPU 코어 수를 동적으로 계산합니다.

1. `libgstkvssink.so`이 존재하는지 확인합니다.

   현재 디렉터리의 파일을 나열합니다.

   **프롬프트:**

   ```
   ls
   ```

   **응답**:

   ```
   CMakeCache.txt       dependency                          kvs_gstreamer_sample
   CMakeFiles           kvs_gstreamer_audio_video_sample    kvssink_gstreamer_sample
   Makefile             kvs_gstreamer_file_uploader_sample  libKinesisVideoProducer.so
   cmake_install.cmake  kvs_gstreamer_multistream_sample    libgstkvssink.so
   ```

1. GStreamer가를 로드할 수 있는지 확인합니다`kvssink`.

   `GST_PLUGIN_PATH` 환경 변수를가 포함된 디렉터리로 설정합니다`libgstkvssink.so`.

   ```
   export GST_PLUGIN_PATH=`pwd`
   ```

   GStreamer 로드`kvssink`:

   ```
   gst-inspect-1.0 kvssink
   ```

   에 대한 몇 가지 설명서가 표시됩니다`kvssink`. 화살표 키를 사용하여 탐색하고를 눌러 종료`q`합니다.

1. (**선택 사항**) `GST_PLUGIN_PATH` 환경 변수 설정을 포함하도록 쉘의 시작 스크립트를 업데이트합니다. 이렇게 하면 새 터미널 세션 중에 `GST_PLUGIN_PATH`가 올바르게 설정됩니다. Raspberry Pi 디바이스에서 쉘의 시작 스크립트는 입니다`~/.bashrc`.

   다음 명령을 실행하여 셸의 시작 스크립트 끝에 명령을 추가합니다.

   ```
   echo "export GST_PLUGIN_PATH=~/Downloads/kvs-producer-sdk-cpp/build" >> ~/.bashrc
   ```

   다음을 입력하여 쉘의 시작 스크립트를 실행하거나 현재 쉘을 닫고 새 쉘을 엽니다.

   ```
   source ~/.bashrc
   ```

   가 설정`GST_PLUGIN_PATH`되었는지 확인하고를 로드할 수 있습니다`kvssink`.

   ```
   echo $GST_PLUGIN_PATH
   ```

   ```
   gst-inspect-1.0 kvssink
   ```

# Kinesis 비디오 스트림으로 비디오 스트리밍
<a name="producersdk-cpp-rpi-run"></a>

샘플 애플리케이션을 실행하려면 다음 정보가 필요합니다.
+ [사전 조건](producersdk-cpp-rpi-prerequisites.md) 단원에서 생성한 스트림 이름입니다.
+ [Kinesis Video Streams에 쓸 수 있는 권한이 있는 IAM 사용자 생성](producersdk-cpp-rpi-iam.md)에서 생성한 계정 자격 증명(액세스 키 ID 및 보안 액세스 키)입니다.
+ GStreamer는 `kvssink` 플러그인을 찾을 수 있습니다. 자세한 정보는 [Kinesis Video Streams C\$1\$1 생산자 SDK 다운로드 및 빌드](producersdk-cpp-rpi-download.md)을 참조하세요.

1. 자격 증명과 리전을 설정합니다.

   ```
   export AWS_ACCESS_KEY_ID=YourAccessKey
   export AWS_SECRET_ACCESS_KEY=YourSecretKey
   export AWS_DEFAULT_REGION=us-west-2
   ```

   다른 인증 방법은 섹션을 참조하세요[에 자격 증명 제공 `kvssink`](examples-gstreamer-plugin-parameters.md#credentials-to-kvssink).
**참고**  
C\$1\$1 생산자 SDK는 기본적으로 미국 서부(오레곤)(`us-west-2`) 리전을 사용합니다. 기본값을 사용하려면 미국 서부(오레곤) 리전에서 Kinesis 비디오 스트림을 AWS 리전 생성합니다.  
Kinesis 비디오 스트림에 다른 리전을 사용하려면 다음 환경 변수를 해당 리전(예: *us-east-1*)으로 설정합니다.  

   ```
   export AWS_DEFAULT_REGION=us-east-1 
   ```

1. 입력 미디어에 따라 다음 중 하나를 선택합니다.

------
#### [ Sample GStreamer video ]

   이 GStreamer 파이프라인은 해상도가 640x480픽셀인 초당 10프레임으로 실행되는 표준 테스트 패턴을 사용하여 라이브 테스트 비디오 스트림을 생성합니다. 현재 시스템 시간과 날짜를 표시하는 오버레이가 추가됩니다. 그런 다음 비디오가 H.264 형식으로 인코딩되고 최대 10프레임마다 키프레임이 생성되어 조각 기간(사진 그룹(GoP) 크기라고도 함)이 1초가 됩니다. kvssink는 H.264로 인코딩된 비디오 스트림을 가져와 Matroska(MKV) 컨테이너 형식으로 패키징하고 Kinesis 비디오 스트림에 업로드합니다.

   다음 명령을 실행합니다.

   ```
   gst-launch-1.0 -v videotestsrc is-live=true \
     ! video/x-raw,framerate=10/1,width=640,height=480 \
     ! clockoverlay time-format="%a %B %d, %Y %I:%M:%S %p" \
     ! x264enc bframes=0 key-int-max=10 \
     ! h264parse \
     ! kvssink stream-name="YourStreamName"
   ```

   GStreamer 파이프라인을 중지하려면 터미널 창을 선택하고 **CTRL\$1C**를 누릅니다.

   샘플 비디오 GStreamer 파이프라인은 다음과 같습니다.

![\[오버레이된 날짜 및 타임스탬프가 있는 표준 테스트 패턴의 이미지입니다.\]](http://docs.aws.amazon.com/ko_kr/kinesisvideostreams/latest/dg/images/sample-video.png)


------
#### [ USB web cam ]

   다음 명령을 실행하여 GStreamer가 USB 카메라를 자동으로 감지하도록 합니다.

   ```
   gst-launch-1.0 autovideosrc \
     ! videoconvert \
     ! video/x-raw,format=I420,width=640,height=480 \
     ! x264enc bframes=0 key-int-max=45 tune=zerolatency byte-stream=true speed-preset=ultrafast \
     ! h264parse \
     ! video/x-h264,stream-format=avc,alignment=au,profile=baseline \
     ! kvssink stream-name="YourStreamname"
   ```

   GStreamer 파이프라인을 중지하려면 터미널 창을 선택하고 **CTRL\$1C**를 누릅니다.

   GStreamer가 자동으로 감지하도록 하는 대신 특정 디바이스 식별자`v4l2src`와 함께를 사용할 수 있습니다. 다음 명령을 실행합니다.

   ```
   gst-device-monitor-1.0
   ```

   출력에는 일부 디바이스와 디바이스 사용 방법에 대한 GStreamer 파이프라인의 시작이 표시됩니다.

   ```
   Device found:
   
       name  : H264 USB Camera: USB Camera
       class : Video/Source
       caps  : video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string){ 2:4:7:1 }, framerate=(fraction){ 30/1, 25/1, 15/1 };
               ...
       properties:
           device.path = /dev/video4
           udev-probed = false
           device.api = v4l2
           v4l2.device.driver = uvcvideo
           v4l2.device.card = "H264\ USB\ Camera:\ USB\ Camera"
           v4l2.device.bus_info = usb-3f980000.usb-1.3
           v4l2.device.version = 265767 (0x00040e27)
           v4l2.device.capabilities = 2216689665 (0x84200001)
           v4l2.device.device_caps = 69206017 (0x04200001)
       gst-launch-1.0 v4l2src device=/dev/video4 ! ...
   ```

   GStreamer 파이프라인을 중지하려면 터미널 창을 선택하고 **CTRL\$1C**를 누릅니다.

------
#### [ Raspberry Pi camera module 1 ]

   에서 Pi 카메라 모듈 1 또는 Pi 카메라 모듈 2를 사용하는 경우 다음을 `bcm2835-v4l2`사용합니다.

   ```
   gst-launch-1.0 v4l2src device=/dev/video0 \
     ! videoconvert \
     ! video/x-raw,format=I420,width=640,height=480 \
     ! x264enc bframes=0 key-int-max=45 bitrate=500 tune=zerolatency \
     ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline \
     ! kvssink stream-name="YourStreamname"
   ```

   GStreamer 파이프라인을 중지하려면 터미널 창을 선택하고 **CTRL\$1C**를 누릅니다.

------
#### [ Raspberry Pi camera module 2 or 3 ]

   최신 `libcamera` 스택을 사용하는 경우 다음 GStreamer 파이프라인을 사용합니다.

   ```
   gst-launch-1.0 libcamerasrc \
     ! video/x-raw,width=640,height=480,framerate=30/1,format=I420 \
     ! videoconvert \
     ! x264enc speed-preset=ultrafast tune=zerolatency byte-stream=true key-int-max=75 \
     ! video/x-h264,level='(string)4' \
     ! h264parse \
     ! video/x-h264,stream-format=avc,alignment=au,width=640,height=480,framerate=30/1 \
     ! kvssink stream-name="YourStreamname"
   ```

   GStreamer 파이프라인을 중지하려면 터미널 창을 선택하고 **CTRL\$1C**를 누릅니다.

------
#### [ Sample RTSP camera ]

   이 예제에서는 Gst-Rtsp-Server를 사용하여 데모 RTSP 카메라 피드를 로컬로 호스팅합니다. 그런 다음 해당 RTSP 카메라 피드를 지정된 Kinesis 비디오 스트림에 업로드하는 GStreamer 파이프라인을 구성합니다.

   **Raspberry Pi에서 Gst-Rtsp-Server를 설정하려면**

   1. Gst-Rtsp-Server 프로젝트를 빌드하는 데 필요한 종속성 라이브러리를 설치합니다. 소프트웨어 사전 조건도 설치되어 있는지 확인합니다. 터미널에 다음을 입력합니다.

      ```
      sudo apt-get update
      sudo apt-get install libgstrtspserver-1.0
      ```

   1. Raspberry Pi에서 1.22 버전의 GStreamer를 다운로드합니다.

      ```
      git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git --single-branch -b 1.22
      ```

   1. 디렉터리를 gst-rtsp-server의 예제 디렉터리로 변경합니다.

      ```
      cd gstreamer
      cd subprojects
      cd gst-rtsp-server
      cd examples
      ```

   1. gcc를 사용하여 test-launch.c를 test-launch라는 실행 파일로 컴파일합니다.

      ```
      gcc -o test-launch test-launch.c `pkg-config --cflags --libs gstreamer-rtsp-server-1.0`
      ```

   1. 다음 인수를 사용하여 실행 파일을 실행합니다. 참고: GStreamer를 처음 로드하는 데 다소 시간이 걸릴 수 있습니다.

      ```
      ./test-launch "videotestsrc is-live=true ! video/x-raw,height=480,width=640,framerate=10/1 ! videoconvert ! x264enc tune=zerolatency bitrate=512 key-int-max=25 bframes=0 ! h264parse ! rtph264pay ! name=pay0 pt=96"
      ```

      다음 결과가 표시됩니다.

      ```
      stream ready at rtsp://127.0.0.1:8554/test
      ```

   1. RTSP 비디오 스트림을 확인합니다. 모든 RTSP 뷰어를 사용할 수 있습니다. 예: VLC 미디어 플레이어. VLC 미디어 플레이어를 사용하여 라이브 스트림을 보려면 새 터미널을 열고 다음을 입력합니다.

      ```
      sudo apt-get install vlc
      ```

      VLC 미디어 플레이어를 설치합니다. 그런 다음 다음을 입력합니다.

      ```
      vlc rtsp://127.0.0.1:8554/test
      ```

      VLC 창이 라이브 스트림과 함께 팝업되어야 합니다. 그렇지 않은 경우 테스트 시작 실행 파일이 아직 실행 중인지 확인하고 출력에 오류가 있는지 확인합니다.

      RTSP 스트림을 확인하는 또 다른 방법은 gst-discoverer-1.0 유틸리티를 사용하는 것입니다. 유형: 

      ```
      gst-discoverer-1.0 "rtsp://127.0.0.1:8554/test"
      ```

      예상 출력은 다음과 같습니다.

      ```
      Analyzing rtsp://127.0.0.1:8554/test
      Done discovering rtsp://127.0.0.1:8554/test
      
      Properties:
        Duration: 99:99:99.999999999
        Seekable: no
        Live: yes
        unknown #0: application/x-rtp
          video #1: H.264 (Constrained Baseline Profile)
            Stream ID: 359314d7d4bba383223927d7e57d4244d0800e629c626be81c505055c62170e2/video:0:0:RTP:AVP:96
            Width: 640
            Height: 480
            Depth: 24
            Frame rate: 10/1
            Pixel aspect ratio: 1/1
            Interlaced: false
            Bitrate: 0
            Max bitrate: 0
      ```

   **kvssink를 사용하여 Kinesis Video Stream으로 RTSP 피드를 보내려면**

   이 GStreamer 파이프라인은 `rtspsrc`를 사용하여 RTSP 서버에 연결하여 RTP 비디오 스트림을 가져옵니다. 프레임을에 전달`rtph264depay`하여 RTP 패킷에서 H.264 인코딩 비디오 프레임을 추출합니다.는 비디오 프레임을 이해할 `kvssink` 수 있는 형식으로 `h264parse` 그룹화합니다. `kvssink`는 H.264 인코딩 비디오 스트림을 가져와 Matroska(MKV) 컨테이너 형식으로 패키징하고 Kinesis 비디오 스트림에 업로드합니다.

   다음 명령을 실행합니다.

   ```
   gst-launch-1.0 -v rtspsrc location="rtsp://127.0.0.1:8554/test" short-header=true \
     ! rtph264depay \
     ! h264parse \
     ! video/x-h264,format=avc,alignment=au \
     ! kvssink stream-name="YourStreamName"
   ```

   GStreamer 파이프라인을 중지하려면 터미널 창을 선택하고 **CTRL\$1C**를 누릅니다.

------

## 하드웨어 사용
<a name="producersdk-cpp-rpi-utilize"></a>

일부 Raspberry Pi 모델은 하드웨어 가속 H.264 인코더와 함께 제공됩니다. 소프트웨어 인코더`x264enc`인 대신 사용할 수 있습니다.

1. GStreamer 플러그인이 설치되어 있는지 확인합니다.

   ```
   sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-bad
   ```

1. 유형: 

   ```
   gst-inspect-1.0 | grep h264
   ```

   다음 요소를 사용할 수 있는지 확인합니다.
   + omxh264enc
   + v4l2h264enc

   사용 가능한 경우 사용할 수 있습니다. 다음은 이러한 요소를 사용하는 몇 가지 파이프라인 예제입니다.

   **`omxh264enc`:**

   ```
   gst-launch-1.0 v4l2src device=/dev/video0 \
     ! videoconvert \
     ! video/x-raw,format=I420,width=640,height=480 \
     ! omxh264enc control-rate=2 target-bitrate=512000 periodicity-idr=45 inline-header=FALSE \
     ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline \
     ! kvssink stream-name="raspberry"
   ```

   **`v4l2h264enc` 및 `v4l2convert`:**

   ```
   gst-launch-1.0 libcamerasrc \
     ! video/x-raw,width=640,height=480,framerate=30/1,format=I420 \
     ! v4l2convert \
     ! v4l2h264enc extra-controls="controls,repeat_sequence_header=1" \
     ! video/x-h264,level='(string)4' \
     ! h264parse \
     ! video/x-h264,stream-format=avc,alignment=au,width=640,height=480,framerate=30/1 \
     ! kvssink stream-name="test-stream"
   ```

## 런타임 문제
<a name="rpi-troubleshoot-runtime"></a>

다음은 자주 발생하는 몇 가지 런타임 문제와 이를 해결하는 방법입니다.

### 이러한 요소 "xxxxxxxxx" 없음
<a name="rpi-troubleshoot-missing-plugin"></a>

다음과 같은 오류가 발생하면 GStreamer 플러그인이 누락된 것입니다.

```
WARNING: erroneous pipeline: no element "videoconvert"
```

**​해결 방법:**

누락된 요소를 기반으로 적절한 조치를 결정합니다.
+ `kvssink`: 단원을 참조하십시오[Kinesis Video Streams C\$1\$1 생산자 SDK 다운로드 및 빌드](producersdk-cpp-rpi-download.md).
+ `libcamerasrc`: `libcamerasrc` GStreamer 요소를 설치["버퍼 풀 활성화 실패" 오류](#rpi-troubleshoot-buffer)하려면 섹션을 참조하세요.
+ `omxh264enc` 또는 `v4l2h264enc`: 

  [소프트웨어 사전 조건 설치](producersdk-cpp-rpi-software.md)에 따라 모든 GStreamer 라이브러리를 설치합니다. 모두 설치했는데 이러한 요소가 표시되지 않는 경우 Raspberry Pi에 하드웨어가 없다는 의미입니다. `x264enc` 대신 소프트웨어 인코더를 사용합니다.
+ 기타: [소프트웨어 사전 조건 설치](producersdk-cpp-rpi-software.md)에 따라 모든 GStreamer 라이브러리를 설치합니다. 다양한 GStreamer 플러그인 그룹(좋음, 나쁨, 이상)에서 다양한 GStreamer 요소가 발견되므로 모두 설치해야 합니다.

### "버퍼 풀 활성화 실패" 오류
<a name="rpi-troubleshoot-buffer"></a>

다음과 같은 오류가 발생하면 사용 중인 파이프라인이를 사용하고 `v4l2src`있지만 `libcamerasrc` 대신를 사용해야 한다는 의미입니다.

```
ERROR bufferpool gstbufferpool.c:572:gst_buffer_pool_set_active:source:pool0:src start failed
WARN v4l2src gstv4l2src.c:976:gst_v4l2src_decide_allocation: error: Failed to allocate required memory.
WARN v4l2src gstv4l2src.c:976:gst_v4l2src_decide_allocation: error: Buffer pool activation failed
WARN basesrc gstbasesrc.c:3352:gst_base_src_prepare_allocation: Subclass failed to decide allocation
Error received from element source: Failed to allocate required memory.
WARN basesrc gstbasesrc.c:3132:gst_base_src_loop: error: Internal data stream error.
Debugging information: ../sys/v4l2/gstv4l2src.c(976): gst_v4l2src_decide_allocation (): /GstPipeline:live-kinesis-pipeline/GstV4l2Src:source:
Buffer pool activation failed
WARN basesrc gstbasesrc.c:3132:gst_base_src_loop: error: streaming stopped, reason not-negotiated (-4)
```

예를 들어 카메라 모듈 2가 `libcamerasrc` 설치되지 않은 상태에서 다음 파이프라인를 사용하는 경우 GStreamer가 사용할 요소를 자동으로 감지하려고 할 때이 오류가 발생할 수 있습니다.

```
gst-launch-1.0 autovideosrc ! videoconvert ! autovideosink
```

**​해결 방법:**

`libcamerasrc`가 설치되어 있고 대신 소스 요소로 사용해야 합니다`v4l2src`. 다음을 입력하여 `libcamerasrc` GStreamer 요소를 설치합니다.

```
sudo apt-get update
sudo apt-get install gstreamer1.0-libcamera
```

`libcamerasrc`가 설치되면 `autovideosrc` 요소를 사용하는 경우 GStreamer는 `libcamerasrc` 대신 올바른 소스를 사용하도록 자동으로 전환해야 합니다`v4l2src`.

### 버스 오류
<a name="rpi-troubleshoot-bus"></a>

시작 직후 버스 오류가 발생하면`kvssink`(일반적으로에 대한 HTTP 호출이 `PutMedia`완료될 때까지) Raspberry Pi가 정렬되지 않은 메모리 액세스를 지원하지 않는다는 의미입니다. 로그는 다음과 같습니다.

```
INFO Camera camera.cpp:1197 configuring streams: (0) 640x480-YUV420
INFO RPI pisp.cpp:1450 Sensor: /base/axi/pcie@120000/rp1/i2c@88000/imx708@1a - Selected sensor format: 1536x864-SBGGR10_1X10 - Selected CFE format: 1536x864-PC1B
[INFO ] kinesisVideoStreamFormatChanged(): Stream format changed.
[DEBUG] setRequestHeader(): Appending header to request: user-agent -> AWS-SDK-KVS-CPP-CLIENT/3.4.2/1.5.3 GCC/12.2.0 Linux/6.6.51+rpt-rpi-v8 aarch64 CPPSDK
[DEBUG] setRequestHeader(): Appending header to request: x-amzn-stream-name -> demo-stream
[DEBUG] setRequestHeader(): Appending header to request: x-amzn-producer-start-timestamp -> 1732012345.678
[DEBUG] setRequestHeader(): Appending header to request: x-amzn-fragment-acknowledgment-required -> 1
[DEBUG] setRequestHeader(): Appending header to request: x-amzn-fragment-timecode-type -> ABSOLUTE
[DEBUG] setRequestHeader(): Appending header to request: transfer-encoding -> chunked
[DEBUG] setRequestHeader(): Appending header to request: connection -> keep-alive
[INFO ] putStreamResultEvent(): Put stream result event. New upload handle 0
[WARN ] notifyDataAvailable(): [demo-stream] Failed to un-pause curl with error: 43. Curl object 0xe2f6f418
Bus error
```

Kinesis Video Streams PIC는 정렬되지 않은 메모리 액세스를 사용하여 모든 디바이스에서 지원되지 않는 메모리 사용량을 최적화합니다.

**​해결 방법:**

정렬된 메모리 액세스 모드에서 SDK를 사용하려면 기본적으로 로 `kvssink`설정되므로 컴파일 `ON` 시 `ALIGNED_MEMORY_MODEL` CMake 플래그를 로 명시적으로 설정해야 합니다`OFF`. 자세한 지침은 [Kinesis Video Streams C\$1\$1 생산자 SDK 다운로드 및 빌드](producersdk-cpp-rpi-download.md) 단원을 참조하십시오.

### 타임스탬프가 고정되고 파이프라인이 정지됩니다.
<a name="rpi-troubleshoot-pipeline"></a>

GStreamer 파이프라인`x264enc`에서를 사용할 때 파이프라인의 타임라인이 몇 초 내에 크게 또는 완전히 멈출 수 있는 상황이 발생할 수 있습니다.

이는 `x264enc` 기본 설정에서 기본 입력 버퍼의 용량을 초과하는 높은 인코딩 지연 시간이 발생할 수 있기 때문입니다. 따라서 입력 버퍼가 채워져 업스트림 요소가 차단되고 파이프라인이 중지됩니다.

자세한 내용은 [GStreamer 설명서를](https://gstreamer.freedesktop.org/documentation/x264/index.html?gi-language=c) 참조하세요.

**​해결 방법:**

튜닝 옵션으로 `zerolatency` `x264enc`를 구성합니다. 이렇게 하면 실시간 시나리오에 맞게 최적화하여 프레임을 더 빠르게 처리하고 출력하여 인코딩 지연 시간을 크게 줄일 수 있습니다.

구성 예제:

```
... ! x264enc tune=zerolatency byte-stream=true speed-preset=ultrafast bframes=0 key-int-max=60 ! ...
```

**참고**  
이 솔루션은 파이프라인 가동 중지를 효과적으로 방지하지만 인코딩 효율성과 품질에 영향을 미칠 수 있습니다. 짧은 지연 시간과 고품질이 모두 필요한 시나리오의 경우 하드웨어 최적화를 사용하거나 H.264를 직접 출력하는 웹캠을 찾는 등이 인코딩 단계를 건너뛰는 등 대체 접근 방식을 고려하세요.  
자세한 내용은 [하드웨어 사용](#producersdk-cpp-rpi-utilize) 단원을 참조하십시오.

### 동일한 `v4l2` 디바이스에서 동시에 여러 파이프라인을 실행할 수 없음
<a name="rpi-troubleshoot-multiple-pipelines"></a>

와 같은 디바이스는 한 번에 한 프로세스만 액세스할 `/dev/video0` 수 있습니다. 여러 프로세스가 동시에 액세스하려고 하면 두 번째 프로세스가 첫 번째 프로세스가 완료될 때까지 대기합니다.

**​해결 방법:**

루프백 디바이스를 생성하여 여러 프로세스가 루프백 인터페이스를 동시에 사용할 수 있도록 합니다. 자세한 내용은 [스택 교환](https://raspberrypi.stackexchange.com/questions/19630/take-picam-image-while-motion-is-running/19897#19897)을 참조하세요.

### 내부 데이터 스트림 오류
<a name="rpi-troubleshoot-internal-error"></a>

GStreamer 파이프라인을 생성할 때 한 요소의 소스 패드를 다른 요소의 싱크 패드에 연결하여 요소를 연결합니다. 이 연결 프로세스를 통해 소스 요소에서 싱크 요소로 데이터를 흐르게 하여 데이터 파이프라인을 구성할 수 있습니다.

로그의 "Pad link failed" 오류 메시지는 GStreamer가 파이프라인에 있는 두 요소의 패드 간에 연결(링크)을 설정하려고 할 때 문제가 발생했음을 나타냅니다.

```
Pad link failed
Error received from element udpsrc0: Internal data stream error.
```

**​해결 방법:**

어떤 요소가 서로 연결되지 않는지 결정합니다. 파이프라인 범위를 좁히려면 파이프라인에서 요소를 제거합니다. 가장 오른쪽 요소를 로 바꾸`fakesink`고 한 번에 하나씩 요소를 제거합니다.

[capsfilter](https://gstreamer.freedesktop.org/documentation/coreelements/capsfilter.html?gi-language=c) 요소를 조정하거나 파이프라인에서 사용하는 요소를 변경해야 할 수 있습니다.

일반적인 경우는 카메라가 지원하지 않는 `framerate` 또는를 요청하는 `resolution` 것입니다. 터미널`gst-device-monitor-1.0`에서를 사용하여 지원되는 `framerates`, `resolutions`및를 가져옵니다`formats`. [비디오스케일](https://gstreamer.freedesktop.org/documentation/videoconvertscale/videoscale.html?gi-language=c) GStreamer 요소를 사용하여 비디오 해상도를 조정하고 [비디오 속도를](https://gstreamer.freedesktop.org/documentation/videorate/?gi-language=c) 조정하여 비디오 프레임 속도를 조정할 수 있습니다.

개별 GStreamer 요소에 대해 지원되는 형식을 검사하려면 터미널`gst-inspect-1.0 element-name`에를 입력합니다.

# Kinesis 비디오 스트림에서 미디어 재생
<a name="producersdk-cpp-rpi-playback"></a>

[Kinesis Video Streams 콘솔](https://console.aws.amazon.com//kinesisvideo/home/)을 열고 생성한 스트림의 스트림 **이름을** 선택합니다.

Raspberry Pi에서 전송된 비디오 스트림이 콘솔에 나타납니다.

**참고**  
콘솔에 비디오가 표시되기까지 몇 초 정도 걸릴 수 있습니다.

스트림이 재생되면 콘솔에서 다음 기능을 실험할 수 있습니다.
+ **Video preview**(비디오 미리 보기) 섹션에서 탐색 컨트롤을 사용하여 스트림을 되감거나 앞으로 빨리 재생합니다.
+ **스트림 정보** 섹션에서 스트림의 코덱, 해상도 및 비트레이트를 검토합니다. 해상도 및 비트 전송률 값은이 자습서의 대역폭 사용량을 최소화하기 위해 Raspberry Pi에서 의도적으로 낮게 설정됩니다.

  스트림에 대해 생성 중인 Amazon CloudWatch 지표를 보려면 ** CloudWatch에서 스트림 지표 보기를** 선택합니다.
+ **데이터 보존 기간**에서는 비디오 스트림이 1일 동안 보존된다고 표시되어 있습니다. 이 값을 편집해 **No data retention**(데이터 보존 안 함)으로 설정하거나 이 값을 1일\$1며칠로 설정할 수 있습니다.
+ **서버 측 암호화**에서 데이터가 AWS Key Management Service ()에서 유지 관리하는 키를 사용하여 저장 시 암호화됩니다AWS KMS.

## 재생 문제
<a name="rpi-troubleshoot-playback"></a>

다음은 자주 발생하는 재생 문제와 이를 해결하는 방법입니다.

### 미디어는 없지만 로그에 PERSISTED Acks가 있음
<a name="rpi-troubleshoot-no-media"></a>

로그에 PERSISTED Acks가 표시되면 Kinesis Video Streams가에서 업로드한 미디어를 성공적으로 수집하고 저장한 것입니다`kvssink`. Kinesis Video Streams에서 받은 승인은 다음과 같습니다. 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 콘솔에서 1\$12분 정도 기다린 다음 이중 오른쪽 화살표를 사용합니다. 미디어가 표시되지 않으면 스트림이 올바른 리전으로 전송되고 있는지 확인하고 스트림 이름의 철자를 검토합니다. 로그에서이 정보를 찾을 수 있습니다.

kvssink가 사용할 리전을 결정하는 방법에 [에 리전 제공 `kvssink`](examples-gstreamer-plugin-parameters.md#kvssink-region) 대한 자세한 내용은 섹션을 참조하세요.

### 미디어를에 로드하는 데 시간이 오래 걸립니다. AWS Management Console
<a name="rpi-troubleshoot-load-time"></a>

**중요**  
콘솔 재생 환경은 HLS 및 DASH 재생 환경과 다릅니다. GitHub의 샘플 미디어 플레이어 [호스팅 웹 페이지를](https://aws-samples.github.io/amazon-kinesis-video-streams-media-viewer/) 사용하여 재생도 테스트합니다. 웹 페이지의 소스 코드는 [여기에서](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이고 프레임 속도가 15fps인 스트림의 경우: 

  조각 길이 = 30 ÷ 15 = 2초

키 프레임 간격이 클수록 조각이 길수록 스트리밍 미디어의 지연 시간이 증가합니다.

**​해결 방법:**

로드 시간을 개선하려면 키 프레임 간격을 줄이는 것이 좋습니다. 이렇게 하면 조각이 짧아져 지연 시간이 줄어들지만 비디오 파일의 크기도 늘어납니다.

`x264enc` GStreamer 요소의 경우 `key-int-max` 속성을 통해 키 프레임 간격을 명시적으로 설정할 수 있습니다.

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

로그 출력을 검토할 때 업로드 클라이언트가 Kinesis Video Streams로부터 ACKs 수신하는 빈도를 기록해 둡니다. 키프레임이 더 많이 생성될수록 ACKs 더 많이 반환됩니다.

### 미디어가 왜곡되었거나 아티팩트가 있음
<a name="rpi-troubleshoot-distortion"></a>

이 문제를 해결하려면 모든 케이블이 단단히 연결되어 있어야 합니다. 카메라 모듈에 대한 `libcamera-hello` (또는 레거시 Pi 카메라의 `raspistill` 경우)의 출력을 검토합니다.

GStreamer 파이프라인에서를 `autovideosink` 또는 `matroskamux` 및 `kvssink`로 바꿉니다`filesink`. 예제:

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

의 출력 파일 `filesink` 또는를 사용할 때 열리는 미디어 플레이어를 검토하여 아티팩트도 있는지 `autovideosink` 확인합니다.

또한 다음 파이프라인의 출력도 검토합니다.

```
gst-launch-1.0 autovideosrc ! videoconvert ! autovideosink
```

[디워프](https://gstreamer.freedesktop.org/documentation/opencv/dewarp.html?gi-language=c)와 같은 요소를 파이프라인에 추가하면 어안 카메라 출력을 수정할 수 있습니다.

카메라에 대해 지원되는 출력 코덱을 검토하고 필요에 따라 요소를 조정합니다.

예를 들어 USB 카메라가 JPEG 출력만 지원하는 경우를 사용하여 미디어를 H.264로 인코딩하기 전에 `jpegparse` 및 `jpegdec` 요소를 사용하여 미디어를 변환해야 합니다`x264enc`. 유사한 파이프라인 및/또는 웹캠 설정을 가진 다른 사용자를 위해 GStreamer 포럼에서 지원을 검색합니다.

# C\$1\$1 생산자 SDK for Raspberry Pi의 빌드 문제 해결
<a name="troubleshoot-rpi"></a>

빌드 문제가 발생하여 다른 CMake 인수를 시도하려면 깨끗한 빌드를 수행해야 합니다. 다시 시도하기 전에 `open-source``dependency`, 및 `build` 폴더를 삭제합니다.

## OpenSSL 관련 빌드 문제
<a name="troubleshoot-rpi-build"></a>

다음과 비슷한 출력이 수신되면 OpenSSL이 시스템 아키텍처를 잘못 감지했음을 나타냅니다.

```
crypto/md5/md5-aarch64.S: Assembler messages:
crypto/md5/md5-aarch64.S:3: Error: unrecognized symbol type ""
crypto/md5/md5-aarch64.S:6: Error: bad instruction `stp x19,x20,[sp,#-80]!'
crypto/md5/md5-aarch64.S:7: Error: bad instruction `stp x21,x22,[sp,#16]'
crypto/md5/md5-aarch64.S:8: Error: bad instruction `stp x23,x24,[sp,#32]'
crypto/md5/md5-aarch64.S:9: Error: bad instruction `stp x25,x26,[sp,#48]'
```

이 예제에서는이 Raspberry Pi가 실제로 32비트일 때 64비트 버전(`linux-aarch64`)을 빌드하려고 합니다. 일부 Raspberry Pi 디바이스에는 64비트 커널이 있지만 32비트 사용자 공간이 있습니다.

OpenSSL이 빌드하려는 아키텍처를 결정합니다. OpenSSL `configure` 단계 중에 로그 줄을 찾을 수 있습니다.

```
[ 33%] Performing update step for 'project_libopenssl'
-- Already at requested tag: OpenSSL_1_1_1t
[ 44%] No patch step for 'project_libopenssl'
[ 55%] Performing configure step for 'project_libopenssl'
Operating system: x86_64-whatever-linux2
Configuring OpenSSL version 1.1.1t (0x1010114fL) for linux-x86_64
Using os-specific seed configuration
Creating configdata.pm
Creating Makefile
```

시스템의 아키텍처를 확인합니다.
+ 커널 비트 상태 검토: 실행 `uname -m`
+ 사용자 공간 비트 상태 검토: 실행 `getconf LONG_BIT`

`cat /proc/cpuinfo` 또는 `lscpu` 명령을 사용하여 CPU 정보를 검토할 수도 있습니다.

**​해결 방법:**

이 문제를 해결하려면 빌드 시 다음 CMake 인수를 추가하여 OpenSSL이 32비트 ARM 아키텍처에 맞게 올바르게 빌드되도록 합니다.

```
-DBUILD_OPENSSL_PLATFORM=linux-armv4 
```

## GStreamer의 `kvssink` 로드 문제 해결
<a name="troubleshoot-rpi-kvssink"></a>

확인 `GST_PLUGIN_PATH`

현재 쉘 세션의 `GST_PLUGIN_PATH` 환경 변수가가 포함된 디렉터리를 가리키는지 확인합니다`kvssink`. 환경 변수는 세션별로 다르므로 새 세션마다 설정해야 합니다. 이 변경 사항을 영구적으로 적용하려면 “GST\$1PLUGIN\$1PATH 환경 변수 설정을 포함하도록 셸의 시작 스크립트 업데이트”를 참조하세요.

**오류: 공유 객체 파일을 열 수 없음: 해당 파일 또는 디렉터리가 없음**

오류가 발생하면 다음 명령을 `Cannot open shared object file: No such file or directory`실행합니다.

```
gst-inspect-1.0 /path/to/libgstkvssink.so
```

다음 출력을 수신하면 동적 링커가에 필요한 라이브러리를 찾을 수 없음을 나타냅니다`kvssink`. 이는 일반적으로 다음과 같은 이유로 발생합니다.
+ 빌드된 위치와 `kvssink` 다른 위치로 이동합니다.
+ 잘못된 CPU 아키텍처에 대한 교차 컴파일입니다.
+ 필수 종속성이 누락되었습니다.

**출력:**

```
WARNING: erroneous pipeline: no element "kvssink"
error while loading shared libraries: libcproducer.so: cannot open shared object file: No such file or directory
```

**​해결 방법:**

**이동된 라이브러리**의 경우 누락된 라이브러리가 포함된 디렉터리를에 추가합니다`LD_LIBRARY_PATH`.

원래 리포지토리의 루트 디렉터리에서 `find` 유틸리티를 사용하여 누락된 라이브러리를 찾을 수 있습니다. 터미널에서 다음을 입력합니다.

```
find . -name "*libcproducer*" 
```

**출력:**

```
./build/dependency/libkvscproducer/kvscproducer-src/libcproducer.so
```

Linux 디바이스의 파일 경로 구분자는 입니다`:`. 아래 명령은 기존 `LD_LIBRARY_PATH` 환경 변수에 새 폴더 경로를 추가하여 이전 값을 보존합니다.

터미널에 다음을 입력합니다.

```
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/build/dependency/libkvscproducer/kvscproducer-src
```

**중요**  
환경 변수는 세션별로 다릅니다. 세션 간에 변경 사항을 유지하려면 쉘의 시작 스크립트를 수정합니다.

에를 추가해야 `open-source/local/lib`할 수도 있습니다`$LD_LIBRARY_PATH`.

**오류: ./path/to/libcproducer.so.1: 잘못된 ELF 헤더**

**공유 라이브러리**를 로드하는 동안이 오류가 발생하면 심볼 링크()가 손상되었기 때문일 수 있습니다`symlinks`. 호스트 시스템의 운영 체제가 대상 시스템의 운영 체제와 일치하지 않으면 Symlink가 중단될 수 있습니다. Raspberry Pi용 MacBook에서 교차 컴파일을 예로 들 수 있습니다.

또 다른 가능한 원인은 빌드된 바이너리가 잘못된 아키텍처 때문이었다는 것입니다. 예를 들어 바이너리가 x86용으로 빌드된 경우(Raspberry Pi는 ARM CPUs).

오류 및 유형:에 지정된 라이브러리 위치로 이동하여 라이브러리를 `ls -la` 검사합니다`symlinks`.

**응답**:

```
drwxr-xr-x  16 me  staff      512 Sep 10 17:16 .
drwxr-xr-x   7 me  staff      224 Jan  6 23:46 ..
drwxr-xr-x   4 me  staff      128 Sep 10 17:16 engines-1.1
-rwxr-xr-x   1 me  staff  2294496 Sep 10 17:16 libcrypto.1.1.so
-rw-r--r--   1 me  staff  4002848 Sep 10 17:16 libcrypto.a
lrwxr-xr-x   1 me  staff       19 Sep 10 17:16 libcrypto.so -> libcrypto.1.1.so
-rwxr-xr-x   1 me  staff   631176 Sep 10 17:12 liblog4cplus-2.0.3.so
lrwxr-xr-x   1 me  staff       24 Sep 10 17:12 liblog4cplus.so -> liblog4cplus-2.0.3.so
-rwxr-xr-x   1 me  staff     1012 Sep 10 17:12 liblog4cplus.a
-rwxr-xr-x   1 me  staff   694328 Sep 10 17:12 liblog4cplusU-2.0.3.so
lrwxr-xr-x   1 me  staff       25 Sep 10 17:12 liblog4cplusU.dylib -> liblog4cplusU-2.0.3.so
-rwxr-xr-x   1 me  staff     1017 Sep 10 17:12 liblog4cplusU.a
-rwxr-xr-x   1 me  staff   536416 Sep 10 17:16 libssl.1.1.so
-rw-r--r--   1 me  staff   795184 Sep 10 17:16 libssl.a
lrwxr-xr-x   1 me  staff       16 Sep 10 17:16 libssl.so -> libssl.1.1.so
drwxr-xr-x   6 me  staff      192 Sep 10 17:16 pkgconfig
```

위의 샘플 출력에서 `symlinks`는 손상되지 않습니다. 손상된 `symlinks` 에는 대상을 가리키는 화살표가 없습니다.

**​해결 방법:**

심볼 링크를 수정하는 두 가지 옵션이 있습니다.
+ **권장 사항:** `ln` 명령을 `symlink` 사용하여를 다시 생성합니다. 유형: 

  ```
  ln -s /path/to/actual/library /path/to/symlink
  ```
+ 실제 라이브러리 파일을 복사하고와 일치하도록 이름을 바꿉니다`symlink`.
**참고**  
이 옵션을 사용하면 스토리지 사용량이 증가합니다.

교차 컴파일 문제를 방지하려면 Docker와 같은 도구를 사용하여 동일한 운영 체제에서 컴파일하는 것이 가장 좋습니다.

**누락된 종속성:**

누락된 라이브러리 이름이 로 시작하는 경우 위의 "이동된 라이브러리" 섹션을 `libkvs`참조하여 호스트 디바이스에서 대상 디바이스로 Kinesis Video Streams 라이브러리를 설치합니다.

그렇지 않으면 [소프트웨어 사전 조건 설치](producersdk-cpp-rpi-software.md)에 따라 모든 오픈 소스 소프트웨어 사전 조건이 대상 디바이스에 설치되어 있는지 확인합니다.