I am trying to use nvidia gpu accelerated decoder api with ffmpeg, to extract all frames from a video file (.MTS
) to a folder, but it looks like it's failing for some reason; I could not find an answer or similar issues.
Command used:
ffmpeg -vsync 0 -hwaccel cuvid -c:v mpeg2_cuvid -i raw_video.MTS -q:v 2 -f image2 output_folder/image_%05d.jpg
Traceback:
ffmpeg version n4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 9.3.0 (Arch Linux 9.3.0-1)
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-nvdec --enable-nvenc --enable-omx --enable-shared --enable-version3
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
[mpegts @ 0x563fcc5616c0] start time for stream 0 is not set in estimate_timings_from_pts
[mpegts @ 0x563fcc5616c0] PES packet size mismatch
[mpegts @ 0x563fcc5616c0] Could not find codec parameters for stream 0 (Video: mpeg2video (HDMV / 0x564D4448), none(tv)): unspecified size
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, mpegts, from 'raw_video.MTS':
Duration: 00:07:15.68, start: 1010.210356, bitrate: 41186 kb/s
Program 1
Stream #0:0[0x1011]: Video: mpeg2video (HDMV / 0x564D4448), none(tv), 90k tbr, 90k tbn, 90k tbc
Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 256 kb/s
Stream #0:2[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090), 1920x1080
Output #0, image2, to 'output_folder/image_%05d.jpg':
Output file #0 does not contain any stream
I am pretty sure -hwaccel cuvid -c:v mpeg2_cuvid
is correct as the file type seems to be MPEG-2 in the file properties, but similar issues happen with the other cuvid decoders as well:
I have also tried to run without -c:v
flag but then a cuda error is raised and it runs on the cpu:
[h264 @ 0x55949e6d7e00] decoder->cvdl->cuvidCreateDecoder(&decoder->decoder, params) failed -> CUDA_ERROR_INVALID_VALUE: invalid argument
[h264 @ 0x55949e6d7e00] Failed setup for format cuda: hwaccel initialisation returned error.
Any help will be much appreciated.
ffmpeg version n4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 9.3.0 (Arch Linux 9.3.0-1)
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-nvdec --enable-nvenc --enable-omx --enable-shared --enable-version3
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
[h264 @ 0x557143911700] SPS unavailable in decode_picture_timing
[h264 @ 0x557143911700] non-existing PPS 0 referenced
[h264 @ 0x557143911700] SPS unavailable in decode_picture_timing
[h264 @ 0x557143911700] non-existing PPS 0 referenced
[h264 @ 0x557143911700] decode_slice_header error
[h264 @ 0x557143911700] no frame!
[h264 @ 0x557143911700] SPS unavailable in decode_picture_timing
[h264 @ 0x557143911700] non-existing PPS 0 referenced
[h264 @ 0x557143911700] SPS unavailable in decode_picture_timing
[h264 @ 0x557143911700] non-existing PPS 0 referenced
[h264 @ 0x557143911700] SPS unavailable in decode_picture_timing
[h264 @ 0x557143911700] non-existing PPS 0 referenced
[h264 @ 0x557143911700] decode_slice_header error
[h264 @ 0x557143911700] no frame!
[h264 @ 0x557143911700] SPS unavailable in decode_picture_timing
[h264 @ 0x557143911700] non-existing PPS 0 referenced
[h264 @ 0x557143911700] decode_slice_header error
[h264 @ 0x557143911700] no frame!
[h264 @ 0x557143911700] SPS unavailable in decode_picture_timing
[h264 @ 0x557143911700] non-existing PPS 0 referenced
[h264 @ 0x557143911700] SPS unavailable in decode_picture_timing
[h264 @ 0x557143911700] non-existing PPS 0 referenced
[h264 @ 0x557143911700] SPS unavailable in decode_picture_timing
[h264 @ 0x557143911700] non-existing PPS 0 referenced
[h264 @ 0x557143911700] decode_slice_header error
[h264 @ 0x557143911700] no frame!
[h264 @ 0x557143911700] SPS unavailable in decode_picture_timing
[h264 @ 0x557143911700] non-existing PPS 0 referenced
[h264 @ 0x557143911700] decode_slice_header error
[h264 @ 0x557143911700] no frame!
[h264 @ 0x557143911700] SPS unavailable in decode_picture_timing
[h264 @ 0x557143911700] non-existing PPS 0 referenced
[h264 @ 0x557143911700] SPS unavailable in decode_picture_timing
[h264 @ 0x557143911700] non-existing PPS 0 referenced
[h264 @ 0x557143911700] SPS unavailable in decode_picture_timing
[h264 @ 0x557143911700] non-existing PPS 0 referenced
[h264 @ 0x557143911700] decode_slice_header error
[h264 @ 0x557143911700] no frame!
[h264 @ 0x557143911700] SPS unavailable in decode_picture_timing
[h264 @ 0x557143911700] non-existing PPS 0 referenced
[h264 @ 0x557143911700] decode_slice_header error
[h264 @ 0x557143911700] no frame!
[h264 @ 0x557143911700] SPS unavailable in decode_picture_timing
[h264 @ 0x557143911700] non-existing PPS 0 referenced
[h264 @ 0x557143911700] SPS unavailable in decode_picture_timing
[h264 @ 0x557143911700] non-existing PPS 0 referenced
[h264 @ 0x557143911700] decode_slice_header error
[h264 @ 0x557143911700] no frame!
[mpegts @ 0x55714390c540] PES packet size mismatch
Input #0, mpegts, from 'raw_video.MTS':
Duration: 00:18:30.97, start: 113.284733, bitrate: 16850 kb/s
Program 1
Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p(top first), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 50 tbr, 90k tbn, 50 tbc
Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 256 kb/s
Stream #0:2[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090), 1920x1080
At least one output file must be specified
The video codec is actually h264
. MPEG2-TS is a container/packaging format and need not contain only MPEG-2 video streams.
When decoding a video using a hardware decoder such as cuvid
, the decoded frames are in an hardware-specific data layout in hardware device memory. Before they can be transferred to system memory, they need to be converted to an acceptable layout.
Add the filters hwdownload to copy the frames to system memory, and a format filter immediately afterwards to specify the downloaded format for hwdownload. nv12
is a variant of yuv420p
for which a hW->SW conversion is available in ffmpeg.
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i raw_video.MTS -vf hwdownload,format=nv12 -vsync 0 -q:v 2 -f image2 output_folder/image_%05d.jpg