From ProventusNova DeveloperWiki
Line 36: Line 36:
|}
|}


== 1️⃣ Pipelines ==
== 🎬 Pipelines ==
A '''pipeline''' is a set of connected elements that process multimedia in stages.
A '''pipeline''' is a sequence of connected elements that process multimedia in stages. GStreamer pipelines consist of:
* '''Source Elements''' – Generate or capture multimedia (e.g., <code>videotestsrc</code>, <code>filesrc</code>, <code>v4l2src</code>).
* '''Processing Elements''' – Modify or convert media (e.g., <code>videoconvert</code>, <code>decodebin</code>).
* '''Sink Elements''' – Output the final media to a display, file, or network (e.g., <code>autovideosink</code>, <code>filesink</code>).


'''Example:''' Generate and display a test video.
=== 🎥 Example 1: Generate and Display a Test Video ===
<pre>
<pre>
gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
</pre>
</pre>
* '''videotestsrc''' – Generates a test video.
* '''videoconvert''' – Ensures compatibility.
* '''autovideosink''' – Displays the video.


{| class="wikitable"
'''More Examples:'''
|+ '''Pipeline Parameters'''
* '''Play a Video File with Test Pattern Before Playback:'''
|-
! Element !! Description
|-
| <code>videotestsrc</code> || Generates a built-in test video (default: color bars)
|-
| <code>videoconvert</code> || Ensures video format compatibility
|-
| <code>autovideosink</code> || Displays the video output
|}

📡 '''Use case:''' Useful for testing pipelines without an actual video file or camera.

=== 🎥 Example 2: Play a Video File with a Test Pattern Before Playback ===
<pre>
<pre>
gst-launch-1.0 concat name=concat \
gst-launch-1.0 concat name=concat \
Line 55: Line 68:
concat. ! autovideosink
concat. ! autovideosink
</pre>
</pre>

{| class="wikitable"
|+ '''Pipeline Parameters'''
|-
! Element !! Description
|-
| <code>concat</code> || Plays elements sequentially (test pattern → video file)
|-
| <code>videotestsrc num-buffers=100</code> || Shows a test pattern for 100 frames (~3 sec)
|-
| <code>filesrc location=/path/to/video.mp4</code> || Reads the specified video file
|-
| <code>decodebin</code> || Automatically detects and decodes the video format
|-
| <code>autovideosink</code> || Displays the output
|}

📡 '''Use case:''' Preloading a test screen before switching to media content.

=== 🎥 Example 3: Live Camera Stream with a Test Pattern Before Switching ===
<pre>
gst-launch-1.0 input-selector name=selector ! videoconvert ! autovideosink \
videotestsrc ! videoconvert ! selector. \
v4l2src device=/dev/video0 ! videoconvert ! selector.
</pre>

{| class="wikitable"
|+ '''Pipeline Parameters'''
|-
! Element !! Description
|-
| <code>input-selector</code> || Manages multiple video sources and allows switching
|-
| <code>videotestsrc</code> || Displays a test pattern initially
|-
| <code>v4l2src device=/dev/video0</code> || Captures video from the camera (<code>/dev/videoX</code>)
|-
| <code>autovideosink</code> || Displays the selected video source
|}

📡 '''Use case:''' Preparing a UI where a test screen appears before switching to live video.

=== 🎥 Example 4: Live Camera Feed with Automatic Switching After a Delay ===
<pre>
gst-launch-1.0 concat name=concat ! videoconvert ! autovideosink \
videotestsrc num-buffers=100 ! concat. \
v4l2src device=/dev/video0 ! concat.
</pre>

{| class="wikitable"
|+ '''Pipeline Parameters'''
|-
! Element !! Description
|-
| <code>concat</code> || Automatically switches sources sequentially
|-
| <code>videotestsrc num-buffers=100</code> || Displays a test pattern for 100 frames (~3 sec)
|-
| <code>v4l2src device=/dev/video0</code> || Switches to live camera feed
|-
| <code>autovideosink</code> || Displays the output
|}

📡 '''Use case:''' Auto-switching from a test pattern to live video without manual input.

=== 🎥 Example 5: Simple Video Playback from File ===
<pre>
gst-launch-1.0 filesrc location=/home/YOUR_USERNAME/Videos/video.mp4 ! decodebin ! videoconvert ! autovideosink
</pre>

{| class="wikitable"
|+ '''Pipeline Parameters'''
|-
! Element !! Description
|-
| <code>filesrc location=/path/to/video.mp4</code> || Reads the specified video file
|-
| <code>decodebin</code> || Automatically detects and decodes the video format
|-
| <code>videoconvert</code> || Ensures compatibility with the sink
|-
| <code>autovideosink</code> || Displays the video
|}

📡 '''Use case:''' Basic video playback from a file.

=== 🎥 Example 6: Stream a Local Video File Over the Network ===
<pre>
gst-launch-1.0 filesrc location=/home/YOUR_USERNAME/Videos/video.mp4 ! decodebin ! videoconvert ! x264enc ! rtph264pay ! udpsink host=192.168.1.100 port=5000
</pre>

{| class="wikitable"
|+ '''Pipeline Parameters'''
|-
! Element !! Description
|-
| <code>filesrc location=/path/to/video.mp4</code> || Reads the specified video file
|-
| <code>decodebin</code> || Decodes the video into raw format
|-
| <code>videoconvert</code> || Ensures format compatibility
|-
| <code>x264enc</code> || Encodes raw video into H.264 format
|-
| <code>rtph264pay</code> || Packs H.264 data into RTP packets for streaming
|-
| <code>udpsink host=192.168.1.100 port=5000</code> || Sends the stream over UDP to another device
|}

📡 '''Use case:''' Streaming video over a network for playback on another device.

== 🔗 Summary ==
{| class="wikitable"
|+ '''Summary of Pipeline Examples'''
|-
! 🎥 Example !! 🎯 Function
|-
| '''Test Video Output''' || Displays a built-in test pattern (<code>videotestsrc</code>)
|-
| '''Preload Test Pattern → Play Video''' || Shows a test pattern before playing a file
|-
| '''Live Camera with Test Pattern''' || Starts with a test screen, then switches to a camera
|-
| '''Auto-Switching from Test Pattern to Camera''' || Uses <code>GstConcat</code> for timed source switching
|-
| '''Basic Video Playback''' || Plays a video file from disk
|-
| '''Streaming Over Network''' || Sends video as an RTP stream
|}


== 2️⃣ Elements ==
== 2️⃣ Elements ==

Revision as of 11:54, 24 February 2025

GStreamer Fundamentals

GStreamer is an open-source multimedia framework designed to build complex streaming and processing applications. It provides a **pipeline-based** architecture to process, transform, and transmit audio, video, and other data streams efficiently.

📌 What is GStreamer?

GStreamer is widely used for:

  • Media playback – Powering applications like VLC.
  • Streaming & Encoding – RTSP, H.264, WebRTC, and adaptive bitrate streaming.
  • AI & Computer Vision – Real-time image/video processing with deep learning.
  • Embedded Systems – Efficient multimedia processing for IoT/Edge devices.

🔗 Core Concepts

GStreamer consists of the following fundamental concepts:

GStreamer Core Concepts
Concept Description
Pipeline A sequence of connected elements that process data.
Elements The building blocks of pipelines, such as sources, filters, and sinks.
Pads Connection points between elements.
Bins Logical containers for grouping elements.
Caps & Caps Negotiation Ensures compatibility between linked elements.
Buffers Data packets moving through pipelines.
Events & Messages Communication within the pipeline.
Clock & Synchronization Ensures audio/video alignment.
Threading & Performance Manages efficient pipeline execution.

🎬 Pipelines

A pipeline is a sequence of connected elements that process multimedia in stages. GStreamer pipelines consist of:

  • Source Elements – Generate or capture multimedia (e.g., videotestsrc, filesrc, v4l2src).
  • Processing Elements – Modify or convert media (e.g., videoconvert, decodebin).
  • Sink Elements – Output the final media to a display, file, or network (e.g., autovideosink, filesink).

🎥 Example 1: Generate and Display a Test Video

gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
Pipeline Parameters
Element Description
videotestsrc Generates a built-in test video (default: color bars)
videoconvert Ensures video format compatibility
autovideosink Displays the video output

📡 Use case: Useful for testing pipelines without an actual video file or camera.

🎥 Example 2: Play a Video File with a Test Pattern Before Playback

gst-launch-1.0 concat name=concat \
  videotestsrc num-buffers=100 ! videoconvert ! concat. \
  filesrc location=/home/YOUR_USERNAME/Videos/video.mp4 ! decodebin ! videoconvert ! concat. \
  concat. ! autovideosink
Pipeline Parameters
Element Description
concat Plays elements sequentially (test pattern → video file)
videotestsrc num-buffers=100 Shows a test pattern for 100 frames (~3 sec)
filesrc location=/path/to/video.mp4 Reads the specified video file
decodebin Automatically detects and decodes the video format
autovideosink Displays the output

📡 Use case: Preloading a test screen before switching to media content.

🎥 Example 3: Live Camera Stream with a Test Pattern Before Switching

gst-launch-1.0 input-selector name=selector ! videoconvert ! autovideosink \
  videotestsrc ! videoconvert ! selector. \
  v4l2src device=/dev/video0 ! videoconvert ! selector.
Pipeline Parameters
Element Description
input-selector Manages multiple video sources and allows switching
videotestsrc Displays a test pattern initially
v4l2src device=/dev/video0 Captures video from the camera (/dev/videoX)
autovideosink Displays the selected video source

📡 Use case: Preparing a UI where a test screen appears before switching to live video.

🎥 Example 4: Live Camera Feed with Automatic Switching After a Delay

gst-launch-1.0 concat name=concat ! videoconvert ! autovideosink \
  videotestsrc num-buffers=100 ! concat. \
  v4l2src device=/dev/video0 ! concat.
Pipeline Parameters
Element Description
concat Automatically switches sources sequentially
videotestsrc num-buffers=100 Displays a test pattern for 100 frames (~3 sec)
v4l2src device=/dev/video0 Switches to live camera feed
autovideosink Displays the output

📡 Use case: Auto-switching from a test pattern to live video without manual input.

🎥 Example 5: Simple Video Playback from File

gst-launch-1.0 filesrc location=/home/YOUR_USERNAME/Videos/video.mp4 ! decodebin ! videoconvert ! autovideosink
Pipeline Parameters
Element Description
filesrc location=/path/to/video.mp4 Reads the specified video file
decodebin Automatically detects and decodes the video format
videoconvert Ensures compatibility with the sink
autovideosink Displays the video

📡 Use case: Basic video playback from a file.

🎥 Example 6: Stream a Local Video File Over the Network

gst-launch-1.0 filesrc location=/home/YOUR_USERNAME/Videos/video.mp4 ! decodebin ! videoconvert ! x264enc ! rtph264pay ! udpsink host=192.168.1.100 port=5000
Pipeline Parameters
Element Description
filesrc location=/path/to/video.mp4 Reads the specified video file
decodebin Decodes the video into raw format
videoconvert Ensures format compatibility
x264enc Encodes raw video into H.264 format
rtph264pay Packs H.264 data into RTP packets for streaming
udpsink host=192.168.1.100 port=5000 Sends the stream over UDP to another device

📡 Use case: Streaming video over a network for playback on another device.

🔗 Summary

Summary of Pipeline Examples
🎥 Example 🎯 Function
Test Video Output Displays a built-in test pattern (videotestsrc)
Preload Test Pattern → Play Video Shows a test pattern before playing a file
Live Camera with Test Pattern Starts with a test screen, then switches to a camera
Auto-Switching from Test Pattern to Camera Uses GstConcat for timed source switching
Basic Video Playback Plays a video file from disk
Streaming Over Network Sends video as an RTP stream

2️⃣ Elements

Elements are modular units that process multimedia.

Common Element Types:

GStreamer Elements
Type Function Example Elements
Sources Capture or generate media videotestsrc, filesrc, v4l2src
Filters Modify, convert, or process data videoconvert, audioconvert, capsfilter
Encoders Compress audio/video streams x264enc, vp8enc, opusenc
Sinks Output to display, file, or network autovideosink, filesink, udpsink

---

3️⃣ Pads & Caps Negotiation

Pads are the connection points between elements.

Pad Types:

  • Src Pad – Produces data (output).
  • Sink Pad – Receives data (input).

Example: Connecting Elements with Named Pads

gst-launch-1.0 videotestsrc ! decodebin name=decoder
decoder. ! videoconvert ! autovideosink
  • `decodebin` automatically detects and links the appropriate decoder.

Caps Negotiation

  • GStreamer determines the best format when connecting elements.
  • If formats don’t match, conversion elements (e.g., `videoconvert`) are needed.

Example: Checking Supported Formats (Caps)

gst-inspect-1.0 videotestsrc | grep "Caps"

---

4️⃣ Bins

Bins are containers that manage multiple elements as a single unit.

Example: Using a Bin for Video Playback with a Test Pattern

gst-launch-1.0 playbin uri=file:///path/to/video.mp4 \
   videotestsrc ! videoconvert ! autovideosink

---

5️⃣ Buffers

Buffers are units of data that flow through a pipeline.

Example: Adding a Queue for Buffering

gst-launch-1.0 videotestsrc ! decodebin ! queue ! videoconvert ! autovideosink
  • `queue` prevents bottlenecks, ensuring smooth playback.

---

6️⃣ Events & Messages

Elements send events and messages to control pipeline behavior.

Common Events:

  • EOS (End of Stream) – Signals the pipeline has finished processing.
  • Seek Events – Move to a specific position in a media stream.

Example: Detecting End of Stream

gst-launch-1.0 videotestsrc num-buffers=100 ! videoconvert ! autovideosink

---

7️⃣ Clock & Synchronization

Synchronization ensures that **audio and video stay in sync**.

  • GStreamer uses a global clock for timekeeping.
  • Timestamping enables frame-accurate synchronization.

Example: Playing Video and Audio Streams Together with a Test Pattern

gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink \
   filesrc location=video.mp4 ! decodebin ! videoconvert ! autovideosink \
   audiotestsrc ! audioconvert ! autoaudiosink

---

8️⃣ Threading & Performance Optimization

GStreamer supports **multi-threaded** pipelines for improved performance.

Best Practices for Performance Optimization

  • Use Queues – Separates processing threads.
  • Enable Hardware Acceleration – Utilize GPU-based processing.
  • Reduce Memory Copies – Use `dmabuf` for zero-copy data transfer.

Example: Adding Queues for Parallel Processing with Test Video

gst-launch-1.0 videotestsrc ! decodebin ! queue ! videoconvert ! autovideosink

---

📌 Common Issues & Troubleshooting

🔴 Issue: No Video Output

  • Run `gst-inspect-1.0 autovideosink` to check if the sink is installed.

🔴 Issue: Format Not Supported

  • Use `gst-inspect-1.0 decodebin` to check supported formats.

🔴 Issue: High CPU Usage

  • Use `gst-launch-1.0 --gst-debug-level=3` to analyze pipeline performance.

---

💡 Practical Use Cases

GStreamer is widely used in:

  • Media Players – VLC and other media applications.
  • Live Streaming – RTSP, WebRTC, adaptive bitrate streaming.
  • AI & Computer Vision – Image recognition, real-time processing.
  • Embedded Systems – Optimized multimedia processing on IoT/Edge devices.

---

🚀 Next Steps

Now that you've covered the fundamentals, explore:

---

📖 References