【问题标题】:bad ffmpeg performace compared to ffplay and VLC与 ffplay 和 VLC 相比,ffmpeg 性能不佳
【发布时间】:2021-10-19 18:25:55
【问题描述】:

我在 ffmpeg 上的表现一直很差,而在 ffplay 和 VLC 上我看不到。我觉得这很奇怪,因为 ffplay 在后台使用 ffmpeg。

如果我使用 ffmpeg 流式传输 HEVC/h265 流并将其通过管道传输到 ffplay,它会卡顿且性能比直接使用 ffplay 播放流时更差。

我想说的是,我希望这个命令ffplay rtsp://stream-ipffmpeg -i rtsp://stream-ip -f matroska - | ffplay - 执行相同,但事实并非如此,ffplay 播放起来明显更流畅。另外,如果我尝试使用 VLC 进行流式传输,它就像 ffplay 一样流畅。

这是 ffplay 的日志:

$ ffplay rtsp://admin:1234@192.168.1.47:554/StdCh1
ffplay version n4.4 Copyright (c) 2003-2021 the FFmpeg developers
  built with gcc 11.1.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      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, rtsp, from 'rtsp://admin:1234@192.168.1.47:554/StdCh1':
  Metadata:
    title           : KNS-224C
    comment         : http80 rtsp554 a0 ba0 pt0 rc2 rv2 ua2 tk3 vs3 vd3 pc0 sc0 af0
  Duration: N/A, start: 0.000000, bitrate: N/A
  Stream #0:0: Video: hevc (Main), yuvj420p(pc, bt709), 1920x1080, 30.30 tbr, 90k tbn, 90k tbc
  Stream #0:1: Data: none

这是 ffmpeg 通过管道传输到 ffplay 的日志:

$ ffmpeg -i rtsp://admin:1234@192.168.1.47:554/StdCh1 -f matroska - | ffplay -
ffplay version n4.4ffmpeg version n4.4 Copyright (c) 2003-2021 the FFmpeg developers Copyright (c) 2000-2021 the FFmpeg developers

  built with gcc 11.1.0 (GCC)
  built with gcc 11.1.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
  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      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavutil      56. 70.100 / 56. 70.100
  libavformat    58. 76.100 / 58. 76.100
  libavcodec     58.134.100 / 58.134.100
  libavdevice    58. 13.100 / 58. 13.100
  libavformat    58. 76.100 / 58. 76.100
  libavfilter     7.110.100 /  7.110.100
  libavdevice    58. 13.100 / 58. 13.100
  libswscale      5.  9.100 /  5.  9.100
  libavfilter     7.110.100 /  7.110.100
  libswresample   3.  9.100 /  3.  9.100
  libswscale      5.  9.100 /  5.  9.100
  libpostproc    55.  9.100 / 55.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, rtsp, from 'rtsp://admin:1234@192.168.1.47:554/StdCh1':
  Metadata:
    title           : KNS-224C
    comment         : http80 rtsp554 a0 ba0 pt0 rc2 rv2 ua2 tk3 vs3 vd3 pc0 sc0 af0
  Duration: N/A, start: 0.000000, bitrate: N/A
  Stream #0:0: Video: hevc (Main), yuvj420p(pc, bt709), 1920x1080, 30.30 tbr, 90k tbn, 90k tbc
  Stream #0:1: Data: none
Stream mapping:
  Stream #0:0 -> #0:0 (hevc (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[hevc @ 0x561e88468480] Could not find ref with POC 0
[libx264 @ 0x561e8845a480] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x561e8845a480] profile High, level 4.2, 4:2:0, 8-bit0
[libx264 @ 0x561e8845a480] 264 - core 161 r3039 544c61f - H.264/MPEG-4 AVC codec - Copyleft 2003-2021 - 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=12 lookahead_threads=2 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=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, matroska, to 'pipe:':
  Metadata:
    title           : KNS-224C
    comment         : http80 rtsp554 a0 ba0 pt0 rc2 rv2 ua2 tk3 vs3 vd3 pc0 sc0 af0
    encoder         : Lavf58.76.100
  Stream #0:0: Video: h264 (H264 / 0x34363248), yuvj420p(pc, bt709, progressive), 1920x1080, q=2-31, 30.30 fps, 1k tbn
    Metadata:
      encoder         : Lavc58.134.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
Input #0, matroska,webm, from 'pipe:': vq=    0KB sq=    0B f=0/0   /A speed=   0x
  Metadata:
    title           : KNS-224C
    COMMENT         : http80 rtsp554 a0 ba0 pt0 rc2 rv2 ua2 tk3 vs3 vd3 pc0 sc0 af0
    ENCODER         : Lavf58.76.100
  Duration: N/A, start: 0.000000, bitrate: N/A
  Stream #0:0: Video: h264 (High), yuvj420p(pc, bt709, progressive), 1920x1080, 30.30 fps, 30.30 tbr, 1k tbn, 60.61 tbc (default)
    Metadata:
      ENCODER         : Lavc58.134.100 libx264

我想知道为什么会这样?不应该在这两种情况下都应用硬件加速吗?

除此之外,我正在尝试创建视频马赛克,当在这样的命令中一起显示流时,性能问题变得非常明显:

$ ffmpeg -i rtsp://stream1 \
-i rtsp://stream2 \
-i rtsp://stream3 \
-filter_complex "[0:v] scale=960x540 [a0];
[1:v] scale=960x540 [a1];
[2:v] scale=960x540 [a2];
[a0][a1][a2] xstack=inputs=3:layout=0_0|0_h0|w0_0[out]" \
 -map "[out]" -f matroska - | ffplay -

这比在 VLC 中尝试相同的马赛克效果要差得多。是不是我做错了什么?

我想指出,如果我同时使用 ffplay 独立流式传输所有源,它的性能非常好。

【问题讨论】:

  • 您可能需要指定 -hwaccel 以在 ffmpeg 中启用硬件加速。我还没有为 HEVC 尝试过,但对于 h264 它有效。根据 ffmpeg 文档和 QSV(英特尔),必须在 ffmpeg 命令之后添加以下内容: -hwaccel qsv -c:v hevc_qsv -load_plugin hevc_hw

标签: video ffmpeg video-streaming video-processing


【解决方案1】:

避免昂贵的压缩:

$ ffmpeg -i rtsp://stream1 \
-i rtsp://stream2 \
-i rtsp://stream3 \
-filter_complex "[0:v] scale=960x540 [a0];
[1:v] scale=960x540 [a1];
[2:v] scale=960x540 [a2];
[a0][a1][a2] xstack=inputs=3:layout=0_0|0_h0|w0_0[out]" \
 -map "[out]" -c:v rawvideo -f nut - | ffplay -

更好的是,直接使用ffplay(或mpv):

ffplay -autoexit -f lavfi "movie=rtsp\\\://stream1,scale=960x540[v1];movie=rtsp\\\://stream2,scale=960x540[v2];movie=rtsp\\\://stream3,scale=960x540[v3];[v0][v1][v2]xstack=inputs=3:layout=0_0|0_h0|w0_0[out0]"

【讨论】:

  • 感谢您的快速回复!使用 rawvideo 和 nut 似乎提高了性能,但它仍然不如同时 ffplay 流那么流畅。我对您建议的 ffplay 命令有疑问,我似乎无法让它工作。当我尝试运行它时,我收到以下错误消息:tcp @ 0x7f8190006c80] Failed to resolve hostname admin: Name or service not known [Parsed_movie_0 @ 0x7f8190003a00] Failed to avformat_open_input 'rtsp://admin' [lavfi @ 0x7f8190000c80] Error initializing filter 'movie' with args 'rtsp\://admin:1234@192.168.1.47/StdCh1'
  • 很抱歉用另一件事打扰您,mpv 命令看起来如何?我似乎无法弄清楚。
  • @AbdelsalamElTamawy 我猜它假设“admin”是主机名。我没有任何建议,因为我自己无法尝试。至于mpv是不是我对语法不太熟悉所以参考manual
  • 好吧,谢谢!你真的很有帮助。祝你有美好的一天
  • @AbdelsalamElTamawy 有点相关stackoverflow.com/q/50491299
猜你喜欢
  • 2016-03-21
  • 1970-01-01
  • 2021-12-19
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
相关资源
最近更新 更多