使用FFMPEG尽可能快地从流视频中保存帧

发布于 2025-01-18 03:42:07 字数 6507 浏览 3 评论 0原文

我正在从GoPro相机中捕获流视频中的单个帧。这主要是要快速了解我的主题是否在录制视频和 /或图片之前就在框架中。该框架很快捕获,但随后FFMPEG似乎需要将近10秒的时间才能“吐出”。我已经砍了好几天了,没有取得太大的进步。命令行现在:

fmpeg -loglevel verbose -y -i udp://@0.0.0.0:8554 -f image2 -map 0:0 -map -0:1 -map -0:2 -map -0:3 -flush_packets 1 -blocksize 2048 -c:v mjpeg  -qscale:v 8 -frames:v 1 -vf "select='eq(pict_type\,I)'"  test_%03d.jpg

-loglevel verbose : tell me everything
-y : overwrite existing files 
-i udp://@0.0.0.0:8554 : input is a stream at this address
-f image2 : extract an image 
-map 0:0 -map -0:1 -map -0:2 -map -0:3 : ignore all streams except 0
-flush_packets 1 : attempt to say "don't buffer" 
-blocksize 2048 : blocksize made really small to get files to write 
-c:v mjpeg : output is a jpeg  
-qscale:v 8 : output quality 8 
-frames:v 1 : give me 1 frame 
-vf "select='eq(pict_type\,I)'" give me only key frames 
test_%03d.jpg : output file format

它有效,输出就像:

ffmpeg version 3.4.8-0ubuntu0.2 Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
  configuration: --prefix=/usr --extra-version=0ubuntu0.2 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  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
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
[mpegts @ 0x55d3e049ab00] parser not found for codec none, packets or times may be invalid.
[h264 @ 0x55d3e04bffe0] non-existing PPS 0 referenced
    Last message repeated 1 times
[h264 @ 0x55d3e04bffe0] decode_slice_header error
[h264 @ 0x55d3e04bffe0] no frame!
[h264 @ 0x55d3e04bffe0] non-existing PPS 0 referenced
    Last message repeated 1 times
[h264 @ 0x55d3e04bffe0] decode_slice_header error
[h264 @ 0x55d3e04bffe0] no frame!
[h264 @ 0x55d3e04bffe0] non-existing PPS 0 referenced
    Last message repeated 1 times
[h264 @ 0x55d3e04bffe0] decode_slice_header error
[h264 @ 0x55d3e04bffe0] no frame!
[h264 @ 0x55d3e04bffe0] non-existing PPS 0 referenced
    Last message repeated 1 times
[h264 @ 0x55d3e04bffe0] decode_slice_header error
[h264 @ 0x55d3e04bffe0] no frame!
[h264 @ 0x55d3e04bffe0] Reinit context to 1280x720, pix_fmt: yuvj420p

---------- 8秒乘坐---------------------------------

[mpegts @ 0x55d3e049ab00] max_analyze_duration 7000000 reached at 7018667 microseconds st:1
[mpegts @ 0x55d3e049ab00] Could not find codec parameters for stream 2 (Unknown: none ([128][0][0][0] / 0x0080)): unknown codec
Consider increasing the value for the 'analyzeduration' and 'probesize' options
[mpegts @ 0x55d3e049ab00] Could not find codec parameters for stream 3 (Audio: ac3 ([129][0][0][0] / 0x0081), 0 channels, fltp): unspecified sample rate
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, mpegts, from 'udp://@0.0.0.0:8554':
  Duration: N/A, start: 399.253333, bitrate: N/A
  Program 1
    Stream #0:0[0x1011]: Video: h264 (High), 1 reference frame ([27][0][0][0] / 0x001B), yuvj420p(pc, bt709, progressive, left), 1280x720 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 180k tbc
    Stream #0:1[0x1100]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 189 kb/s
    Stream #0:2[0x200]: Unknown: none ([128][0][0][0] / 0x0080)
    Stream #0:3[0x201]: Audio: ac3 ([129][0][0][0] / 0x0081), 0 channels, fltp
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> mjpeg (native))
Press [q] to stop, [?] for help
[mpegts @ 0x55d3e049ab00] Correcting start time by 12200
[h264 @ 0x55d3e05c5260] Reinit context to 1280x720, pix_fmt: yuvj420p
[h264 @ 0x55d3e0582720] reference picture missing during reorder
[h264 @ 0x55d3e0582720] Missing reference picture, default is 65531
[h264 @ 0x55d3e050fa80] reference picture missing during reorder
[h264 @ 0x55d3e050fa80] Missing reference picture, default is 65532
[h264 @ 0x55d3e05203e0] mmco: unref short failure
[graph 0 input from stream 0:0 @ 0x55d3e049a6e0] w:1280 h:720 pixfmt:yuvj420p tb:1/90000 fr:30000/1001 sar:1/1 sws_param:flags=2
Output #0, image2, to 'test_%03d.jpg':
  Metadata:
    encoder         : Lavf57.83.100
    Stream #0:0: Video: mjpeg, 1 reference frame, yuvj420p(pc, left), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 29.97 fps, 29.97 tbn, 29.97 tbc
    Metadata:
      encoder         : Lavc57.107.100 mjpeg
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
*** 4 dup!
    Last message repeated 1 times
No more output streams to write to, finishing.
frame=   10 fps=0.0 q=8.0 Lsize=N/A time=00:00:00.33 bitrate=N/A dup=9 drop=1 speed=5.96x
video:416kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Input file #0 (udp://@0.0.0.0:8554):
  Input stream #0:0 (video): 23 packets read (367296 bytes); 12 frames decoded;
  Input stream #0:1 (audio): 39 packets read (19992 bytes);
  Input stream #0:2 ((null)): 0 packets read (0 bytes);
  Input stream #0:3 (audio): 0 packets read (0 bytes);
  Total: 62 packets (387288 bytes) demuxed
Output file #0 (test_%03d.jpg):
  Output stream #0:0 (video): 10 frames encoded; 10 packets muxed (426390 bytes);
  Total: 10 packets (426390 bytes) muxed

我从脚本启动时立即从。

知道为什么会这么久?

有什么方法可以加快速度?

即使我可以拿出一秒钟并继续前进,这也将是很棒的。我的程序只能查看最新图像。但是,由于它仅在运行结束时吐出框架,这对我没有帮助。

I am capturing a single frame from a streaming video from a GoPro camera. This is mostly to get a quick idea if my subject is in frame before recording video and / or a picture. The frame captures very quickly but then FFMPEG seems to take almost 10 seconds to "spit it out". I have been hacking this for days and not making much progress. Command line right now:

fmpeg -loglevel verbose -y -i udp://@0.0.0.0:8554 -f image2 -map 0:0 -map -0:1 -map -0:2 -map -0:3 -flush_packets 1 -blocksize 2048 -c:v mjpeg  -qscale:v 8 -frames:v 1 -vf "select='eq(pict_type\,I)'"  test_%03d.jpg

-loglevel verbose : tell me everything
-y : overwrite existing files 
-i udp://@0.0.0.0:8554 : input is a stream at this address
-f image2 : extract an image 
-map 0:0 -map -0:1 -map -0:2 -map -0:3 : ignore all streams except 0
-flush_packets 1 : attempt to say "don't buffer" 
-blocksize 2048 : blocksize made really small to get files to write 
-c:v mjpeg : output is a jpeg  
-qscale:v 8 : output quality 8 
-frames:v 1 : give me 1 frame 
-vf "select='eq(pict_type\,I)'" give me only key frames 
test_%03d.jpg : output file format

It works, and the output is like:

ffmpeg version 3.4.8-0ubuntu0.2 Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
  configuration: --prefix=/usr --extra-version=0ubuntu0.2 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  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
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
[mpegts @ 0x55d3e049ab00] parser not found for codec none, packets or times may be invalid.
[h264 @ 0x55d3e04bffe0] non-existing PPS 0 referenced
    Last message repeated 1 times
[h264 @ 0x55d3e04bffe0] decode_slice_header error
[h264 @ 0x55d3e04bffe0] no frame!
[h264 @ 0x55d3e04bffe0] non-existing PPS 0 referenced
    Last message repeated 1 times
[h264 @ 0x55d3e04bffe0] decode_slice_header error
[h264 @ 0x55d3e04bffe0] no frame!
[h264 @ 0x55d3e04bffe0] non-existing PPS 0 referenced
    Last message repeated 1 times
[h264 @ 0x55d3e04bffe0] decode_slice_header error
[h264 @ 0x55d3e04bffe0] no frame!
[h264 @ 0x55d3e04bffe0] non-existing PPS 0 referenced
    Last message repeated 1 times
[h264 @ 0x55d3e04bffe0] decode_slice_header error
[h264 @ 0x55d3e04bffe0] no frame!
[h264 @ 0x55d3e04bffe0] Reinit context to 1280x720, pix_fmt: yuvj420p

---------- 8 seconds go by ----------

[mpegts @ 0x55d3e049ab00] max_analyze_duration 7000000 reached at 7018667 microseconds st:1
[mpegts @ 0x55d3e049ab00] Could not find codec parameters for stream 2 (Unknown: none ([128][0][0][0] / 0x0080)): unknown codec
Consider increasing the value for the 'analyzeduration' and 'probesize' options
[mpegts @ 0x55d3e049ab00] Could not find codec parameters for stream 3 (Audio: ac3 ([129][0][0][0] / 0x0081), 0 channels, fltp): unspecified sample rate
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, mpegts, from 'udp://@0.0.0.0:8554':
  Duration: N/A, start: 399.253333, bitrate: N/A
  Program 1
    Stream #0:0[0x1011]: Video: h264 (High), 1 reference frame ([27][0][0][0] / 0x001B), yuvj420p(pc, bt709, progressive, left), 1280x720 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 180k tbc
    Stream #0:1[0x1100]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 189 kb/s
    Stream #0:2[0x200]: Unknown: none ([128][0][0][0] / 0x0080)
    Stream #0:3[0x201]: Audio: ac3 ([129][0][0][0] / 0x0081), 0 channels, fltp
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> mjpeg (native))
Press [q] to stop, [?] for help
[mpegts @ 0x55d3e049ab00] Correcting start time by 12200
[h264 @ 0x55d3e05c5260] Reinit context to 1280x720, pix_fmt: yuvj420p
[h264 @ 0x55d3e0582720] reference picture missing during reorder
[h264 @ 0x55d3e0582720] Missing reference picture, default is 65531
[h264 @ 0x55d3e050fa80] reference picture missing during reorder
[h264 @ 0x55d3e050fa80] Missing reference picture, default is 65532
[h264 @ 0x55d3e05203e0] mmco: unref short failure
[graph 0 input from stream 0:0 @ 0x55d3e049a6e0] w:1280 h:720 pixfmt:yuvj420p tb:1/90000 fr:30000/1001 sar:1/1 sws_param:flags=2
Output #0, image2, to 'test_%03d.jpg':
  Metadata:
    encoder         : Lavf57.83.100
    Stream #0:0: Video: mjpeg, 1 reference frame, yuvj420p(pc, left), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 29.97 fps, 29.97 tbn, 29.97 tbc
    Metadata:
      encoder         : Lavc57.107.100 mjpeg
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
*** 4 dup!
    Last message repeated 1 times
No more output streams to write to, finishing.
frame=   10 fps=0.0 q=8.0 Lsize=N/A time=00:00:00.33 bitrate=N/A dup=9 drop=1 speed=5.96x
video:416kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Input file #0 (udp://@0.0.0.0:8554):
  Input stream #0:0 (video): 23 packets read (367296 bytes); 12 frames decoded;
  Input stream #0:1 (audio): 39 packets read (19992 bytes);
  Input stream #0:2 ((null)): 0 packets read (0 bytes);
  Input stream #0:3 (audio): 0 packets read (0 bytes);
  Total: 62 packets (387288 bytes) demuxed
Output file #0 (test_%03d.jpg):
  Output stream #0:0 (video): 10 frames encoded; 10 packets muxed (426390 bytes);
  Total: 10 packets (426390 bytes) muxed

The image I get back is from immediately when the script started.

Any idea why it pauses so long?

Any way to speed it up?

Even if I could get it to spit out a frame a second and keep going this would be great. My program could look at the latest image only. But since it only spits out frames at the end of the run this doesn't help me.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文