GStreamer: Difference between revisions

From NixOS Wiki
imported>Malteneuss
Initial working gstreamer flake
 
The missing plugins workaround was previously discussed in the forum. It wasn't working anymore so I wrote a paragraph about it with the current change that works.
 
(3 intermediate revisions by one other user not shown)
Line 1: Line 1:
[https://gstreamer.freedesktop.org/ GStreamer] is a popular multimedia framework to handle a variety of video and audio formats on different platforms in a uniform way through a powerful and convenient API in order to build multimedia apps, video/audio editors and streaming services. It consists of a huge amount low-level plugins like "videotestsrc", "videoconvert" and "autovideosink" as well as a few higher level test-and-combine framework tools like "gst-inspect", "gst-launch" etc.
== Installing via nixpkgs ==
In Nix as in other Linux distributions those tools and plugins are split  into separate packages, which you can bring together with a custom Nix shell environment:
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
# file: flake.nix
{
{
   description = "A GStreamer development flake";
   description = "A GStreamer development flake";
Line 14: Line 19:
           # Common plugins like "filesrc" to combine within e.g. gst-launch
           # Common plugins like "filesrc" to combine within e.g. gst-launch
           gst_all_1.gst-plugins-base
           gst_all_1.gst-plugins-base
          # Specialized plugins separated by quality
           gst_all_1.gst-plugins-good
           gst_all_1.gst-plugins-good
           gst_all_1.gst-plugins-bad
           gst_all_1.gst-plugins-bad
Line 21: Line 27:
           # Support the Video Audio (Hardware) Acceleration API
           # Support the Video Audio (Hardware) Acceleration API
           gst_all_1.gst-vaapi
           gst_all_1.gst-vaapi
          #...
         ];
         ];
       };
       };
Line 27: Line 34:


</syntaxhighlight>
</syntaxhighlight>
To activate this environment in your terminal run
<syntaxhighlight lang="nix">
$ nix develop
</syntaxhighlight>
You can find all available Nix package names through the [https://search.nixos.org/packages?query=gst_all_1. Nix search page].


== Test the installation ==
You can test that the <code>gst_all_1.gstreamer</code> tools are available by running a dummy pipeline
You can test that the <code>gst_all_1.gstreamer</code> tools are available by running a dummy pipeline
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
$ gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
</syntaxhighlight>
</syntaxhighlight>
which should open a colored video window.
which should open a colored video window.


You can test that the plugins like from <code>gst_all_1.gst-plugins-base</code> are known available by playing a video on you machine with
You can test that the plugins like from <code>gst_all_1.gst-plugins-base</code> are available to the higher level tools by inspecting such a base plugin like <code>filesrc</code> with
<syntaxhighlight lang="nix">
$ gst-inspect-1.0 filesrc
Factory Details:
  ...
  Long-name                File Source
  Description              Read from arbitrary point in a file
  ...
Plugin Details:
  Name                    coreelements
  Description              GStreamer core elements
  Filename                /nix/store/p39g1.../libgstcoreelements.so
  ...
</syntaxhighlight>
 
or by using it in a pipeline. Here, we could play a video from the local machine with
 
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
gst-launch-1.0 filesrc location=my_video.mp4 ! videoconvert ! autovideosink
$ gst-launch-1.0 filesrc location=my_video.mp4 ! videoconvert ! autovideosink
</syntaxhighlight>
</syntaxhighlight>
If the plugins are not correctly made available to the higher level tools, you'll get an error
<syntaxhighlight lang="nix">
$ gst-inspect-1.0 filesrc
No such element or plugin 'filesrc'
</syntaxhighlight>
== Troubleshooting ==
==== erroneous pipeline: no element "filesrc" ====
In some cases while creating a shell using "mkShell" or "writeShellApplication" just setting the "runtimeInputs" is not enough. It's necessary to manually set the "GST_PLUGIN_SYSTEM_PATH_1_0" environment variable.<ref>https://discourse.nixos.org/t/how-to-use-gst-plugins/6345</ref>
Adding the following export to your script, sets "gstreamer" and "gst-plugins-base" and "gst-plugins-good" paths. Similarly you can add any other "gst-plugins" package as well.
<syntaxhighlight lang="shell">
export GST_PLUGIN_SYSTEM_PATH_1_0="${gst_all_1.gstreamer.out}/lib/gstreamer-1.0:${gst_all_1.gst-plugins-base}/lib/gstreamer-1.0:${gst_all_1.gst-plugins-good}/lib/gstreamer-1.0"
</syntaxhighlight>Note: "gstreamer.out" is the derivative that contains "/lib" directory for that package.

Latest revision as of 19:20, 24 April 2024

GStreamer is a popular multimedia framework to handle a variety of video and audio formats on different platforms in a uniform way through a powerful and convenient API in order to build multimedia apps, video/audio editors and streaming services. It consists of a huge amount low-level plugins like "videotestsrc", "videoconvert" and "autovideosink" as well as a few higher level test-and-combine framework tools like "gst-inspect", "gst-launch" etc.

Installing via nixpkgs

In Nix as in other Linux distributions those tools and plugins are split into separate packages, which you can bring together with a custom Nix shell environment:

# file: flake.nix
{
  description = "A GStreamer development flake";

  outputs = { self, nixpkgs }:
    let
      system = "x86_64-linux";
      pkgs = nixpkgs.legacyPackages.${system};
    in {
      devShells.${system}.default = pkgs.mkShell {
        buildInputs = with pkgs; [
          # Video/Audio data composition framework tools like "gst-inspect", "gst-launch" ...
          gst_all_1.gstreamer
          # Common plugins like "filesrc" to combine within e.g. gst-launch
          gst_all_1.gst-plugins-base
          # Specialized plugins separated by quality
          gst_all_1.gst-plugins-good
          gst_all_1.gst-plugins-bad
          gst_all_1.gst-plugins-ugly
          # Plugins to reuse ffmpeg to play almost every video format
          gst_all_1.gst-libav
          # Support the Video Audio (Hardware) Acceleration API
          gst_all_1.gst-vaapi
          #...
        ];
      };
    };
}

To activate this environment in your terminal run

$ nix develop

You can find all available Nix package names through the Nix search page.

Test the installation

You can test that the gst_all_1.gstreamer tools are available by running a dummy pipeline

$ gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink

which should open a colored video window.

You can test that the plugins like from gst_all_1.gst-plugins-base are available to the higher level tools by inspecting such a base plugin like filesrc with

$ gst-inspect-1.0 filesrc
Factory Details:
  ...
  Long-name                File Source
  Description              Read from arbitrary point in a file
  ...
Plugin Details:
  Name                     coreelements
  Description              GStreamer core elements
  Filename                 /nix/store/p39g1.../libgstcoreelements.so
  ...

or by using it in a pipeline. Here, we could play a video from the local machine with

$ gst-launch-1.0 filesrc location=my_video.mp4 ! videoconvert ! autovideosink

If the plugins are not correctly made available to the higher level tools, you'll get an error

$ gst-inspect-1.0 filesrc
No such element or plugin 'filesrc'

Troubleshooting

erroneous pipeline: no element "filesrc"

In some cases while creating a shell using "mkShell" or "writeShellApplication" just setting the "runtimeInputs" is not enough. It's necessary to manually set the "GST_PLUGIN_SYSTEM_PATH_1_0" environment variable.[1]

Adding the following export to your script, sets "gstreamer" and "gst-plugins-base" and "gst-plugins-good" paths. Similarly you can add any other "gst-plugins" package as well.

export GST_PLUGIN_SYSTEM_PATH_1_0="${gst_all_1.gstreamer.out}/lib/gstreamer-1.0:${gst_all_1.gst-plugins-base}/lib/gstreamer-1.0:${gst_all_1.gst-plugins-good}/lib/gstreamer-1.0"

Note: "gstreamer.out" is the derivative that contains "/lib" directory for that package.