使用 Nvidia GPU 加速的 Ffmpeg 帧提取抛出 "Output file #0 does not contain any stream"

标签 ffmpeg nvidia codec nvdec

我正在尝试将 nvidia gpu 加速解码器 api 与 ffmpeg 一起使用,将视频文件( .MTS )中的所有帧提取到一个文件夹中,但它看起来由于某种原因失败了;我找不到答案或类似问题。

使用的命令:
ffmpeg -vsync 0 -hwaccel cuvid -c:v mpeg2_cuvid -i raw_video.MTS -q:v 2 -f image2 output_folder/image_%05d.jpg
追溯:

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

我很确定-hwaccel cuvid -c:v mpeg2_cuvid是正确的,因为文件属性中的文件类型似乎是 MPEG-2,但其他 cuvid 解码器也会发生类似的问题:

enter image description here

我也试过在没有 -c:v 的情况下运行标志,但随后引发 cuda 错误并在 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.
任何帮助都感激不尽。

编辑:
  • 操作系统:Arch Linux
  • 显卡:英伟达 1050Ti
  • CUDA 版本:10.2
  • NVIDIA-SMI: 440.82

  • 编辑2:
    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
    

    最佳答案

    视频编解码器实际上是h264 . MPEG2-TS 是一种容器/封装格式,不需要仅包含 MPEG-2 视频流。

    使用硬件解码器(如 cuvid)解码视频时,解码的帧在硬件设备内存中的硬件特定数据布局中。在将它们传输到系统内存之前,需要将它们转换为可接受的布局。

    添加过滤器 hwdownload 以将帧复制到系统内存,然后立即添加格式过滤器以指定下载的 hwdownload 格式。 nv12yuv420p 的变体ffmpeg 中提供了 hW->SW 转换。
    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

    关于使用 Nvidia GPU 加速的 Ffmpeg 帧提取抛出 "Output file #0 does not contain any stream",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61819386/

    相关文章:

    windows - ffmpeg如何在http协议(protocol)的windows中流式传输视频文件

    ffmpeg - x264参数配置

    c - OpenCL:多次循环调用内核后,从设备到主机内存传输获取 INVALID_COMMAND_QUEUE

    c++ - 如何确定我的 GPU 是否进行 16/32/64 位算术运算?

    java - 如何安装Commons Codec?

    c++ - 用FFMpeg获取样本总数

    ffmpeg - ffmpeg 的硬件加速不起作用

    cuda - 共享内存带宽Fermi vs Kepler GPU

    python 在 readline() 之后调用 read() 没有获取整个剩余文件

    media - 视频格式分析器