---
title: "GStreamer"
date: 2020-02-08T20:46:36-05:00
draft: false
tags: [ "Audio-Video" ]
medium_enabled: true
---

GStreamer is a pipeline based multimedia framework that goes from capture, processing, to a sink such as a X window or UDP sink.

To install on Ubuntu run,

```bash
sudo apt install gstreamer1.0-tools
```

Pipelines are indicated via `!`.

To capture your webcam feed and display it in a X window, run the following:

```bash
gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! ximagesink
```

For the PiCar project I'm on, I need to send the video from the raspberry pi over the network as fast as possible. The next couple commands have options that reflect this.

On the PiCar, I send h264 video over the network. You might need to install an additional package for h264 encoding to work.

```bash
sudo apt install gstreamer1.0-plugins-ugly
```

To send h264 video over the network,

```bash
gst-launch-1.0 \
  v4l2src device=/dev/video0 ! \
  videoconvert ! \
  x264enc ! \
  rtph264pay ! \
  udpsink host=192.168.0.2 port=5000
```

To send it as fast as you can,

```bash
gst-launch-1.0 \
  v4l2src device=/dev/video0 ! \
  videoconvert ! \
  x264enc interlaced=true tune=zerolatency speed-preset=ultrafast ! \
  rtph264pay ! \
  udpsink host=192.168.0.2 port=5000
```

To send it as fast as possible under a given framerate (ex: 30)
```bash
gst-launch-1.0 \
  v4l2src device=/dev/video0 ! \
  videoconvert ! \
  videorate ! \
  video/x-raw,framerate=30/1 ! \
  x264enc interlaced=true tune=zerolatency speed-preset=ultrafast ! \
  rtph264pay ! \
  udpsink host=192.168.0.2 port=5000
```



To receive it and display it on an X-window,

```bash
gst-launch-1.0 \
  udpsrc port=5000 ! \
  application/x-rtp,payload=96 ! \
  rtph264depay ! \
  decodebin ! \
  videoconvert n-threads=4 ! \
  ximagesink
```

