使用网络摄像头时 ffmpeg 启动太慢(与使用 OpenCV 相同)
ffmpeg starts too slow when using ip camera (the same as using OpenCV)
这是我的代码:
ffmpeg -i http://192.168.0.101:8889/video?dummy=param.mjpeg out.mjpg
当我运行这个命令时,它会立即打印如下:
ffmpeg version N-70223-g7296716 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.9.2 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enable-zlib
libavutil 54. 19.100 / 54. 19.100
libavcodec 56. 26.100 / 56. 26.100
libavformat 56. 23.105 / 56. 23.105
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 11.101 / 5. 11.101
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
然而,在显示下一行之前将近二十秒,它会打印这个警告:
[mjpeg @ 0000000002c4fec0] Format mjpeg detected only with low score of 25, misdetection possible!
然后打印如下:
Input #0, mjpeg, from 'http://192.168.0.101:8889/video?dummy=param.mjpeg':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 640x480 [SAR 1:1 DAR 4:3], 25 tbr, 1200k tbn, 25 tbc
Output #0, mjpeg, to 'a.mjpg':
Metadata:
encoder : Lavf56.23.105
Stream #0:0: Video: mjpeg, yuvj420p(pc), 640x480 [SAR 1:1 DAR 4:3], q=2-31,
200 kb/s, 25 fps, 25 tbn, 25 tbc
Metadata:
encoder : Lavc56.26.100 mjpeg
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg (native) -> mjpeg (native))
Press [q] to stop, [?] for help
frame= 195 fps=0.0 q=24.8 size= 1022kB time=00:00:07.80 bitrate=1073.6kbits/
frame= 199 fps=185 q=24.8 size= 1043kB time=00:00:07.96 bitrate=1073.6kbits/
frame= 203 fps=125 q=24.8 size= 1064kB time=00:00:08.12 bitrate=1073.6kbits/
更糟糕的是,当我使用OpenCV
时,VideoCapture
的open
也需要同样长的时间!
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int main(){
cout<<"Start"<<endl;
VideoCapture cap("http://192.168.0.101:8889/video?dummy=param.mjpg");
cout<<"End"<<endl;
return 0;
}
20 秒后打印 "start",它打印 "end".
我在从 here 下载的 win7 64 位上使用 ffmpeg
。
任何想法将不胜感激!
试试:
ffmpeg -f mjpeg -i http://192.168.0.101:8889/video?dummy=param.mjpeg out.mjpg
如果不行的话还有其他选择:
It may take too long because MJPEG streams don't include timestamps,
and by default they are generated by ffmpeg like there's 25 FPS.
Try ffmpeg -use_wallclock_as_timestamps 1 -i http://...
Try ffmpeg -f mjpeg -use_wallclock_as_timestamps 1 -i http://...
Try ffmpeg -f mjpeg -i http://...
Try also -probesize 32 -analyzeduration 0
or something like that to reduce probing period.
这是我的代码:
ffmpeg -i http://192.168.0.101:8889/video?dummy=param.mjpeg out.mjpg
当我运行这个命令时,它会立即打印如下:
ffmpeg version N-70223-g7296716 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.9.2 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enable-zlib
libavutil 54. 19.100 / 54. 19.100
libavcodec 56. 26.100 / 56. 26.100
libavformat 56. 23.105 / 56. 23.105
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 11.101 / 5. 11.101
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
然而,在显示下一行之前将近二十秒,它会打印这个警告:
[mjpeg @ 0000000002c4fec0] Format mjpeg detected only with low score of 25, misdetection possible!
然后打印如下:
Input #0, mjpeg, from 'http://192.168.0.101:8889/video?dummy=param.mjpeg':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 640x480 [SAR 1:1 DAR 4:3], 25 tbr, 1200k tbn, 25 tbc
Output #0, mjpeg, to 'a.mjpg':
Metadata:
encoder : Lavf56.23.105
Stream #0:0: Video: mjpeg, yuvj420p(pc), 640x480 [SAR 1:1 DAR 4:3], q=2-31,
200 kb/s, 25 fps, 25 tbn, 25 tbc
Metadata:
encoder : Lavc56.26.100 mjpeg
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg (native) -> mjpeg (native))
Press [q] to stop, [?] for help
frame= 195 fps=0.0 q=24.8 size= 1022kB time=00:00:07.80 bitrate=1073.6kbits/
frame= 199 fps=185 q=24.8 size= 1043kB time=00:00:07.96 bitrate=1073.6kbits/
frame= 203 fps=125 q=24.8 size= 1064kB time=00:00:08.12 bitrate=1073.6kbits/
更糟糕的是,当我使用OpenCV
时,VideoCapture
的open
也需要同样长的时间!
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int main(){
cout<<"Start"<<endl;
VideoCapture cap("http://192.168.0.101:8889/video?dummy=param.mjpg");
cout<<"End"<<endl;
return 0;
}
20 秒后打印 "start",它打印 "end".
我在从 here 下载的 win7 64 位上使用 ffmpeg
。
任何想法将不胜感激!
试试:
ffmpeg -f mjpeg -i http://192.168.0.101:8889/video?dummy=param.mjpeg out.mjpg
如果不行的话还有其他选择:
It may take too long because MJPEG streams don't include timestamps, and by default they are generated by ffmpeg like there's 25 FPS.
Try ffmpeg -use_wallclock_as_timestamps 1 -i http://...
Try ffmpeg -f mjpeg -use_wallclock_as_timestamps 1 -i http://...
Try ffmpeg -f mjpeg -i http://...
Try also -probesize 32 -analyzeduration 0
or something like that to reduce probing period.