使用FFMPEG尽可能快地从流视频中保存帧
我正在从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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论