Skip to content

Instantly share code, notes, and snippets.

@corenel
Last active May 10, 2025 01:40
Show Gist options
  • Select an option

  • Save corenel/a615b6f7eb5b5425aa49343a7b409200 to your computer and use it in GitHub Desktop.

Select an option

Save corenel/a615b6f7eb5b5425aa49343a7b409200 to your computer and use it in GitHub Desktop.
Install NVDEC and NVENC as GStreamer plugins

Install NVDEC and NVENC as GStreamer plugins

Environment

  • Ubuntu 18.04
  • NVIDIA driver 460.32.03
  • NVIDIA Video Codec SDK 11.0.10
  • GStreamer 1.14.5

Steps

  1. Clone the gst-plugins-bad and check out to the same version as GStreamer installed on your PC
git clone git://anongit.freedesktop.org/gstreamer/gst-plugins-bad
cd gst-plugins-bad/
git checkout 1.14.5
  1. Download NVIDIA Video Codec SDK and copy header files
cd /path/to/video/codec/sdk
cp /usr/local/cuda/include/cuda.h /path/to/gst-plugins-bad/sys/nvenc
cp Interface/nvEncodeAPI.h /path/to/gst-plugins-bad/sys/nvenc
cp Interface/cuviddec.h /path/to/gst-plugins-bad/sys/nvdec
cp Interface/nvcuvid.h /path/to/gst-plugins-bad/sys/nvdec
  1. Build plugins
cd /path/to/gst-plugins-bad
NVENCODE_CFLAGS="-I/path/to/gst-plugins-bad/sys/nvenc" ./autogen.sh --with-cuda-prefix="/usr/local/cuda" --disable-gtk-doc
cd sys/nvenc
make
sudo cp .libs/libgstnvenc.so /usr/lib/x86_64-linux-gnu/gstreamer-1.0/
cd ../nvdec
make
sudo cp .libs/libgstnvdec.so /usr/lib/x86_64-linux-gnu/gstreamer-1.0/
  1. Check installation
gst-inspect-1.0 | grep nvenc
gst-inspect-1.0 | grep nvdec

References

@sujit25
Copy link
Copy Markdown

sujit25 commented Mar 31, 2020

Typo error:

  1. cp include/nvcuvid.h /path/to/gst-plugins-bad/sys/nvdec
  2. gst-inspect-1.0 | grep nvenc
  3. gst-inspect-1.0 | grep nvdec

However after installing, unable to see nvenc and nvdec.
image

@corenel
Copy link
Copy Markdown
Author

corenel commented Mar 31, 2020

Typo error:

  1. cp include/nvcuvid.h /path/to/gst-plugins-bad/sys/nvdec
  2. gst-inspect-1.0 | grep nvenc
  3. gst-inspect-1.0 | grep nvdec

However after installing, unable to see nvenc and nvdec.

image

Thanks for your correction.
These plugins in my PC is fine as follows:

$ gst-inspect-1.0 | grep nvenc
nvenc:  nvh264enc: NVENC H.264 Video Encoder
$ gst-inspect-1.0 | grep nvdec
nvdec:  nvdec: NVDEC video decoder

Could you check the installation location prefix of your GStreamer by where gst-inspect-1.0? Mine is /usr instead of /usr/local, so the plugin directory is /usr/lib/x86_64-linux-gnu/gstreamer-1.0/. Maybe your installation has another location.

Or you can check if these two plugins are blacklisted by gst-inspect-1.0 -b.

@muimota
Copy link
Copy Markdown

muimota commented Aug 23, 2020

It seems you are using anaconda which has it's own gstreamer included. check which one are you using with which gst-inspect-1.0

@sujit-dn
Copy link
Copy Markdown

Yeah, I agree. I deactivated conda base environment and it worked. Thanks a lot for assistance

@zshivers
Copy link
Copy Markdown

These instructions break with SDK 10, since they renamed include/ to Interface/.
I also found it helpful to add --disable-gtk-doc after ./autogen.sh to disable that dependency.

@cwlinghk
Copy link
Copy Markdown

how about h265? thanks

@HoangTienDuc
Copy link
Copy Markdown

how did you start streaming with python?

import cv2


url = "rtsp://admin:abcd1234@192.168.1.104:554/Streaming/Channels/101?transportmode=mcast&profile=Profile_1"
pipeline = 'rtspsrc location=%s latency=0 ! decodebin ! ' % url
# cvt_pipeline = (
#                 'nvvidconv !'
#                 'videoscale ! '
#                 'video/x-raw, width=(int)%d, height=(int)%d !'
#                 'videoconvert ! appsink sync=false'
#                 % (1920, 1080)
#                 )

cvt_pipeline = (
                # 'nvh264enc !'
                # 'nvh264dec !'
                'videoscale ! '
                'video/x-raw, width=(int)%d, height=(int)%d !'
                'videoconvert ! appsink sync=false'
                % (1920, 1080)
                )
cap = cv2.VideoCapture(pipeline + cvt_pipeline, cv2.CAP_GSTREAMER)

while True:
      ret,frame = cap.read()
      if not ret:
        print('empty frame')
        continue

i tried another way to add nvcodec but it failed

@HoangTienDuc
Copy link
Copy Markdown

HoangTienDuc commented Mar 30, 2021

/usr/bin/ld: cannot find -lnvidia-encode

i got error when make in sys/nvenc

cannot find -lnvcuvid

and onther error in sys/nvdec

@rlienlaf
Copy link
Copy Markdown

rlienlaf commented Apr 9, 2021

/usr/bin/ld: cannot find -lnvidia-encode

i got error when make in sys/nvenc

cannot find -lnvcuvid

and onther error in sys/nvdec

If you downloaded SDK 10 from nvidia-SDK you can find both .so inside Lib/linux/stubs/x86_64/ (for ubuntu18).
The correct way is probably to move both files to its corresponding locations. But what I did was to add "-L/path/to/nvidia-sdk/Lib/linux/stubs/x86_64/" to the variable "NVENCODE_LIBS" for sys/nvenc/Makefile and to the variable "libgstnvdec_la_LIBADD" for sys/nvdec/Makefile.

@tadam98
Copy link
Copy Markdown

tadam98 commented Aug 8, 2021

The below procesure fails on wsl2 over windows 11.

  1. There is probably a missing "make" after the ./autogen.sh. But running make fails with an error.
  2. gst-xxx are in /usr/lib/ but anyway we dont get there is make fails.

https://gist.github.com/corenel/a615b6f7eb5b5425aa49343a7b409200

$ cd Downloads
$ mkdir gstreamer
$ cd gstreamer

step 1

git clone git://anongit.freedesktop.org/gstreamer/gst-plugins-bad
cd gst-plugins-bad/
git checkout 1.14.5

step 2

https://developer.nvidia.com/nvidia-video-codec-sdk/download

/home/mickey/Downloads/gstreamer/Video_Codec_SDK_11.1.5

cd /home/mickey/Downloads/gstreamer/Video_Codec_SDK_11.1.5
cp /usr/local/cuda/include/cuda.h /home/mickey/Downloads/gstreamer/gst-plugins-bad/sys/nvenc/
cp Interface/nvEncodeAPI.h /home/mickey/Downloads/gstreamer/gst-plugins-bad/sys/nvenc/
cp Interface/cuviddec.h /home/mickey/Downloads/gstreamer/gst-plugins-bad/sys/nvenc/
cp Interface/nvcuvid.h /home/mickey/Downloads/gstreamer/gst-plugins-bad/sys/nvenc/

step 3

cd /home/mickey/Downloads/gstreamer/gst-plugins-bad/
NVENCODE_CFLAGS="-I/home/mickey/Downloads/gstreamer/gst-plugins-bad/sys/nvenc/" ./autogen.sh --with-cuda-prefix="/usr/local/cuda" --disable-gtk-doc
make # fails
error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.

cd /home/mickey/Downloads/gstreamer/gst-plugins-bad/sys/nvenc
make
#sudo cp .libs/libgstnvenc.so /usr/lib/x86_64-linux-gnu/gstreamer-1.0/
sudo cp .libs/libgstnvenc.so /usr/lib
cd ../nvdec
make
#sudo cp .libs/libgstnvdec.so /usr/lib/x86_64-linux-gnu/gstreamer-1.0/
sudo cp .libs/libgstnvdec.so /usr/lib/

@pringithub
Copy link
Copy Markdown

pringithub commented Dec 14, 2022

For future reference -
@tadam98 known issue that I ran into building on 20.04. Seemingly wasn't resolved? The hotfix is to remove references to openexr in the ./ext/Makefile (who uses openexr files anyway lol)
https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1117

Edit: this also is only an issue if you don't cd into /sys/nvenc and simply build from the root ... I guess I'm not the only one to miss that part?

@neilyoung
Copy link
Copy Markdown

Do you have a receipt for meson builds? 1.22 for instance is not having that ./autogen/make anymore

@danila-pavalotski
Copy link
Copy Markdown

Do you have a receipt for meson builds? 1.22 for instance is not having that ./autogen/make anymore

The same question.

@neilyoung
Copy link
Copy Markdown

Do you have a receipt for meson builds? 1.22 for instance is not having that ./autogen/make anymore

The same question.

Before I abandoned all attempts I found, that it is possible to change into subprojects/gst-plugins-bad and build from there

(I tried to compile on Jetson Nano, couldn't make it to have nvh264enc on Ubuntu 20.04, CUDA 12 and GST 1.22, I suppose this is not going to work at all since it would require a GST fork, which is made for the Jetson GPU)

@Vandor1
Copy link
Copy Markdown

Vandor1 commented Oct 31, 2023

Following all steps provided above I get the error when I try to make the 'sys/nvenc' directory:

  • Ubuntu version 20.08
  • Gsteamer version 1.16.3
  • Video Codec version 12.0

Anyone with a fix?

gstnvbaseenc.c:86:79: error: ‘NV_ENC_PRESET_DEFAULT_GUID’ undeclared (first use in this function); did you mean ‘NV_ENC_PRESET_P7_GUID’?
   86 | #define CASE(gst,nv) case G_PASTE(GST_NV_PRESET_,gst): return G_PASTE(G_PASTE(NV_ENC_PRESET_,nv),_GUID)
   
   gstnvbaseenc.c:131:72: error: ‘NV_ENC_PARAMS_RC_VBR_MINQP’ undeclared (first use in this function); did you mean ‘NV_ENC_PARAMS_RC_VBR’?
  131 | #define CASE(gst,nv) case G_PASTE(GST_NV_RC_MODE_,gst): return G_PASTE(NV_ENC_PARAMS_RC_,nv)

@Vandor1
Copy link
Copy Markdown

Vandor1 commented Nov 2, 2023

Following all steps provided above I get the error when I try to make the 'sys/nvenc' directory:

* Ubuntu version 20.08

* Gsteamer version 1.16.3

* Video Codec version 12.0

Anyone with a fix?

gstnvbaseenc.c:86:79: error: ‘NV_ENC_PRESET_DEFAULT_GUID’ undeclared (first use in this function); did you mean ‘NV_ENC_PRESET_P7_GUID’?
   86 | #define CASE(gst,nv) case G_PASTE(GST_NV_PRESET_,gst): return G_PASTE(G_PASTE(NV_ENC_PRESET_,nv),_GUID)
   
   gstnvbaseenc.c:131:72: error: ‘NV_ENC_PARAMS_RC_VBR_MINQP’ undeclared (first use in this function); did you mean ‘NV_ENC_PARAMS_RC_VBR’?
  131 | #define CASE(gst,nv) case G_PASTE(GST_NV_RC_MODE_,gst): return G_PASTE(NV_ENC_PARAMS_RC_,nv)

When running git checkout 1.14.5 make sure you are checkouting the version of your gstreamer. That solved my problem. I also used this guide to successfully get nvdec and nvh265enc + nvh264enc:
https://lifestyletransfer.com/how-to-install-nvidia-gstreamer-plugins-nvenc-nvdec-on-ubuntu/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment