> ## 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 a GStreamer

> Esta guía te ayuda a configurar la transmisión desde dweOS con GStreamer.

<Warning>
  dweOS no admite oficialmente la transmisión con GStreamer. Los siguientes pasos son solo para Linux y Windows.

  NOTA: la calidad de la transmisión puede verse afectada.
</Warning>

<Danger>
  GStreamer puede ser muy complejo/elaborado, incluso para configurar un solo flujo de video. La mayoría de las funciones de comodidad, como los flujos múltiples y las grabaciones en vivo, son mucho más sencillas y cuentan con una interfaz de usuario en [Discovery](https://dwe.ai/products/discovery).
</Danger>

<Steps>
  <Step title="Verificar dweOS">
    Después de seguir la configuración de dweOS, continúa con los siguientes pasos.

    <Note>
      Anota el/los puerto(s) a los que se está transmitiendo.
    </Note>
  </Step>

  <Step title="Instalar GStreamer">
    <Tabs>
      <Tab title="Para Linux">
        En la terminal, ejecuta:

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

        Luego ejecuta lo siguiente para instalar 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="Para Windows">
        <Steps>
          <Step title="Instalar GStreamer">
            <Card title="Descargar el framework GStreamer" icon="stream" href="https://gstreamer.freedesktop.org/download/#windows">
              Haz clic aquí para descargar GStreamer para escritorio en tu portátil/PC.

              <Note>
                Asegúrate de descargar la versión MinGW, e instala tanto el runtime como el development.
              </Note>
            </Card>

            <Tip>
              En caso de duda, instala la versión de 64 bits, ya que es la más común.
            </Tip>

            <Warning>
              GStreamer se instalaría automáticamente en la unidad D si tienes más de una unidad en tu PC. Puedes cambiarlo a la unidad C al realizar una instalación personalizada.

              Si lo instalas en la unidad D, simplemente ten esto en cuenta al configurar tus variables de entorno a continuación.
            </Warning>
          </Step>

          <Step title="Configurar las variables de entorno">
            <Steps>
              <Step>
                Para acceder a las variables de entorno, pulsa `Win + R`
              </Step>

              <Step>
                Escribe:

                ```
                SystemPropertiesAdvanced
                ```

                y pulsa `Enter`
              </Step>

              <Step>
                Haz clic en `Variables de entorno...`

                <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="Cuadro de diálogo Propiedades del sistema" data-path="dwe-os/legacy/images/system-properties-dialog.png" />
              </Step>

              <Step>
                Resalta la variable `Path` bajo `Variables de usuario` haciendo clic en ella y luego haz clic en `Editar…` bajo el cuadro `Variables de usuario`.

                <img src="https://mintcdn.com/deepwaterexplorationinc/NrWVR9Qe6FWmBE6d/dwe-os/legacy/images/environment-variables-dialog.png?s=2d7ac09a6778fd1ceafd7a177335a9eb" width="80%" alt="Cuadro de diálogo Variables de entorno" data-path="dwe-os/legacy/images/environment-variables-dialog.png" />
              </Step>

              <Step>
                Aparecerá una nueva ventana y debes hacer clic en `Nuevo` y añadir una ruta a tu carpeta bin en la lista. En este caso, es:

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

                La ruta a tu bin puede variar y se encuentra en la ubicación donde instalaste GStreamer en los pasos anteriores.

                <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="Segundo cuadro de diálogo Variables de entorno" data-path="dwe-os/legacy/images/environment-variables-dialog-2.png" />
              </Step>

              <Step>
                Después, haz clic en `Aceptar` en ambas ventanas y ¡todo debería estar listo!
              </Step>
            </Steps>
          </Step>

          <Step title="¡Éxito!">
            ¡Ahora deberías tener GStreamer configurado y listo para los próximos pasos!
          </Step>
        </Steps>
      </Tab>
    </Tabs>

    <Tip>
      Para verificar la instalación de GStreamer, abre `CMD` y ejecuta:

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

      Esto debería mostrar algo como:

      ```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="Identificar las variables para la línea de comandos de GStreamer">
    Para vincular los flujos de video de los dispositivos conectados, primero configurarás dweOS.

    <Steps>
      <Step>
        Primero, identifica la dirección IP de tu portátil/escritorio, que introduciremos en el software dweOS.

        Esto se puede hacer ejecutando lo siguiente:

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

        Verás muchas direcciones; búscalas, en particular las direcciones que siguen al texto:
        `inet`.
        <Tip>Lo más probable es que tenga el formato `192.168.x.xx`</Tip>
      </Step>

      <Step>
        Deberás reemplazar la IP recopilada en dweOS bajo Dirección IP y anotar el puerto al que estás transmitiendo. (5600 por defecto)

        <Tip>
          ¡Recuerda crear el punto de conexión de streaming con el botón `(+)` una vez que se hayan rellenado los campos!
        </Tip>

        En este ejemplo, la IP recopilada es 192.168.5.55 y el puerto es 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="Endpoints de dweOS" data-path="dwe-os/legacy/images/dwe-os-endpoints.png" />

        <Note>
          El campo Puerto establecido en 5601 es automático con el programa; el único endpoint al que se está transmitiendo tiene el ícono de cámara al lado y un botón de papelera para eliminarlo.
        </Note>
      </Step>

      <Step>
        El formato de GStreamer es el siguiente:

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

        <Callout icon="key" color="#FFC107" iconType="regular">
          Teniendo en cuenta el puerto, hay algunos parámetros del comando GStreamer que debes conocer.

          **Flags vitales**:

          * `-v` (Verbose): imprime información del flujo para que puedas ver la resolución/el formato negociado entre elementos.
          * `-e` (EOS - End of Stream): crucial para la grabación. Si pulsas Ctrl+C sin este flag, tu archivo podría corromperse (encabezados faltantes). Este flag fuerza un cierre limpio.
          * `--help-all`: lista todos los elementos disponibles en tu sistema.

          **Sources (entrada)**:

          * `videotestsrc`: genera un patrón de prueba (barras de color, estática, etc.).

          * *Parámetro*: `pattern=smpte` (o `snow`, `ball`, etc.)

          * `autovideosrc` / `v4l2src`: tu webcam (Linux).

          * *Parámetro*: `device=/dev/video0`

          * `filesrc`: lee un archivo local.

          * *Parámetro*: `location=./video.mp4`

          * `udpsrc`: recibe datos por la red mediante UDP.
            * *Parámetro*: `port=5600` (el puerto en el que se escucha).
            * *Parámetro*: `caps="..."` (¡Esencial! Indica a GStreamer qué son realmente los bytes en bruto).
            * *Parámetro*: `buffer-size=524288` (aumenta el búfer para evitar la pérdida de paquetes en flujos de alta resolución).
              * Los tamaños de búfer estándar para H264 son `96` y para MJPEG `26`

          **Sinks (salida)**

          * `autovideosink`: abre una ventana y reproduce el video.

          * `fakesink`: descarta datos (útil para probar si una tubería se ejecuta sin errores).

          * `filesink`: escribe en un archivo.

          * *Parámetro*: `location=output.mp4`

          * `udpsink`: transmite por la red.

          **Esenciales (filtros/convertidores)**

          * `videoconvert`: convierte espacios de color (por ejemplo, de YUV a RGB). Si obtienes un error "could not link", ponlo en el medio.

          * `videoscale`: redimensiona el video.

          * `capsfilter`: fuerza un formato específico. Sintaxis: `video/x-raw,width=1920,height=1080`.

          * `rtp[format]depay`: despaquetador. Desempaqueta los paquetes de red RTP para revelar el flujo interior.
            * *Ejemplos*: `rtpjpegdepay` (para MJPEG), `rtph264depay` (para H.264).

          * `[format]dec`: decodificador. Descomprime el video en píxeles brutos para su visualización.
            * *Ejemplos*: `jpegdec`, `avdec_h264`.
        </Callout>
      </Step>

      <Step>
        Aquí tienes algunas líneas de ejemplo para probar tu GStreamer:

        **Patrón de prueba**

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

        **Visualización de webcam (si está disponible)**

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

        **Forzar webcam a 720p 30 fps**

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

        <Note>
          Para resoluciones más altas, la salida de video suele ser MJPEG comprimido.

          `image/jpeg` acepta el formato comprimido de la cámara.

          `jpegdec` añade un decodificador para convertir ese flujo JPEG en video sin procesar para que la ventana pueda mostrarlo.
        </Note>

        **Grabar la webcam**

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

        <Note>
          Esto grabará en segundo plano; para terminar el clip, pulsa `Ctrl + C` y estará en el directorio actual.

          En este caso, el archivo se llama `test.mp4`, cuya existencia podemos comprobar con `ls -lh test.mp4`.
        </Note>
      </Step>
    </Steps>
  </Step>

  <Step title="Configurar la transmisión desde dweOS">
    Con una comprensión de los comandos GStreamer, podemos comenzar a configurar el flujo de video específicamente con dweOS.

    <Warning>
      ¡Recuerda establecer tu propia IP como la IP en el endpoint de streaming!
    </Warning>

    Según el códec de video (MJPEG / H264) especificado en dweOS, ejecuta cualquiera de los siguientes:

    **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>
      ¡Recuerda reemplazar el número de puerto en la línea de comandos por el puerto al que se está transmitiendo!
    </Warning>

    ¡Ahora deberías tener una transmisión en vivo de tu cámara en una ventana!
  </Step>

  <Step title="Configurar la grabación">
    ¡Para grabar una transmisión, una vez más el códec de video importa!

    Sabrás que se está grabando una transmisión si tu terminal contiene texto similar a este:

    <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="Grabación con GStreamer" data-path="dwe-os/legacy/images/gstreamer-recording.png" />

    **MJPEG**

    Para 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>
      La línea anterior es para un formato MKV, ya que AVI es increíblemente delicado con GStreamer y requiere que los datos de salida estén formateados de manera muy específica. Aunque es posible, MJPEG a AVI es mucho más sencillo en [Discovery](https://dwe.ai/products/discovery), ya que es la salida predeterminada.
    </Note>

    **H264**

    Para 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
    ```

    Para 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="¡Éxito!">
    ¡Maravilloso! ¡Ahora deberías tener los componentes básicos para configurar una transmisión y una grabación con GStreamer!
  </Step>
</Steps>

<Warning>
  Advertencia:

  Con GStreamer, la configuración de una sola cámara ya requiere bastante trabajo,
  y grabar varios flujos a la vez también requeriría bastante trabajo
  y desarrollo.

  Recomendamos [Discovery](https://dwe.ai/products/discovery) si tus configuraciones de cámaras se vuelven complejas.
</Warning>

<Card title="Descargar Discovery" icon="video" href="https://dwe.ai/products/discovery">
  La solución multimedia todo en uno para flujos de video de red submarinos.
</Card>
