GStreamer
GStreamer is a pipeline-based multimedia framework written in the C programming language with the type system based on GObject.
GStreamer allows a programmer to create a variety of media-handling components, including simple audio playback, audio and video playback, recording, streaming and editing. The pipeline design serves as a base to create many types of multimedia applications such as video editors, streaming media broadcasters, and media players.
Designed to be cross-platform, it is known to work on Linux (x86, PowerPC and ARM), Solaris (Intel and SPARC), macOS, Microsoft Windows and OS/400. GStreamer has bindings for programming-languages like Python, C++, Perl, GNU Guile (guile), and Ruby. GStreamer is free software, licensed under the GNU Lesser General Public License.
Installation
Install the gstreamer package.
To make GStreamer useful, install the plugins packages you require. See official documentation for list of features in each plugin.
- gst-libav - Libav-based plugin containing many decoders and encoders.
- gst-plugins-bad - Plugins that need more quality, testing or documentation.
- gst-plugins-base - Essential exemplary set of elements.
- gst-plugins-good - Good-quality plugins under LGPL license.
- gst-plugins-ugly - Good-quality plugins that might pose distribution problems.
- gst-plugin-libde265AUR - libde265 plugin (an open h.265 video codec implementation) for gstreamer.
Usage
Using gst-launch-1.0
A helpful tool of GStreamer is the gst-launch-1.0(1) command. It is an extremely versatile command line tool to create GStreamer pipelines. It is very similar to and can do many of the things the FFmpeg command can do. Here are some examples:
Convert an MP4 file to MKV:
$ gst-launch-1.0 filesrc location=source.mp4 ! qtdemux name=demux matroskamux name=mux ! filesink location=dest.mkv demux.audio_0 ! queue ! aacparse ! queue ! mux.audio_0 demux.video_0 ! queue ! h264parse ! queue ! mux.video_0
Using gst-discoverer-1.0
Another helpful tool is gst-discoverer-1.0(1), which is the GStreamer equivalent of FFmpeg's ffprobe(1).
Get info on a video file:
$ gst-discoverer-1.0 file.mp4
Properties:
  Duration: 0:02:55.613000000
  Seekable: yes
  Live: no
  container: Quicktime
    audio: MPEG-4 AAC
      Stream ID: c910ef2fa357f9f4ad365aebc98cfca88d23fdca99d832645f5113efa43b0cd3/002
      Language: <unknown>
      Channels: 2 (front-left, front-right)
      Sample rate: 44100
      Depth: 16
      Bitrate: 125588
      Max bitrate: 125588
    video: H.264 (Constrained Baseline Profile)
      Stream ID: c910ef2fa357f9f4ad365aebc98cfca88d23fdca99d832645f5113efa43b0cd3/001
      Width: 192
      Height: 144
      Depth: 24
      Frame rate: 15000/1001
      Pixel aspect ratio: 1/1
      Interlaced: false
      Bitrate: 107884
      Max bitrate: 107884
Integration
PulseAudio
PulseAudio support is provided by the gst-plugins-good package.
PipeWire
PipeWire support is provided by the gst-plugin-pipewire package.
KDE / Phonon integration
See Phonon.
Hardware video acceleration
See Hardware video acceleration.
GStreamer will automatically detect and use the correct API [1]. Depending on the system install:
- gstreamer-vaapi for VA-API support.
- gst-plugins-bad and nvidia-utils for NVDECODE/NVENCODE support.
Ignore driver whitelist
GStreamer uses a whitelist of VA-API drivers. To ignore the whitelist and allow support for other drivers, set GST_VAAPI_ALL_DRIVERS=1 as environment variable.
Verify VA-API support
To verify VA-API support:
$ gst-inspect-1.0 vaapi
Plugin Details: Name vaapi Description VA-API based elements Filename /usr/lib/gstreamer-1.0/libgstvaapi.so Version version License LGPL Source module gstreamer-vaapi Source release date date Binary package gstreamer-vaapi Origin URL https://archlinux.org/ vaapijpegdec: VA-API JPEG decoder vaapimpeg2dec: VA-API MPEG2 decoder vaapih264dec: VA-API H264 decoder vaapivc1dec: VA-API VC1 decoder vaapih265dec: VA-API H265 decoder vaapipostproc: VA-API video postprocessing vaapidecodebin: VA-API Decode Bin vaapisink: VA-API sink vaapih265enc: VA-API H265 encoder vaapih264enc: VA-API H264 encoder 10 features: +-- 10 elements
Verify NVDECODE/NVENCODE support
To verify NVDECODE/NVENCODE support:
$ gst-inspect-1.0 nvcodec
Plugin Details: Name nvcodec Description GStreamer NVCODEC plugin Filename /usr/lib/gstreamer-1.0/libgstnvcodec.so Version version License LGPL Source module gst-plugins-bad Source release date date Binary package GStreamer Bad Plugins (Arch Linux) Origin URL https://archlinux.org/ nvh265enc: NVENC HEVC Video Encoder nvh264enc: NVENC H.264 Video Encoder nvvp9dec: NVDEC vp9 Video Decoder nvvp8dec: NVDEC vp8 Video Decoder nvh265dec: NVDEC h265 Video Decoder nvh265sldec: NVDEC H.265 Stateless Decoder nvjpegdec: NVDEC jpeg Video Decoder nvh264dec: NVDEC h264 Video Decoder nvh264sldec: NVDEC H.264 Stateless Decoder nvmpeg4videodec: NVDEC mpeg4video Video Decoder nvmpeg2videodec: NVDEC mpeg2video Video Decoder nvmpegvideodec: NVDEC mpegvideo Video Decoder 12 features: +-- 12 elements
Set decoder ranks
For some NVIDIA users, gst-libav may prioritize the Libav decoder over nvcodec decoders which will inhibit hardware acceleration. The GST_PLUGIN_FEATURE_RANK environment variable can be used to rank decoders and thus alleviate this issue. See "GST_PLUGIN_FEATURE_RANK" in the documentation for more information. For example:
GST_PLUGIN_FEATURE_RANK=nvmpegvideodec:MAX,nvmpeg2videodec:MAX,nvmpeg4videodec:MAX,nvh264sldec:MAX,nvh264dec:MAX,nvjpegdec:MAX,nvh265sldec:MAX,nvh265dec:MAX,nvvp9dec:MAX
Those without AV1 hardware support may also want to disable AV1 decoders (e.g., for YouTube on webkit2gtk-based browsers) by appending avdec_av1:NONE and av1dec:NONE to the list above.
