Jump to content

NVIDIA GPU acceleration for transcoding


Paweł K.

Recommended Posts

Posted

I'm trying to figure out how to configure ffmpegprefs.ini to use GPU of nvidia card to transcode stream

I've modify ffmpegprefs.ini according to wiki HWAccelIntro,  unfortunately streaming not working

 

As a client I'm using Kodi 17,3

 

[TS HD 3600 kbit]
Cmd=-analyzeduration {analyzeduration} {offset} {realtime} -i "{infile}" -f mpegts -pat_period 0.2 -hwaccel cuvid -c:v h264_cuvid -bufsize 6400k -maxrate 3200k -crf 20 -g 50 {framerate} -map 0:v:0 -map 0:a:0 -vf "yadif=0:-1:1, scale={scalex}:{scaley}" -preset {vpreset} -tune film -vprofile main -level 30 -acodec libmp3lame -ab 128k -ar 44100 -ac 2 -async 1 -y "{outfile}"
maxWidth=1280
maxHeight=720
MimeType=video/mpeg
Ext=.ts
Delay=2000

Anyone have idea how to modify ffmpegprefs.ini to use GPU to transcoding ?

  • 1 month later...
Posted

Don't use the -hwaccel option !

Use the -c:v h264_nvenc codec for NVIDIA GPU encoding ...

The command line syntax for the codec are as follows :

Encoder h264_nvenc [NVIDIA NVENC H.264 encoder]:
    General capabilities: delay 
    Threading capabilities: none
    Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda d3d11
h264_nvenc AVOptions:
  -preset            <int>        E..V.... Set the encoding preset (from 0 to 11) (default medium)
     default                      E..V.... 
     slow                         E..V.... hq 2 passes
     medium                       E..V.... hq 1 pass
     fast                         E..V.... hp 1 pass
     hp                           E..V.... 
     hq                           E..V.... 
     bd                           E..V.... 
     ll                           E..V.... low latency
     llhq                         E..V.... low latency hq
     llhp                         E..V.... low latency hp
     lossless                     E..V.... 
     losslesshp                   E..V.... 
  -profile           <int>        E..V.... Set the encoding profile (from 0 to 3) (default main)
     baseline                     E..V.... 
     main                         E..V.... 
     high                         E..V.... 
     high444p                     E..V.... 
  -level             <int>        E..V.... Set the encoding level restriction (from 0 to 51) (default auto)
     auto                         E..V.... 
     1                            E..V.... 
     1.0                          E..V.... 
     1b                           E..V.... 
     1.0b                         E..V.... 
     1.1                          E..V.... 
     1.2                          E..V.... 
     1.3                          E..V.... 
     2                            E..V.... 
     2.0                          E..V.... 
     2.1                          E..V.... 
     2.2                          E..V.... 
     3                            E..V.... 
     3.0                          E..V.... 
     3.1                          E..V.... 
     3.2                          E..V.... 
     4                            E..V.... 
     4.0                          E..V.... 
     4.1                          E..V.... 
     4.2                          E..V.... 
     5                            E..V.... 
     5.0                          E..V.... 
     5.1                          E..V.... 
  -rc                <int>        E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1)
     constqp                      E..V.... Constant QP mode
     vbr                          E..V.... Variable bitrate mode
     cbr                          E..V.... Constant bitrate mode
     vbr_minqp                    E..V.... Variable bitrate mode with MinQP (deprecated)
     ll_2pass_quality              E..V.... Multi-pass optimized for image quality (deprecated)
     ll_2pass_size                E..V.... Multi-pass optimized for constant frame size (deprecated)
     vbr_2pass                    E..V.... Multi-pass variable bitrate mode (deprecated)
     cbr_ld_hq                    E..V.... Constant bitrate low delay high quality mode
     cbr_hq                       E..V.... Constant bitrate high quality mode
     vbr_hq                       E..V.... Variable bitrate high quality mode
  -rc-lookahead      <int>        E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
  -surfaces          <int>        E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
  -cbr               <boolean>    E..V.... Use cbr encoding mode (default false)
  -2pass             <boolean>    E..V.... Use 2pass encoding mode (default auto)
  -gpu               <int>        E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
     any                          E..V.... Pick the first device available
     list                         E..V.... List the available devices
  -delay             <int>        E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
  -no-scenecut       <boolean>    E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
  -forced-idr        <boolean>    E..V.... If forcing keyframes, force them as IDR frames. (default false)
  -b_adapt           <boolean>    E..V.... When lookahead is enabled, set this to 0 to disable adaptive B-frame decision (default true)
  -spatial-aq        <boolean>    E..V.... set to 1 to enable Spatial AQ (default false)
  -temporal-aq       <boolean>    E..V.... set to 1 to enable Temporal AQ (default false)
  -zerolatency       <boolean>    E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
  -nonref_p          <boolean>    E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
  -strict_gop        <boolean>    E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
  -aq-strength       <int>        E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
  -cq                <float>      E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
  -aud               <boolean>    E..V.... Use access unit delimiters (default false)
  -bluray-compat     <boolean>    E..V.... Bluray compatibility workarounds (default false)
  -init_qpP          <int>        E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
  -init_qpB          <int>        E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
  -init_qpI          <int>        E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
  -qp                <int>        E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
  -weighted_pred     <int>        E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)
  -coder             <int>        E..V.... Coder type (from -1 to 2) (default default)
     default                      E..V.... 
     auto                         E..V.... 
     cabac                        E..V.... 
     cavlc                        E..V.... 
     ac                           E..V.... 
     vlc                          E..V.... 

well, don't ask me for details.

Here is no NVIDA GPU on my systems ...

 

Posted

you may have to test this commandline :

(if does not work, use the software decoding -> remove "-hwaccel cuvid -c:v h264_cuvid" from the command line

 

 

[TS HD 3600 kbit]
Cmd=-analyzeduration {analyzeduration} {offset} {realtime} -hwaccel cuvid -c:v h264_cuvid -i "{infile}" -f mpegts -pat_period 0.2 -c:v h264_nvenc -bufsize 6400k -maxrate 3200k -crf 20 -g 50 {framerate} -map 0:v:0 -map 0:a:0 -vf "yadif=0:-1:1, scale={scalex}:{scaley}" -preset {vpreset} -tune film -vprofile main -level 30 -acodec libmp3lame -ab 128k -ar 44100 -ac 2 -async 1 -y "{outfile}"
maxWidth=1280
maxHeight=720
MimeType=video/mpeg
Ext=.ts
Delay=2000
  • 3 weeks later...
Posted

Hi.

1. If it possible to add {IF} {End If} statement in "Cmd=" line of  ffmpegprefs.ini file? as it done in Tasks (to generate mkv).

To get full HW transcode on NVIDIA GPU, I use two separate lines, one is for H264 sourse dvb TS stream, second is for MPEG2 source dvb TS stream:

[TS H264 HD 3600 kbit]
Cmd=-analyzeduration {analyzeduration} {offset} {realtime} -hwaccel cuvid -c:v h264_cuvid -dent 2 -drop_second_field 1 -i "{infile}" -f mpegts -pat_period 0.2 -c:v h264_nvenc -bufsize 6400k -maxrate 3200k -rc vbr_hq -cq 1 -g 50 {framerate} -map 0:v:0 -map 0:a:0 -preset slow -vprofile high -level 30 -acodec libmp3lame -ab 128k -ar 44100 -ac 2 -async 1 -y "{outfile}"
maxWidth=1280
maxHeight=720
MimeType=video/mpeg
Ext=.ts

 

[TS MPEG2 HD 3600 kbit]
Cmd=-analyzeduration {analyzeduration} {offset} {realtime} -hwaccel cuvid -c:v mpeg2_cuvid -dent 2 -drop_second_field 1 -i "{infile}" -f mpegts -pat_period 0.2 -c:v h264_nvenc -bufsize 6400k -maxrate 3200k -rc vbr_hq -cq 1 -g 50 {framerate} -map 0:v:0 -map 0:a:0 -preset slow -vprofile high -level 30 -acodec libmp3lame -ab 128k -ar 44100 -ac 2 -async 1 -y "{outfile}"
maxWidth=1280
maxHeight=720
MimeType=video/mpeg
Ext=.ts

2. Where I can change -preset {vpreset} list? veryfast, ultrafast, placebo ...etc, are not available for h264_nvenc, but this API encoder has their own preset list: slow, medium, hq, llhq ...etc.

Posted
4 hours ago, yakov2905 said:

If it possible to add {IF} {End If} statement in "Cmd=" line of  ffmpegprefs.ini file?

 

No. Only conditions supported by FFmpeg are available in the commandline.

 

4 hours ago, yakov2905 said:

Where I can change -preset {vpreset} list?

 

It is not configurable.

 

  • 7 months later...
Posted

Does this mean that it isn't possible to use NVIDIA HW acceleration ? I am also using Kodi as front end and I am looking for the right transcoding parameters to use HW accelaration...

  • 5 years later...
Posted (edited)

I am coming back to this thread as I just added an GTX 1050 Ti card (which provides "h264_nvenc") to my system (Windows Server 2016).

Installation of the card went well and I am able to use GPU transcoding with Plex.

 

However I cannot get it to work with ffmpeg Version 6.1.1 (which is compiled with --enable-nvenc from here).

I have tried the command lines from @yakov2905 but it is not working.

 

Edited by esackbauer
Posted (edited)

I made a little progress, but it is not working yet.

 

I found out that I need to use an older ffmpeg version 5.1.2-full as this is the last one compatible with the standard GPU drivers available (Windows Server 2016 does not support DCH drivers).

I can create a stream and save it to a file, with this command:

 

ffmpeg -analyzeduration 1500k   -i "http://127.0.0.1:7522/upnp/channelstream/transcode/2359890530973848367%7CORF1%20HD.ts" -pat_period 0.2 -f mpegts
-bufsize 6400k -resize 1280x720 -c:a copy -c:v h264_nvenc -b:v 3200K -y c:\test.mpg

 

Works great, only ~7% CPU utilization for ffmpeg, the rest is done in HW encoding.

 

Next thing was to put this command into ffmpegprefs.ini, so I created a new profile:

[TS HW HD 3600 kbit]
Cmd=-analyzeduration {analyzeduration} {offset} {realtime} -i "{infile}" -f mpegts -pat_period 0.2 -bufsize 6400k –resize 1280x720 -c:a copy -c:v h264_nvenc -b:v 3200K -y "{outfile}"
maxWidth=1280
maxHeight=720
MimeType=video/mpeg
Ext=.ts
Delay=2000

 

 

However I do not get a stream, tuning happens for a very short time, but then it ends.

It seems the handover of data to the DMS is not working somehow.

Here is the relevant log section from svcdebug.log:

Spoiler
23.06.24 13:57:28.684 TDVBHTTPClient ($08022040) CreateTranscodedStream preset=TS%20HW%20HD%203600%20kbit&ffpreset=fast&track=0&subs=-&chid=2359890530973848367%7CORF1%20HD
23.06.24 13:57:28.684 TDVBHTTPClient ($08022040) CreateTranscodedStream 10.0.0.2 VLC/3.0.20 LibVLC/3.0.20
23.06.24 13:57:28.684 Converter Start cmd  -analyzeduration 1500k   -i "http://127.0.0.1:7522/upnp/channelstream/transcode/2359890530973848367%7CORF1%20HD.ts" -f mpegts -mpegts_original_network_id 1 -mpegts_transport_stream_id 1007 -mpegts_service_id 4911 -mpegts_service_type 1 -metadata service_name="�ORF1 HD" -pat_period 0.2 -bufsize 6400k –resize 1280x720 -c:a copy -c:v h264_nvenc -b:v 3200K -y "\\.\pipe\Output{D22A86CE-6913-4C79-97E9-40259B02D0DC}"
23.06.24 13:57:28.684 SetStandbyBlock      WebMain
23.06.24 13:57:28.684 TServiceMain         AddReference     WebMain: 1
23.06.24 13:57:28.715 TStreamManager       GetDocument      Lavf/59.27.100
23.06.24 13:57:28.715 TStreamManager       GetDocument      c:\wwwroot\upnp\channelstream\transcode\2359890530973848367|ORF1 HD.ts
23.06.24 13:57:28.746 TLiveStream          AllocateHardware EyeTV Netstream 4Sat (2586) DVB-S 1
23.06.24 13:57:28.746 TRTSPNetworkStream   SetTuner         TType: 1, Freq: 11303, Symrate: 22000, LOF: 9750, Tone: 0, Pol: 0, DiseqC: 3, FEC: 2, APID: 1921, VPID: 1920, PMT: 107, SID: 4911, TID: 1007, NID: 1, SatMod: 134, DiseqCVal: 0, Flags: 25, Group: 0
23.06.24 13:57:30.324 Plugin 0114EBD8      SetTuner SID=4911
23.06.24 13:57:30.527 Add TSCall           
23.06.24 13:57:30.527 AddPID               0
23.06.24 13:57:30.527 AddPID               107
23.06.24 13:57:30.747 AddPID               272
23.06.24 13:57:30.965 AddPID               1
23.06.24 13:57:30.965 DelPID               0
23.06.24 13:57:31.169 DelPID               1
23.06.24 13:57:33.764 Plugin 0114EBD8      UnSetTuner SID=4911
23.06.24 13:57:33.795 TFFMPEGLiveTVConverter OnTerminated     1
23.06.24 13:57:33.889 Del TSCall           
23.06.24 13:57:36.920 Release              EyeTV Netstream 4Sat (2586) DVB-S 1
23.06.24 13:57:36.920 Free                 EyeTV Netstream 4Sat (2586) DVB-S 1
23.06.24 13:57:37.357 Freed                EyeTV Netstream 4Sat (2586) DVB-S 1
23.06.24 13:57:37.357 hamDeleted           EyeTV Netstream 4Sat (2586) DVB-S 1
23.06.24 13:57:51.374 TDVBHTTPClient ($08022040) SessionClosed    FFmpegConverter released
23.06.24 13:57:51.374 TDVBHTTPClient ($080443F0) CreateTranscodedStream preset=TS%20HW%20HD%203600%20kbit&ffpreset=fast&track=0&subs=-&chid=2359890548429040486%7CZDF%20HD
23.06.24 13:57:51.374 TDVBHTTPClient ($080443F0) CreateTranscodedStream 10.0.0.2 VLC/3.0.20 LibVLC/3.0.20
23.06.24 13:57:51.374 Converter Start cmd  -analyzeduration 1500k   -i "http://127.0.0.1:7522/upnp/channelstream/transcode/2359890548429040486%7CZDF%20HD.ts" -f mpegts -mpegts_original_network_id 1 -mpegts_transport_stream_id 1011 -mpegts_service_id 11110 -mpegts_service_type 1 -metadata service_name="�ZDF HD" -pat_period 0.2 -bufsize 6400k –resize 1280x720 -c:a copy -c:v h264_nvenc -b:v 3200K -y "\\.\pipe\Output{88F805EA-4DA1-4DAE-B6EF-C86E8F0B5320}"
23.06.24 13:57:51.405 TStreamManager       GetDocument      Lavf/59.27.100
23.06.24 13:57:51.405 TStreamManager       GetDocument      c:\wwwroot\upnp\channelstream\transcode\2359890548429040486|ZDF HD.ts
23.06.24 13:57:51.437 TLiveStream          AllocateHardware EyeTV Netstream 4Sat (2586) DVB-S 1
23.06.24 13:57:51.437 TRTSPNetworkStream   SetTuner         TType: 1, Freq: 11362, Symrate: 22000, LOF: 9750, Tone: 0, Pol: 0, DiseqC: 3, FEC: 2, APID: 6122, VPID: 6110, PMT: 6100, SID: 11110, TID: 1011, NID: 1, SatMod: 134, DiseqCVal: 0, Flags: 24, Group: 0
23.06.24 13:57:52.890 Plugin 0114EBD8      SetTuner SID=11110
23.06.24 13:57:52.999 Add TSCall           
23.06.24 13:57:52.999 AddPID               0
23.06.24 13:57:52.999 AddPID               6100
23.06.24 13:57:53.093 DelPID               0
23.06.24 13:57:54.937 Plugin 0114EBD8      UnSetTuner SID=11110
23.06.24 13:57:54.968 TFFMPEGLiveTVConverter OnTerminated     1
23.06.24 13:57:55.048 Del TSCall           
23.06.24 13:57:58.970 Release              EyeTV Netstream 4Sat (2586) DVB-S 1
23.06.24 13:57:58.970 Free                 EyeTV Netstream 4Sat (2586) DVB-S 1
23.06.24 13:57:59.658 Freed                EyeTV Netstream 4Sat (2586) DVB-S 1
23.06.24 13:57:59.658 hamDeleted           EyeTV Netstream 4Sat (2586) DVB-S 1

 

 

Even if I copy the exact arguments from the svcdebug.log and start ffmpeg manually to a file, it is working, but not with DMS.

Any ideas where to look further?

Edited by esackbauer
Posted
vor 5 Stunden schrieb esackbauer:
23.06.24 13:57:51.374 Converter Start cmd ...
.....
23.06.24 13:57:54.968 TFFMPEGLiveTVConverter OnTerminated     1

 

 

FFmpeg terminates after a few seconds, most likely because it encounters an error.  For determining which one you need more debug output, either in a separate file

 

https://stackoverflow.com/questions/2066076/how-do-i-enable-ffmpeg-logging-and-where-can-i-find-the-ffmpeg-log-file/9753077#9753077

 

or in the svcdebug.log

 

https://www.dvbviewer.tv/forum/topic/58039-intel-quick-sync-video-unterstützung/?do=findComment&comment=447858

 

Please use this option sparingly, because it lets the DMS really write a lot more.

 

vor 5 Stunden schrieb esackbauer:

Even if I copy the exact arguments from the svcdebug.log and start ffmpeg manually to a file, it is working, but not with DMS.

 

The output medium is different. In your test FFmpeg writes to file, which means, it has random access and can jump back if necessary. In the DMS it writes to a pipe, which is an inter-process streaming mechanism provided by Windows. It only allows to write sequentially. FFmpeg refuses to write MP4 output to a pipe, for example, because it can't complete headers at the beginning with values that are not available until the end of the transcoding process.

 

  • 3 weeks later...
Posted (edited)

Ok, I got it to work, with this line:

Cmd=-analyzeduration {analyzeduration} {offset} {realtime} -i "{infile}" -f mpegts -pat_period 0.2 -bufsize 6400k -crf 20 -g 50 -vf "hwupload_cuda,yadif_cuda=0:-1:0" -resize 1280x720 -preset {vpreset} -c:a copy -c:v h264_nvenc -b:v 5000K -y "{outfile}"

 

I am not using the NVidia HW decoder, I had same short freezes with it.

 

Edit:

 

Got it also working with Nvidia HW decoder. The thing is to keep the video data in the GPUs memory, instead of copying it in and out of normal system RAM:

Cmd=-analyzeduration {analyzeduration} {offset} {realtime} -hwaccel cuda -hwaccel_output_format cuda -i "{infile}" -f mpegts -pat_period 0.2 -bufsize 6400k -crf 20 -g 50 -vf "yadif_cuda=0:-1:0,scale_cuda=1280:720:interp_algo=lanczos" -preset {vpreset} -c:a copy -c:v h264_nvenc -b:v 5000K -y "{outfile}"

 

Edited by esackbauer
HW decoder added

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...