请选择 进入手机版 | 继续访问电脑版

ChinaFFmpeg

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 595|回复: 9

[Linux] ffmpeg怎么采集摄像机的mjpeg视频并存成文件

[复制链接]
发表于 2020-3-12 12:57:09 | 显示全部楼层 |阅读模式
首先摄像机/dev/video0显示是支持mjpeg的,执行如下:
  1. ./ffmpeg -hide_banner -f v4l2 -list_formats all -i /dev/video0
复制代码
显示结果为:
  1. [video4linux2,v4l2 @ 0x17151c0] Compressed:       mjpeg :                MJPEG : 1920x1080 1280x720 960x540 800x600 704x576 640x480 640x360 320x240 320x180 176x144 1920x1080
  2. [video4linux2,v4l2 @ 0x17151c0] Raw       :     yuyv422 :     YUV 4:2:2 (YUYV) : 1920x1080 1280x720 640x480 320x240 1920x1080
复制代码
然后想把输入的mjpeg视频抓取成图像文件,输入如下命令:
  1. Input #0, video4linux2,v4l2, from '/dev/video0':
  2.   Duration: N/A, start: 4104.712751, bitrate: N/A
  3.     Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 1920x1080, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
  4. Stream mapping:
  5.   Stream #0:0 -> #0:0 (mjpeg (native) -> mpeg4 (native))
  6. Press [q] to stop, [?] for help
  7. <font color="#0000ff">[swscaler @ 0x203e7a0] </font><font color="#ff0000">deprecated pixel format used, make sure you did set range correctly</font>
  8. Output #0, avi, to 'out.avi':
  9.   Metadata:
  10.     ISFT            : Lavf58.40.100
  11.     Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1920x1080, q=2-31, 200 kb/s, 30 fps, 30 tbn, 30 tbc
  12.     Metadata:
  13.       encoder         : Lavc58.74.100 mpeg4
  14.     Side data:
  15.       cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
  16. <font color="#00bfff">[mpeg4 @ 0x2007450] </font><font color="#ff0000">time_incr 10050 too large</font>me=00:00:02.33 bitrate=1797.6kbits/s speed= 1.3x     
  17. <font color="#ff00ff">[avi @ 0x20060d0] </font><font color="#ff0000">Too large number of skipped frames 301597 > 60000</font>=1797.6kbits/s dup=0 drop=12 speed=0.661x   
  18. <font color="#ff0000">av_interleaved_write_frame(): Invalid argument</font>
  19. frame=   11 fps=2.7 q=15.0 Lsize=     716kB time=02:47:35.60 bitrate=   0.6kbits/s dup=0 drop=15 speed=2.44e+03x   
  20. video:778kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
  21. Conversion failed!
复制代码
使用ffmpeg命令行能否做到这样的功能,正确的命令怎么写?


回复

使用道具 举报

发表于 2020-3-12 16:25:50 | 显示全部楼层
其实你也可以试试那个yuv422的
mjpeg的话可能需要解码然后转pixfmt然后编码
但是yuv422那个似乎不需要解码,直接转就可以了

回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-12 17:20:43 | 显示全部楼层
孙悟空 发表于 2020-3-12 16:25
其实你也可以试试那个yuv422的
mjpeg的话可能需要解码然后转pixfmt然后编码
但是yuv422那个似乎不需要解码 ...

yuv直接采存成mpeg是可以了,但是yuv数据太大,而且只有5帧,所以需要mjpeg,我想先明确直接命令能否直接采到mjpeg,还是说需要调用FFmpeg的库编程才可以做到。
回复 支持 反对

使用道具 举报

发表于 2020-3-12 18:43:58 | 显示全部楼层
命令行就可以的
  1. ffmpeg -f video4linux2 -input_format mjpeg -i /dev/video0 out.mpeg
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-13 09:04:02 | 显示全部楼层
本帖最后由 kenzhang1031 于 2020-3-13 09:08 编辑

执行会有错误提示,然后出来的图像一直是那个画面,不是实际的变化的画面(比如摄像机照着一个秒表,一直是一个时间,没有秒表时间变化的视频)
/nfsroot/OpenSourceTools/FFmpeg-master/install/bin # ./ffmpeg -f video4linux2 -i
nput_format mjpeg -i /dev/video0 out.mpeg
ffmpeg version 4.2.git Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 4.9.4 (Hisilicon_v600_20180525) 20150629 (prerelease)
  configuration: --prefix=/root/hisi/OpenSourceTools/FFmpeg-master/install/ --enable-filters --enable-asm --enable-ffmpeg --enable-ffplay --enable-ffprobe --enable-doc --enable-cross-compile --enable-shared --enable-filter=movie --enable-zlib --enable-avfilter --cc=arm-hisiv600-linux-gcc --cxx=arm-hisiv600-linux-g++ --cross-prefix=arm-hisiv600-linux- --arch=arm --target-os=linux --host-os=linux --enable-libx264 --enable-gpl --enable-version3 --enable-small --enable-shared --enable-static --enable-encoder=png --enable-encoder=libx264 --enable-encoder=mjpeg --enable-encoder=h264_vaapi --enable-encoder=h264_v4l2m2m --enable-encoder=jpeg2000 --enable-decoder=mjpeg --enable-decoder=h264 --enable-decoder=h264_v4l2m2m --enable-muxer=h264 --enable-muxer=mjpeg --enable-demuxer=h264 --enable-demuxer=mjpeg --enable-parser=mjpeg --enable-parser=h264 --enable-protocol=http --enable-protocol=rtp --enable-protocol=rtmpts --enable-protocol=https --enable-protocol=hls --enable-protocol=file --enable-protocol=data --enable-gray --enable-safe-bitstream-reader --extra-cflags='-I../ssh_work/install/HI3531D/zlib/include -I../x264-master/install/include' --extra-cxxflags='-I../ssh_work/install/HI3531D/zlib/include -I../x264-master/install/include' --extra-ldflags='-L../ssh_work/install/HI3531D/zlib/lib -L../x264-master/install/lib'
  libavutil      56. 42.100 / 56. 42.100
  libavcodec     58. 74.100 / 58. 74.100
  libavformat    58. 40.100 / 58. 40.100
  libavdevice    58.  9.103 / 58.  9.103
  libavfilter     7. 77.100 /  7. 77.100
  libswscale      5.  6.100 /  5.  6.100
  libswresample   3.  6.100 /  3.  6.100
  libpostproc    55.  6.100 / 55.  6.100
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 585.576807, bitrate: N/A
    Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 1920x1080, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
File 'out.mpeg' already exists. Overwrite? [y/N] y
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> mpeg1video (native))
Press [q] to stop, [?] for help
[swscaler @ 0x2086610] deprecated pixel format used, make sure you did set range correctly
[mpeg @ 0x204bfb0] VBV buffer size not set, using default size of 230KB
If you want the mpeg file to be compliant to some specification
Like DVD, VCD or others, make sure you set the correct buffer size
Output #0, mpeg, to 'out.mpeg':
  Metadata:
    encoder         : Lavf58.40.100
    Stream #0:0: Video: mpeg1video, yuv420p, 1920x1080, q=2-31, 200 kb/s, 30 fps, 90k tbn, 30 tbc
    Metadata:
      encoder         : Lavc58.74.100 mpeg1video
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
More than 1000 frames duplicated
^Came= 3222 fps= 48 q=31.0 size=   19200kB time=00:01:47.30 bitrate=1465.9kbits/s dup=3218 drop=0 speed= 1.6x   
/nfsroot/OpenSourceTools/FFmpeg-master/install/bin #


回复 支持 反对

使用道具 举报

发表于 2020-3-13 20:00:26 | 显示全部楼层
ame= 3222 fps= 48 q=31.0 size=   19200kB time=00:01:47.30 bitrate=1465.9kbits/s dup=3218 drop=0 speed= 1.6x   

从信息看,dup了三千两百多帧


ffmpeg -f video4linux2 -input_format mjpeg -i /dev/video0 -vcodec libx264 -r:v 30 out.ts


这么的试试看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-16 10:08:45 | 显示全部楼层
孙悟空 发表于 2020-3-13 20:00
ame= 3222 fps= 48 q=31.0 size=   19200kB time=00:01:47.30 bitrate=1465.9kbits/s dup=3218 drop=0 spee ...

感谢!这个命令没有错误提示了,但是采样还是有问题。
开始到打印Came=   47 fps=27 这段时间(很快1,2秒),也就是采集了47帧之后,显示卡住不动了,很久才继续帧数增加1,2帧,以及fps显示不再接近30了,比如fps=1.3。录出来的视频(秒表画面)用vlc看开始的秒一直保持,比如26秒,最后跳一秒,比如跳到27秒,就结束了。打印如下:
/nfsroot/OpenSourceTools/FFmpeg-master/install/arm-hisiv600-linux/bin # ./ffmpeg
-f video4linux2 -input_format mjpeg -i /dev/video0 -vcodec libx264 -r:v 30 out.
ts
ffmpeg version 4.2.git Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 4.9.4 (Hisilicon_v600_20180525) 20150629 (prerelease)
  configuration: --arch=arm --enable-cross-compile --target-os=linux --cross-prefix=arm-hisiv600-linux- --enable-shared --enable-libx264 --enable-gpl --prefix=/root/hisi/OpenSourceTools/FFmpeg-master/install/arm-hisiv600-linux --extra-cflags=-I../x264-master/install/arm-hisiv600-linux/include --extra-cxxflags=-I../x264-master/install/arm-hisiv600-linux/include --extra-ldflags=-L../x264-master/install/arm-hisiv600-linux/lib
  libavutil      56. 42.100 / 56. 42.100
  libavcodec     58. 74.100 / 58. 74.100
  libavformat    58. 40.100 / 58. 40.100
  libavdevice    58.  9.103 / 58.  9.103
  libavfilter     7. 77.100 /  7. 77.100
  libswscale      5.  6.100 /  5.  6.100
  libswresample   3.  6.100 /  3.  6.100
  libpostproc    55.  6.100 / 55.  6.100
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 1338.474701, bitrate: N/A
    Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 1920x1080, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[libx264 @ 0x1bbf460] using cpu capabilities: none!
[libx264 @ 0x1bbf460] profile High, level 4.0, 4:2:0, 8-bit
Output #0, mpegts, to 'out.ts':
  Metadata:
    encoder         : Lavf58.40.100
    Stream #0:0: Video: h264 (libx264), yuvj420p(pc), 1920x1080, q=-1--1, 30 fps, 90k tbn, 30 tbc
    Metadata:
      encoder         : Lavc58.74.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
^Came=   58 fps=1.3 q=29.0 size=     512kB time=00:00:00.26 bitrate=15728.0kbits/s dup=0 drop=18 speed=0.006x         
/nfsroot/OpenSourceTools/FFmpeg-master/install/arm-hisiv600-linux/bin #

如果摄像机直接接电脑USB,用potplayer看,图像正常描述性也正常(MJPEG 30帧)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-16 12:04:52 | 显示全部楼层
kenzhang1031 发表于 2020-3-16 10:08
感谢!这个命令没有错误提示了,但是采样还是有问题。
开始到打印Came=   47 fps=27 这段时间(很快1,2 ...

重新编译libx264, 去掉--disable-asm,之后,帧显示不会完全卡死不更新了,“using cpu capabilities: none!”也变成了“using cpu capabilities: ARMv6 NEON”, 但是还是fps很小:
Frame =  203 fps=0.8 q=17.0 size=   12288kB time=00:02:25.33 bitrate= 692.6kbits/s dup=0 drop=1493 speed=0.57x
回复 支持 反对

使用道具 举报

发表于 2020-3-16 23:51:48 | 显示全部楼层
kenzhang1031 发表于 2020-3-16 12:04
重新编译libx264, 去掉--disable-asm,之后,帧显示不会完全卡死不更新了,“using cpu capabilities: no ...

性能问题
回复 支持 反对

使用道具 举报

发表于 2020-3-16 23:51:51 | 显示全部楼层
kenzhang1031 发表于 2020-3-16 12:04
重新编译libx264, 去掉--disable-asm,之后,帧显示不会完全卡死不更新了,“using cpu capabilities: no ...

性能问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|Archiver|ChinaFFmpeg

GMT+8, 2020-4-7 16:59 , Processed in 0.048214 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表