使用复杂过滤器的网络摄像头流的 ffplay 问题

Problem with ffplay from webcam stream using complex filters

我正在尝试通过 ffplay 从网络摄像头(在 /dev/video2)流式传输视频以对其进行缩放和重新着色,添加一些文本,然后使用调色板减少颜色数量。我没有收到任何错误,但是 运行 ffplay 命令:

ffplay -i /dev/video2 -vf "hflip,\
  colorbalance=\
    rs=0.4:\
    bs=-0.4\
  ,\
  scale=\
    trunc(iw/8):\
    trunc(ih/8)\
  ,\
  drawtext=\
    text=\
      'efelbar':\
      fontcolor=white:\
      fontsize=10:\
      box=1:\
      boxcolor=black:\
      boxborderw=5:\
      x=(w-text_w)/2:\
      y=(h-text_h)/2\
  ,\
  split[s0][s1];\
  [s0]palettegen=\
    max_colors=16\
  [p];\
  [s1][p]paletteuse"

似乎停滞,无法产生视频输出。

运行 更简单的命令 ffplay -i /dev/video2 -vf "split[s0][s1];[s0]palettegen=max_colors=16[p];[s1][p]paletteuse",它从网络摄像头获取流并(应该)减少颜色的数量,导致它只是坐在那里而不显示实际的输出流。这可能只是一个性能问题,因为我使用的是较旧的硬件,但它不会给出相应的输出。

该命令的输出如下:

ffplay version n5.0 Copyright (c) 2003-2022 the FFmpeg developers
  built with gcc 11.2.0 (GCC)
  configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-amf --enable-avisynth --enable-cuda-llvm --enable-lto --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-librav1e --enable-librsvg --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-libzimg --enable-nvdec --enable-nvenc --enable-shared --enable-version3
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
Input #0, video4linux2,v4l2, from '/dev/video2':B sq=    0B f=0/0   
  Duration: N/A, start: 254970.739108, bitrate: 147456 kb/s
  Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x480, 147456 kb/s, 30 fps, 30 tbr, 1000k tbn

我 运行 这是在 thinkpad t420s 上,所以如果我的笔记本电脑不能那么快地处理视频,我绝对不会感到惊讶。如果是这样的话,优化建议就太好了!

palettegen 默认为整个流计算一个全局调色板。对于实时输入,这只能发生在输入结束时。所以到那时 paletteuse 不会被提供任何帧。

您必须告诉 palettegen 每帧生成一个调色板。

palettegen=max_colors=16:stats_mode=single