> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dwe.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# dweOS에서 GStreamer로

> 이 가이드는 dweOS에서 GStreamer로 스트리밍을 설정하는 방법을 안내합니다.

<Warning>
  dweOS는 GStreamer를 통한 스트리밍을 공식적으로 지원하지 않습니다. 다음 단계는 Linux와 Windows에서만 적용됩니다.

  참고: 이로 인해 스트림 품질이 저하될 수 있습니다.
</Warning>

<Danger>
  GStreamer는 단일 비디오 스트림을 설정하는 것조차 매우 복잡하고 정교할 수 있습니다. 다중 스트림이나 실시간 녹화 등 편의 기능 대부분은 사용자 인터페이스가 제공되는 [Discovery](https://dwe.ai/products/discovery)에서 훨씬 간단하게 사용할 수 있습니다.
</Danger>

<Steps>
  <Step title="dweOS 확인">
    dweOS 설정을 마친 후 다음 단계로 진행합니다.

    <Note>
      스트리밍 대상 포트를 적어 두세요.
    </Note>
  </Step>

  <Step title="GStreamer 설치">
    <Tabs>
      <Tab title="Linux용">
        터미널에서 다음을 실행합니다:

        ```sh theme={null}
        sudo apt update
        ```

        그런 다음 GStreamer를 설치하려면 다음을 실행합니다:

        ```sh theme={null}
        sudo apt install gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools                
        ```
      </Tab>

      <Tab title="Windows용">
        <Steps>
          <Step title="GStreamer 설치">
            <Card title="GStreamer 프레임워크 다운로드" icon="stream" href="https://gstreamer.freedesktop.org/download/#windows">
              노트북/PC용 데스크톱 GStreamer를 다운로드하려면 여기를 클릭하세요.

              <Note>
                반드시 MinGW 버전을 다운로드하고 runtime과 development를 모두 설치하세요.
              </Note>
            </Card>

            <Tip>
              잘 모를 경우, 더 일반적인 64비트 버전을 설치하세요.
            </Tip>

            <Warning>
              PC에 드라이브가 두 개 이상 있는 경우, GStreamer는 자동으로 D 드라이브에 설치됩니다. 사용자 지정 설치 시 C 드라이브로 변경할 수 있습니다.

              D 드라이브에 설치한 경우, 아래에서 환경 변수를 설정할 때 이 점을 유의하세요.
            </Warning>
          </Step>

          <Step title="환경 변수 설정 구성">
            <Steps>
              <Step>
                환경 변수를 열려면 `Win + R`을 누릅니다.
              </Step>

              <Step>
                다음을 입력합니다:

                ```
                SystemPropertiesAdvanced
                ```

                `Enter`를 누릅니다.
              </Step>

              <Step>
                `환경 변수...`를 클릭합니다.

                <img src="https://mintcdn.com/deepwaterexplorationinc/NrWVR9Qe6FWmBE6d/dwe-os/legacy/images/system-properties-dialog.png?fit=max&auto=format&n=NrWVR9Qe6FWmBE6d&q=85&s=e43b7911ce525ec2b854c971afa1266b" width="80%" alt="시스템 속성 대화상자" data-path="dwe-os/legacy/images/system-properties-dialog.png" />
              </Step>

              <Step>
                `사용자 변수`의 `Path` 변수를 클릭하여 강조 표시한 다음, `사용자 변수` 상자 아래의 `편집...`을 클릭합니다.

                <img src="https://mintcdn.com/deepwaterexplorationinc/NrWVR9Qe6FWmBE6d/dwe-os/legacy/images/environment-variables-dialog.png?s=2d7ac09a6778fd1ceafd7a177335a9eb" width="80%" alt="환경 변수 대화상자" data-path="dwe-os/legacy/images/environment-variables-dialog.png" />
              </Step>

              <Step>
                새 창이 나타나면 `새로 만들기`를 클릭하고 bin 폴더 경로를 목록에 추가합니다. 이 예시의 경우 다음과 같습니다:

                ```
                C:\gstreamer\1.0\mingw_x86_64\bin
                ```

                bin 경로는 다를 수 있으며, 이전 단계에서 GStreamer를 설치한 위치에서 확인할 수 있습니다.

                <img src="https://mintcdn.com/deepwaterexplorationinc/NrWVR9Qe6FWmBE6d/dwe-os/legacy/images/environment-variables-dialog-2.png?fit=max&auto=format&n=NrWVR9Qe6FWmBE6d&q=85&s=84f2d6d273839b4a87e6f3346a66014b" width="80%" alt="두 번째 환경 변수 대화상자" data-path="dwe-os/legacy/images/environment-variables-dialog-2.png" />
              </Step>

              <Step>
                그 후, 두 창 모두에서 `확인`을 클릭하면 준비가 완료됩니다!
              </Step>
            </Steps>
          </Step>

          <Step title="완료!">
            이제 GStreamer 설정이 완료되어 다음 단계로 진행할 준비가 되었습니다!
          </Step>
        </Steps>
      </Tab>
    </Tabs>

    <Tip>
      GStreamer 설정을 확인하려면 `CMD`를 열고 다음을 실행합니다:

      ```sh theme={null}
      gst-launch-1.0 --version
      ```

      다음과 같은 출력이 표시되어야 합니다:

      ```sh theme={null}
      gst-launch-1.0 version 1.16.2
      GStreamer 1.16.2
      https://launchpad.net/distros/ubuntu/+source/gstreamer1.0
      ```
    </Tip>
  </Step>

  <Step title="GStreamer 명령줄용 변수 식별">
    연결된 장치의 비디오 스트림을 연결하려면, 먼저 dweOS를 구성합니다.

    <Steps>
      <Step>
        먼저 노트북/데스크톱의 IP 주소를 확인합니다. 이 주소를 dweOS 소프트웨어에 입력하게 됩니다.

        다음을 실행하여 확인할 수 있습니다:

        ```sh theme={null}
        ip addr
        ```

        많은 주소가 표시되지만, 특히 `inet` 뒤에 나오는 주소를 살펴보세요.
        <Tip>대부분의 경우 `192.168.x.xx` 형식입니다.</Tip>
      </Step>

      <Step>
        확인한 IP를 dweOS의 IP 주소 필드에 입력하고, 스트리밍 대상 포트를 적어 둡니다(기본값 5600).

        <Tip>
          필드를 채운 후 `(+)` 버튼으로 스트리밍 엔드포인트를 생성하는 것을 잊지 마세요!
        </Tip>

        이 예시에서 확인한 IP는 192.168.5.55이고 포트는 5600입니다.

        <img src="https://mintcdn.com/deepwaterexplorationinc/NrWVR9Qe6FWmBE6d/dwe-os/legacy/images/dwe-os-endpoints.png?fit=max&auto=format&n=NrWVR9Qe6FWmBE6d&q=85&s=eb7d2af6898b5fc125bae20ac92889e0" width="80%" alt="dweOS 엔드포인트" data-path="dwe-os/legacy/images/dwe-os-endpoints.png" />

        <Note>
          포트 필드가 5601로 설정되는 것은 프로그램에서 자동으로 표시되는 것이며, 실제로 스트리밍 중인 엔드포인트에만 카메라 아이콘과 삭제용 휴지통 버튼이 표시됩니다.
        </Note>
      </Step>

      <Step>
        GStreamer의 형식은 다음과 같습니다:

        ```sh theme={null}
        gst-launch-1.0 [FLAGS] [SOURCE] ! [FILTER] ! [SINK]
        ```

        <Callout icon="key" color="#FFC107" iconType="regular">
          포트를 염두에 두고, GStreamer 명령에서 알아두어야 할 매개변수가 몇 가지 있습니다.

          **중요 플래그**:

          * `-v`(Verbose): 스트림 정보를 출력하여 요소 간에 협상된 해상도/포맷을 확인할 수 있습니다.
          * `-e`(EOS - End of Stream): 녹화에 매우 중요합니다. 이 플래그 없이 Ctrl+C를 누르면 파일이 손상(헤더 누락)될 수 있습니다. 이 플래그는 깔끔한 종료를 강제합니다.
          * `--help-all`: 시스템에서 사용 가능한 모든 요소를 나열합니다.

          **소스(입력)**:

          * `videotestsrc`: 테스트 패턴(컬러 바, 노이즈 등)을 생성합니다.

          * *매개변수*: `pattern=smpte` (또는 `snow`, `ball` 등)

          * `autovideosrc` / `v4l2src`: 웹캠(Linux).

          * *매개변수*: `device=/dev/video0`

          * `filesrc`: 로컬 파일을 읽습니다.

          * *매개변수*: `location=./video.mp4`

          * `udpsrc`: UDP를 통해 네트워크 데이터를 수신합니다.
            * *매개변수*: `port=5600` (수신 포트).
            * *매개변수*: `caps="..."` (필수! 원시 바이트가 실제로 무엇인지 GStreamer에 알려줍니다).
            * *매개변수*: `buffer-size=524288` (고해상도 스트림에서 패킷 손실을 방지하기 위해 버퍼를 늘립니다).
              * H264의 표준 버퍼 크기는 `96`이고 MJPEG은 `26`입니다.

          **싱크(출력)**

          * `autovideosink`: 창을 열고 비디오를 재생합니다.

          * `fakesink`: 데이터를 폐기합니다(파이프라인이 오류 없이 실행되는지 테스트할 때 유용).

          * `filesink`: 파일에 씁니다.

          * *매개변수*: `location=output.mp4`

          * `udpsink`: 네트워크를 통해 스트리밍합니다.

          **필수 요소(필터/컨버터)**

          * `videoconvert`: 색공간을 변환합니다(예: YUV에서 RGB로). "could not link" 오류가 발생하면 중간에 삽입하세요.

          * `videoscale`: 비디오 크기를 조정합니다.

          * `capsfilter`: 특정 형식을 강제합니다. 구문: `video/x-raw,width=1920,height=1080`.

          * `rtp[format]depay`: 디페이로더. RTP 네트워크 패킷의 포장을 풀어 내부 스트림을 드러냅니다.
            * *예시*: `rtpjpegdepay` (MJPEG용), `rtph264depay` (H.264용).

          * `[format]dec`: 디코더. 비디오를 표시용 원시 픽셀로 압축 해제합니다.
            * *예시*: `jpegdec`, `avdec_h264`.
        </Callout>
      </Step>

      <Step>
        GStreamer를 테스트하기 위한 명령 예시 몇 가지입니다:

        **테스트 패턴**

        ```sh theme={null}
        gst-launch-1.0 -v videotestsrc ! videoconvert ! autovideosink
        ```

        **웹캠 표시(가능한 경우)**

        ```sh theme={null}
        gst-launch-1.0 -v v4l2src ! videoconvert ! autovideosink
        ```

        **웹캠을 720p 30fps로 강제**

        ```sh theme={null}
        gst-launch-1.0 -v v4l2src ! image/jpeg,width=1280,height=720,framerate=30/1 ! jpegdec ! videoconvert ! autovideosink
        ```

        <Note>
          고해상도의 경우, 비디오 출력은 보통 압축된 MJPEG입니다.

          `image/jpeg`는 카메라에서 오는 압축된 형식을 받아들입니다.

          `jpegdec`는 디코더를 추가하여 해당 JPEG 스트림을 원시 비디오로 되돌려 창에서 표시할 수 있게 합니다.
        </Note>

        **웹캠 녹화**

        ```sh theme={null}
        gst-launch-1.0 -e v4l2src ! videoconvert ! x264enc ! mp4mux ! filesink location=test.mp4
        ```

        <Note>
          이 명령은 백그라운드에서 녹화하며, 클립을 마치려면 `Ctrl + C`를 누르세요. 그러면 현재 디렉터리에 파일이 저장됩니다.

          이 예시에서 파일 이름은 `test.mp4`이며, `ls -lh test.mp4`로 존재를 확인할 수 있습니다.
        </Note>
      </Step>
    </Steps>
  </Step>

  <Step title="dweOS에서의 스트리밍 설정">
    GStreamer 명령에 대한 이해를 바탕으로, dweOS에 맞는 비디오 스트림을 설정해 보겠습니다.

    <Warning>
      스트리밍 엔드포인트의 IP에는 반드시 본인의 IP를 설정해야 한다는 점을 잊지 마세요!
    </Warning>

    dweOS에서 지정한 비디오 코덱(MJPEG / H264)에 따라 다음 중 하나를 실행합니다:

    **MJPEG**

    ```sh theme={null}
    gst-launch-1.0 udpsrc port=5600 caps="application/x-rtp, encoding-name=JPEG, payload=26" ! rtpjpegdepay ! jpegdec ! autovideosink
    ```

    **H264**

    ```sh theme={null}
    gst-launch-1.0 udpsrc port=5600 caps="application/x-rtp, encoding-name=H264, payload=96" ! rtph264depay ! avdec_h264 ! autovideosink
    ```

    <Warning>
      명령줄의 포트 번호는 반드시 스트리밍 대상 포트로 바꿔야 한다는 점을 잊지 마세요!
    </Warning>

    이제 카메라의 라이브 스트림이 창에 표시되어야 합니다!
  </Step>

  <Step title="녹화 설정">
    스트림을 녹화하려면, 다시 한번 비디오 코덱이 중요합니다!

    터미널에 다음과 비슷한 텍스트가 표시되면 스트림이 녹화되고 있음을 알 수 있습니다:

    <img src="https://mintcdn.com/deepwaterexplorationinc/NrWVR9Qe6FWmBE6d/dwe-os/legacy/images/gstreamer-recording.png?fit=max&auto=format&n=NrWVR9Qe6FWmBE6d&q=85&s=dc17f9d3c1c2346810c18865c8b8d007" width="80%" alt="GStreamer 녹화" data-path="dwe-os/legacy/images/gstreamer-recording.png" />

    **MJPEG**

    MKV용

    ```sh theme={null}
    gst-launch-1.0 -e udpsrc port=5600 caps="application/x-rtp, encoding-name=JPEG, payload=26" ! rtpjpegdepay ! jpegparse ! matroskamux ! filesink location=output_mjpeg.mkv
    ```

    <Note>
      위 줄은 MKV 형식용입니다. AVI는 GStreamer에서 다루기가 매우 까다로워 출력 데이터를 매우 특정한 방식으로 형식화해야 하기 때문입니다. 가능은 하지만, MJPEG에서 AVI로 변환하는 것은 기본 출력으로 사용하는 [Discovery](https://dwe.ai/products/discovery)에서 훨씬 간단합니다.
    </Note>

    **H264**

    MKV용

    ```sh theme={null}
    gst-launch-1.0 -e udpsrc port=5600 caps="application/x-rtp, encoding-name=H264, payload=96" ! rtph264depay ! h264parse ! matroskamux ! filesink location=output_h264.mkv
    ```

    MP4용

    ```sh theme={null}
    gst-launch-1.0 -e udpsrc port=5600 caps="application/x-rtp, encoding-name=H264, payload=96" ! rtph264depay ! h264parse ! video/x-h264,stream-format=avc ! mp4mux ! filesink location=video.mp4
    ```
  </Step>

  <Step title="완료!">
    훌륭합니다! 이제 GStreamer로 스트림과 녹화를 설정하기 위한 기본 요소를 모두 갖추셨습니다!
  </Step>
</Steps>

<Warning>
  경고:

  GStreamer에서는 단일 카메라 설정만으로도 이미 상당한 작업이 필요하며, 여러 스트림을 동시에 녹화하는 것도 상당한 작업과 개발이 필요합니다.

  카메라 구성이 복잡해진다면 [Discovery](https://dwe.ai/products/discovery) 사용을 권장합니다.
</Warning>

<Card title="Discovery 다운로드" icon="video" href="https://dwe.ai/products/discovery">
  잠수용 네트워크 비디오 스트림을 위한 올인원 멀티미디어 솔루션.
</Card>
