GStreamer: Difference between revisions

imported>Malteneuss
Add error example
DHCP (talk | contribs)
m replace lang=nix with lang=console for shell commands
 
(17 intermediate revisions by 6 users not shown)
Line 3: Line 3:
== Installing via nixpkgs ==
== 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:
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">
 
# file: flake.nix
{{File|3={
{
   description = "A GStreamer development flake";
   description = "A GStreamer development flake";


Line 31: Line 30:
       };
       };
     };
     };
}
}|name=/etc/nixos/flake.nix|lang=nix}}


</syntaxhighlight>
To activate this environment in your terminal run
To activate this environment in your terminal run
<syntaxhighlight lang="nix">
<syntaxhighlight lang=console>
$ nix develop  
$ nix develop  
</syntaxhighlight>
</syntaxhighlight>
Line 42: Line 40:
== Test the installation ==
== 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=console>
$ gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
$ gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
</syntaxhighlight>
</syntaxhighlight>
Line 48: Line 46:


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
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">
<syntaxhighlight lang=console>
$ gst-inspect-1.0 filesrc
$ gst-inspect-1.0 filesrc
Factory Details:
Factory Details:
Line 58: Line 56:
   Name                    coreelements
   Name                    coreelements
   Description              GStreamer core elements
   Description              GStreamer core elements
   Filename                /nix/store/p39g1gmpymya3blmqxmf54bpvv3s9z61-gstreamer-1.20.3/lib/gstreamer-1.0/libgstcoreelements.so
   Filename                /nix/store/p39g1.../libgstcoreelements.so
   ...
   ...
</syntaxhighlight>
</syntaxhighlight>


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


<syntaxhighlight lang="nix">
<syntaxhighlight lang=console>
$ 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
If the plugins are not correctly made available to the higher level tools, you'll get an error
<syntaxhighlight lang="nix">
<syntaxhighlight lang=console>
$ gst-inspect-1.0 filesrc
$ gst-inspect-1.0 filesrc
No such element or plugin 'filesrc'
No such element or plugin 'filesrc'
</syntaxhighlight>
</syntaxhighlight>


You could try setting the plugin path environment variable manually as described [https://discourse.nixos.org/t/how-to-use-gst-plugins/6345/2 here].
== 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="bash">
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.
<references />
 
==== nautilus: "Your GStreamer installation is missing a plug-in." ====
[[File:Screenshot From 2025-03-28 09-58-50.png|thumb|nautilus: "Your GStreamer installation is missing a plug-in."]]
To fix the issue I found the following solutions:
 
* Using <code>nix-shell</code>:
<syntaxhighlight lang=console>
$ nix-shell -p gst_all_1.gstreamer gst_all_1.gst-plugins-base gst_all_1.gst-plugins-good gst_all_1.gst-plugins-bad gst_all_1.gst-plugins-ugly gst_all_1.gst-libav gst_all_1.gst-vaapi --run "nautilus"
</syntaxhighlight>
* Using the environment variable "<code>GST_PLUGIN_PATH</code>":[[File:Screenshot From 2025-03-28 12-51-31.png|thumb|"Audio and Video Properties" of "Properties" window of nautilus after fix]]{{File|3={ config, pkgs, ... }:
 
{
  environment.systemPackages = with pkgs; [
    gst_all_1.gstreamer
    gst_all_1.gst-plugins-base
    gst_all_1.gst-plugins-good
    gst_all_1.gst-plugins-bad
    gst_all_1.gst-plugins-ugly
    gst_all_1.gst-libav
    gst_all_1.gst-vaapi
  ];
 
  environment.variables = {
    GST_PLUGIN_PATH = "/run/current-system/sw/lib/gstreamer-1.0/";
  };
}|name=/etc/nixos/configuration.nix|lang=nix}} {{Evaluate|boot}}
 
[[Category:Video]]
[[Category:Audio]]