Answers.Body: <p>You are not using an encoder for decoding. What you are doing is telling FFMPEG to decode the input file using hardware acceleration.</p>
  
  <blockquote>
    <p>NVDEC offers decoders for H.264, HEVC, MJPEG, MPEG-1/2/4, VP8/VP9,
    VC-1.</p>
    
    <p><em>Codec support varies by hardware.</em></p>
    
    <p>Note that FFmpeg offers both NVDEC and CUVID hwaccels. They differ in
    how frames are decoded and forwarded in memory.</p>
    
    <p><strong>Sample decode using NVDEC:</strong></p>
    
    <p>ffmpeg -hwaccel nvdec input output</p>
    
    <p><strong>Sample decode using CUVID:</strong></p>
    
    <p>./ffmpeg-git -hwaccel cuvid -c:v h264_cuvid -i input output</p>
    
    <p><a href="https://trac.ffmpeg.org/wiki/HWAccelIntro#NVENCNVDEC" rel="nofollow noreferrer">https://trac.ffmpeg.org/wiki/HWAccelIntro#NVENCNVDEC</a></p>
  </blockquote>
  
  <p>Then you are encoding the file also using hardware acceleration (-c:v h264_nvenc).</p>
  
  <blockquote>
    <p>NVENC can be used for H.264 and HEVC encoding. FFmpeg supports NVENC
    through the h264_nvenc and hevc_nvenc encoders</p>
    
    <p><a href="https://trac.ffmpeg.org/wiki/HWAccelIntro#NVENCNVDEC" rel="nofollow noreferrer">https://trac.ffmpeg.org/wiki/HWAccelIntro#NVENCNVDEC</a></p>
  </blockquote>
  
  <p>In closing, the decoder does not improve speed. Using your GPU instead of your CPU does.</p>
  
  <p>EDIT:</p>
  
  <p>Now that you have supplied your console output and I have done a little more digging I can tell you:</p>
  
  <blockquote>
    <p>In current versions of FFMPEG hardware acceleration is supported
    automatically if available.
    <a href="https://stackoverflow.com/questions/52765883/ffmpeg-using-hardware-acceleration-for-video-decoding">https://stackoverflow.com/questions/52765883/ffmpeg-using-hardware-acceleration-for-video-decoding</a></p>
    
    <p>If it detects a stream which is decodable in hardware then it will attempt to delegate all significant processing to that hardware.
    <a href="https://trac.ffmpeg.org/wiki/HWAccelIntro" rel="nofollow noreferrer">https://trac.ffmpeg.org/wiki/HWAccelIntro</a></p>
  </blockquote>
  
  <p>You can see in your output from </p>
  
  <blockquote>
    <p>command without option "-c:v h264_nvenc"</p>
  </blockquote>
  
  <p>That you are using the CPU to decode.</p>
  
  <blockquote>
    <p>using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2</p>
  </blockquote>
  
  <p>Then when you specify </p>
  
  <blockquote>
    <p>command with option "-c:v h264_nvenc"</p>
  </blockquote>
  
  <p>It tells FFMPEG that hardware acceleration is available, so it uses "h264_nvenc" for the decode and encode (MP4 is a file container and H.264 is the video compression codec).</p>
  
  <p>SideNote: I do not think -hwaccel cuvid is doing anything since you are not using a GPU based scaler and you do not specify -c:v h264_cuvid.  </p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2019-07-23T01:10:56.447Z
Answers.Text: (-hwaccel cuvid) is hardware acceleration, that I know. But in order to use that, you need to specify the codec for decoder (-c:v h264_cuvid ) or for encoder (-c:v h264_nvenc). My command does specify the encoder and it speeds up the encoding. However, I did not specify (-c:v h264_cuvid) (because this causes errors for me) so it should not use hardware acceleration for decoding.
Answers.UserDisplayName: Khoa Tran
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2019-07-23T01:12:09.437Z
Answers.Text: I have also verified with Task Manager that only the GPU encoder is used to accelerate the encoding. The GPU decoder is never used when I run my command.
Answers.UserDisplayName: Khoa Tran
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2019-07-23T15:28:53.800Z
Answers.Text: FFMPEG will always decode the input file before it encodes it again. You specify before the input file to use hardware acceleration so I am assuming that FFMPEG is choosing the decoder automatically. Can you show the console output from the command you ran?
Answers.UserDisplayName: GeekItTillItMhz
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2019-07-26T01:35:09.367Z
Answers.Text: Sorry for the late reply. I have updated the question with console output.
Answers.UserDisplayName: Khoa Tran
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2019-07-22T22:49:45.340Z
Answers.LastActivityDate: 2019-07-30T20:21:27.657Z
Answers.LastEditDate: 2019-07-30T20:21:27.657Z
Answers.UserDisplayName: GeekItTillItMhz
Body: <p>I am trying to improve the speed of decoding H.264 frame to RGBA frame using FFmpeg in C++. I have found a CLI command that can do that but I still do not fully understand the command to reproduce it in C++, so I hope you guys can give me an explanation of how the CLI command works.</p>
  <p>The command that I found uses <code>h264_nvenc</code> encoder to improve the speed using GPU. If I understand correctly, FFmpeg will first decode the H.264 frame, and then encode it to mp4 frame. However, I cannot understand why a H.264 encoder would improve the speed of decoding H.264 video (or maybe encoding to mp4 frame). Can anyone please give me a detailed explanation?</p>
  <p>Here is the CLI command that I found:</p>
  <pre><code>ffmpeg -hwaccel cuvid -r 120 -i &lt;input_file&gt; -c:v h264_nvenc -preset fast \
     -b:v 8M -vf scale=960:1080 -pix_fmt yuv420p &lt;output_file&gt; -y
  </code></pre>
  <p>Edited:
  Log of command with option &quot;-c:v h264_nvenc&quot;</p>
  <pre><code>C:\Users\Shared\test\test&gt;ffmpeg.exe -hwaccel cuvid -r 120 -i C:\\Users\\Shared\\test\\test\\raw0.h264 -c:v h264_nvenc -preset medium -b:v 8M -vf scale=960:1080 -pix_fmt yuv420p C:\\Users\\Shared\\test\\test\\video0.mp4 -y
  ffmpeg version 3.4.1 Copyright (c) 2000-2017 the FFmpeg developers
    built with gcc 7.2.0 (GCC)
    configuration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray 
  --enable-libfreetype --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy 
  --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 
  --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis 
  --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc 
  --enable-dxva2 --enable-avisynth --enable-libmfx
    libavutil      55. 78.100 / 55. 78.100
    libavcodec     57.107.100 / 57.107.100
    libavformat    57. 83.100 / 57. 83.100
    libavdevice    57. 10.100 / 57. 10.100
    libavfilter     6.107.100 /  6.107.100
    libswscale      4.  8.100 /  4.  8.100
    libswresample   2.  9.100 /  2.  9.100
    libpostproc    54.  7.100 / 54.  7.100
  [h264 @ 0000027ecb2a6700] Stream #0: not enough frames to estimate rate; consider increasing probesize
  Input #0, h264, from 'C:\\Users\\Shared\\test\\test\\raw0.h264':
    Duration: N/A, bitrate: N/A
      Stream #0:0: Video: h264 (CAVLC 4:4:4), yuv444p(progressive), 960x1080, 25 fps, 25 tbr, 1200k tbn, 50 tbc
  Stream mapping:
    Stream #0:0 -&gt; #0:0 (h264 (native) -&gt; h264 (h264_nvenc))
  Press [q] to stop, [?] for help
  Output #0, mp4, to 'C:\\Users\\Shared\\test\\test\\video0.mp4':
    Metadata:
      encoder         : Lavf57.83.100
      Stream #0:0: Video: h264 (h264_nvenc) (Main) (avc1 / 0x31637661), yuv420p, 960x1080, q=-1--1, 8000 kb/s, 120 fps, 15360 tbn, 120 tbc
      Metadata:
        encoder         : Lavc57.107.100 h264_nvenc
      Side data:
        cpb: bitrate max/min/avg: 0/0/8000000 buffer size: 16000000 vbv_delay: -1
  frame=  269 fps=261 q=25.0 Lsize=    2551kB time=00:00:02.23 bitrate=9356.5kbits/s speed=2.17x
  video:2549kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.074325%
  </code></pre>
  <p>Log of command without option &quot;-c:v h264_nvenc&quot;</p>
  <pre><code>C:\Users\Shared\test\test&gt;ffmpeg.exe -hwaccel cuvid -r 120 -i C:\\Users\\Shared\\test\\test\\raw0.h264 -preset medium -b:v 8M -vf scale=960:1080 -pix_fmt yuv420p C:\\Users\\Shared\\test\\test\\video0.mp4 -y
  ffmpeg version 3.4.1 Copyright (c) 2000-2017 the FFmpeg developers
    built with gcc 7.2.0 (GCC)
    configuration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc --enable-dxva2 --enable-avisynth --enable-libmfx
    libavutil      55. 78.100 / 55. 78.100
    libavcodec     57.107.100 / 57.107.100
    libavformat    57. 83.100 / 57. 83.100
    libavdevice    57. 10.100 / 57. 10.100
    libavfilter     6.107.100 /  6.107.100
    libswscale      4.  8.100 /  4.  8.100
    libswresample   2.  9.100 /  2.  9.100
    libpostproc    54.  7.100 / 54.  7.100
  [h264 @ 0000021e33556640] Stream #0: not enough frames to estimate rate; consider increasing probesize
  Input #0, h264, from 'C:\\Users\\Shared\\test\\test\\raw0.h264':
    Duration: N/A, bitrate: N/A
      Stream #0:0: Video: h264 (CAVLC 4:4:4), yuv444p(progressive), 960x1080, 25 fps, 25 tbr, 1200k tbn, 50 tbc
  Stream mapping:
    Stream #0:0 -&gt; #0:0 (h264 (native) -&gt; h264 (libx264))
  Press [q] to stop, [?] for help
  [libx264 @ 0000021e335589a0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
  [libx264 @ 0000021e335589a0] profile High, level 4.2
  [libx264 @ 0000021e335589a0] 264 - core 152 r2851 ba24899 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=8000 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
  Output #0, mp4, to 'C:\\Users\\Shared\\test\\test\\video0.mp4':
    Metadata:
      encoder         : Lavf57.83.100
      Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 960x1080, q=-1--1, 8000 kb/s, 120 fps, 15360 tbn, 120 tbc
      Metadata:
        encoder         : Lavc57.107.100 libx264
      Side data:
        cpb: bitrate max/min/avg: 0/0/8000000 buffer size: 0 vbv_delay: -1
  frame=  269 fps= 39 q=-1.0 Lsize=    2279kB time=00:00:02.21 bitrate=8423.8kbits/s speed=0.32x
  video:2277kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.119200%
  [libx264 @ 0000021e335589a0] frame I:2     Avg QP:25.09  size: 16508
  [libx264 @ 0000021e335589a0] frame P:193   Avg QP:23.94  size:  9094
  [libx264 @ 0000021e335589a0] frame B:74    Avg QP:23.92  size:  7332
  [libx264 @ 0000021e335589a0] consecutive B-frames: 62.8%  1.5%  0.0% 35.7%
  [libx264 @ 0000021e335589a0] mb I  I16..4: 38.2% 54.3%  7.6%
  [libx264 @ 0000021e335589a0] mb P  I16..4:  9.2% 11.8%  0.8%  P16..4: 46.5%  3.4%  3.8%  0.0%  0.0%    skip:24.5%
  [libx264 @ 0000021e335589a0] mb B  I16..4:  4.3%  3.7%  0.2%  B16..8: 35.0%  1.5%  0.2%  direct: 9.5%  skip:45.5%  L0:56.6% L1:40.9% BI: 2.5%
  [libx264 @ 0000021e335589a0] final ratefactor: 19.31
  [libx264 @ 0000021e335589a0] 8x8 transform intra:53.1% inter:88.1%
  [libx264 @ 0000021e335589a0] coded y,uvDC,uvAC intra: 22.0% 41.2% 4.5% inter: 12.8% 39.4% 0.0%
  [libx264 @ 0000021e335589a0] i16 v,h,dc,p: 18% 32% 19% 31%
  [libx264 @ 0000021e335589a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 14% 17% 54%  2%  3%  3%  4%  1%  2%
  [libx264 @ 0000021e335589a0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 11%  9% 63%  3%  4%  3%  3%  2%  2%
  [libx264 @ 0000021e335589a0] i8c dc,h,v,p: 63% 23% 13%  1%
  [libx264 @ 0000021e335589a0] Weighted P-Frames: Y:86.0% UV:64.8%
  [libx264 @ 0000021e335589a0] ref P L0: 53.6%  8.3% 17.1% 11.4%  9.6%
  [libx264 @ 0000021e335589a0] ref B L0: 58.9% 14.4% 26.6%
  [libx264 @ 0000021e335589a0] ref B L1: 84.8% 15.2%
  [libx264 @ 0000021e335589a0] kb/s:8317.64
  </code></pre>
  
Tags: <ffmpeg><transcoding>
Title: Why does Nvenc Encoder improve decoding speed?
UserDisplayName: Khoa Tran
ThreadText: # Why does Nvenc Encoder improve decoding speed?
  
  (Asked by: username_0 on 2019-07-22)
  
  I am trying to improve the speed of decoding H.264 frame to RGBA frame using FFmpeg in C++. I have found a CLI command that can do that but I still do not fully understand the command to reproduce it in C++, so I hope you guys can give me an explanation of how the CLI command works.
  
  The command that I found uses `h264_nvenc` encoder to improve the speed using GPU. If I understand correctly, FFmpeg will first decode the H.264 frame, and then encode it to mp4 frame. However, I cannot understand why a H.264 encoder would improve the speed of decoding H.264 video (or maybe encoding to mp4 frame). Can anyone please give me a detailed explanation?
  
  Here is the CLI command that I found:
  
  ```
  ffmpeg -hwaccel cuvid -r 120 -i <input_file> -c:v h264_nvenc -preset fast \
     -b:v 8M -vf scale=960:1080 -pix_fmt yuv420p <output_file> -y
  
  ```
  
  Edited:
  Log of command with option "-c:v h264\_nvenc"
  
  ```
  C:\Users\Shared\test\test>ffmpeg.exe -hwaccel cuvid -r 120 -i C:\\Users\\Shared\\test\\test\\raw0.h264 -c:v h264_nvenc -preset medium -b:v 8M -vf scale=960:1080 -pix_fmt yuv420p C:\\Users\\Shared\\test\\test\\video0.mp4 -y
  ffmpeg version 3.4.1 Copyright (c) 2000-2017 the FFmpeg developers
    built with gcc 7.2.0 (GCC)
    configuration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray 
  --enable-libfreetype --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy 
  --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 
  --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis 
  --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc 
  --enable-dxva2 --enable-avisynth --enable-libmfx
    libavutil      55. 78.100 / 55. 78.100
    libavcodec     57.107.100 / 57.107.100
    libavformat    57. 83.100 / 57. 83.100
    libavdevice    57. 10.100 / 57. 10.100
    libavfilter     6.107.100 /  6.107.100
    libswscale      4.  8.100 /  4.  8.100
    libswresample   2.  9.100 /  2.  9.100
    libpostproc    54.  7.100 / 54.  7.100
  [h264 @ 0000027ecb2a6700] Stream #0: not enough frames to estimate rate; consider increasing probesize
  Input #0, h264, from 'C:\\Users\\Shared\\test\\test\\raw0.h264':
    Duration: N/A, bitrate: N/A
      Stream #0:0: Video: h264 (CAVLC 4:4:4), yuv444p(progressive), 960x1080, 25 fps, 25 tbr, 1200k tbn, 50 tbc
  Stream mapping:
    Stream #0:0 -> #0:0 (h264 (native) -> h264 (h264_nvenc))
  Press [q] to stop, [?] for help
  Output #0, mp4, to 'C:\\Users\\Shared\\test\\test\\video0.mp4':
    Metadata:
      encoder         : Lavf57.83.100
      Stream #0:0: Video: h264 (h264_nvenc) (Main) (avc1 / 0x31637661), yuv420p, 960x1080, q=-1--1, 8000 kb/s, 120 fps, 15360 tbn, 120 tbc
      Metadata:
        encoder         : Lavc57.107.100 h264_nvenc
      Side data:
        cpb: bitrate max/min/avg: 0/0/8000000 buffer size: 16000000 vbv_delay: -1
  frame=  269 fps=261 q=25.0 Lsize=    2551kB time=00:00:02.23 bitrate=9356.5kbits/s speed=2.17x
  video:2549kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.074325%
  
  ```
  
  Log of command without option "-c:v h264\_nvenc"
  
  ```
  C:\Users\Shared\test\test>ffmpeg.exe -hwaccel cuvid -r 120 -i C:\\Users\\Shared\\test\\test\\raw0.h264 -preset medium -b:v 8M -vf scale=960:1080 -pix_fmt yuv420p C:\\Users\\Shared\\test\\test\\video0.mp4 -y
  ffmpeg version 3.4.1 Copyright (c) 2000-2017 the FFmpeg developers
    built with gcc 7.2.0 (GCC)
    configuration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc --enable-dxva2 --enable-avisynth --enable-libmfx
    libavutil      55. 78.100 / 55. 78.100
    libavcodec     57.107.100 / 57.107.100
    libavformat    57. 83.100 / 57. 83.100
    libavdevice    57. 10.100 / 57. 10.100
    libavfilter     6.107.100 /  6.107.100
    libswscale      4.  8.100 /  4.  8.100
    libswresample   2.  9.100 /  2.  9.100
    libpostproc    54.  7.100 / 54.  7.100
  [h264 @ 0000021e33556640] Stream #0: not enough frames to estimate rate; consider increasing probesize
  Input #0, h264, from 'C:\\Users\\Shared\\test\\test\\raw0.h264':
    Duration: N/A, bitrate: N/A
      Stream #0:0: Video: h264 (CAVLC 4:4:4), yuv444p(progressive), 960x1080, 25 fps, 25 tbr, 1200k tbn, 50 tbc
  Stream mapping:
    Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Press [q] to stop, [?] for help
  [libx264 @ 0000021e335589a0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
  [libx264 @ 0000021e335589a0] profile High, level 4.2
  [libx264 @ 0000021e335589a0] 264 - core 152 r2851 ba24899 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=8000 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
  Output #0, mp4, to 'C:\\Users\\Shared\\test\\test\\video0.mp4':
    Metadata:
      encoder         : Lavf57.83.100
      Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 960x1080, q=-1--1, 8000 kb/s, 120 fps, 15360 tbn, 120 tbc
      Metadata:
        encoder         : Lavc57.107.100 libx264
      Side data:
        cpb: bitrate max/min/avg: 0/0/8000000 buffer size: 0 vbv_delay: -1
  frame=  269 fps= 39 q=-1.0 Lsize=    2279kB time=00:00:02.21 bitrate=8423.8kbits/s speed=0.32x
  video:2277kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.119200%
  [libx264 @ 0000021e335589a0] frame I:2     Avg QP:25.09  size: 16508
  [libx264 @ 0000021e335589a0] frame P:193   Avg QP:23.94  size:  9094
  [libx264 @ 0000021e335589a0] frame B:74    Avg QP:23.92  size:  7332
  [libx264 @ 0000021e335589a0] consecutive B-frames: 62.8%  1.5%  0.0% 35.7%
  [libx264 @ 0000021e335589a0] mb I  I16..4: 38.2% 54.3%  7.6%
  [libx264 @ 0000021e335589a0] mb P  I16..4:  9.2% 11.8%  0.8%  P16..4: 46.5%  3.4%  3.8%  0.0%  0.0%    skip:24.5%
  [libx264 @ 0000021e335589a0] mb B  I16..4:  4.3%  3.7%  0.2%  B16..8: 35.0%  1.5%  0.2%  direct: 9.5%  skip:45.5%  L0:56.6% L1:40.9% BI: 2.5%
  [libx264 @ 0000021e335589a0] final ratefactor: 19.31
  [libx264 @ 0000021e335589a0] 8x8 transform intra:53.1% inter:88.1%
  [libx264 @ 0000021e335589a0] coded y,uvDC,uvAC intra: 22.0% 41.2% 4.5% inter: 12.8% 39.4% 0.0%
  [libx264 @ 0000021e335589a0] i16 v,h,dc,p: 18% 32% 19% 31%
  [libx264 @ 0000021e335589a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 14% 17% 54%  2%  3%  3%  4%  1%  2%
  [libx264 @ 0000021e335589a0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 11%  9% 63%  3%  4%  3%  3%  2%  2%
  [libx264 @ 0000021e335589a0] i8c dc,h,v,p: 63% 23% 13%  1%
  [libx264 @ 0000021e335589a0] Weighted P-Frames: Y:86.0% UV:64.8%
  [libx264 @ 0000021e335589a0] ref P L0: 53.6%  8.3% 17.1% 11.4%  9.6%
  [libx264 @ 0000021e335589a0] ref B L0: 58.9% 14.4% 26.6%
  [libx264 @ 0000021e335589a0] ref B L1: 84.8% 15.2%
  [libx264 @ 0000021e335589a0] kb/s:8317.64
  
  ```
  
  **Tags:** ffmpeg, transcoding
  
  
  ---
  
  ## 1 answers
  
  ### Answer by username_1 on 2019-07-22. Score: 1 | Accepted answer
  
  You are not using an encoder for decoding. What you are doing is telling FFMPEG to decode the input file using hardware acceleration.
  
  > NVDEC offers decoders for H.264, HEVC, MJPEG, MPEG-1/2/4, VP8/VP9,
  > VC-1.
  >
  > *Codec support varies by hardware.*
  >
  > Note that FFmpeg offers both NVDEC and CUVID hwaccels. They differ in
  > how frames are decoded and forwarded in memory.
  >
  > **Sample decode using NVDEC:**
  >
  > ffmpeg -hwaccel nvdec input output
  >
  > **Sample decode using CUVID:**
  >
  > ./ffmpeg-git -hwaccel cuvid -c:v h264\_cuvid -i input output
  >
  > <https://trac.ffmpeg.org/wiki/HWAccelIntro#NVENCNVDEC>
  
  Then you are encoding the file also using hardware acceleration (-c:v h264\_nvenc).
  
  > NVENC can be used for H.264 and HEVC encoding. FFmpeg supports NVENC
  > through the h264\_nvenc and hevc\_nvenc encoders
  >
  > <https://trac.ffmpeg.org/wiki/HWAccelIntro#NVENCNVDEC>
  
  In closing, the decoder does not improve speed. Using your GPU instead of your CPU does.
  
  EDIT:
  
  Now that you have supplied your console output and I have done a little more digging I can tell you:
  
  > In current versions of FFMPEG hardware acceleration is supported
  > automatically if available.
  > <https://stackoverflow.com/questions/52765883/ffmpeg-using-hardware-acceleration-for-video-decoding>
  >
  > If it detects a stream which is decodable in hardware then it will attempt to delegate all significant processing to that hardware.
  > <https://trac.ffmpeg.org/wiki/HWAccelIntro>
  
  You can see in your output from
  
  > command without option "-c:v h264\_nvenc"
  
  That you are using the CPU to decode.
  
  > using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
  
  Then when you specify
  
  > command with option "-c:v h264\_nvenc"
  
  It tells FFMPEG that hardware acceleration is available, so it uses "h264\_nvenc" for the decode and encode (MP4 is a file container and H.264 is the video compression codec).
  
  SideNote: I do not think -hwaccel cuvid is doing anything since you are not using a GPU based scaler and you do not specify -c:v h264\_cuvid.
  
  > **Comments:**
  > **username_0**: (-hwaccel cuvid) is hardware acceleration, that I know. But in order to use that, you need to specify the codec for decoder (-c:v h264_cuvid ) or for encoder (-c:v h264_nvenc). My command does specify the encoder and it speeds up the encoding. However, I did not specify (-c:v h264_cuvid) (because this causes errors for me) so it should not use hardware acceleration for decoding.  
  > **username_0**: I have also verified with Task Manager that only the GPU encoder is used to accelerate the encoding. The GPU decoder is never used when I run my command.  
  > **username_1**: FFMPEG will always decode the input file before it encodes it again. You specify before the input file to use hardware acceleration so I am assuming that FFMPEG is choosing the decoder automatically. Can you show the console output from the command you ran?  
  > **username_0**: Sorry for the late reply. I have updated the question with console output.  
  
  ---
  
  