目录
两个命令工具分别侧重不同功能,v4l2主要用于视频采集; gstreamer则像个管家,整合所有组件完成某项功能。
1) 在下面链接选择相应版本:
2) 解压压缩包,cd v4l-utils 设置平台GCC
export PATH=/home/rockchip/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu//bin:$PATH
导出PKG_CONFIG_LIBDIR=/home/rockchip/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/lib
3) –with-udevdir参数设置目录,避免使用目录/lib/udev权限问题
./configure --host=aarch64-linux-gnu --prefix=/home/rockchip/v4l2/src/out --with-udevdir=/home/rockchip/v4l2/src/out
进行安装
customer@ubuntu:~/200/v4l-utils-1.20.0/out/bin$ file v4l2-ctl
./v4l2-ctl --list-devices
电脑摄像头 (1.1):
/dev/media1
rkisp1-statistics(平台:rkisp1):
/dev/video4
/dev/video5
rkisp1_mainpath (平台:ffb50000.rkisp1):
/dev/video0
/dev/video1
/dev/video2
/dev/video3
rkisp1 (platform:rkisp1):
/dev/media0
电脑摄像头 (usb-ffd80000.usb-1.1):
/dev/video6
/dev/video7
[root@rk1808:~]#./v4l2-ctl -d /dev/video6 --all
司机信息:
驱动程序名称 : uvcvideo
卡类型 : 电脑摄像头
总线信息 : usb-ffd80000.usb-1.1
驱动程序版本 : 4.4.194
能力:0x84a00001
Video Capture
Metadata Capture
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x04200001
Video Capture
Streaming
Extended Pix Format
Media Driver Info:
Driver name : uvcvideo
Model : PC Cam
Serial :
Bus info : 1.1
Media version : 0.1.0
Hardware revision: 0x00000007 (7)
Driver version : 4.4.194
Entity Info:
ID : 1
Name : PC Cam
Type : V4L2 I/O
Flags : default
Major : 81
Minor : 8
Pad : 0: Sink
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture: (视频格式,在采用命令捕获时,需要和此视频格式保持一致)
Width/Height : 640/480
Pixel Format : 'YUYV' (YUYV 4:2:2)
Field : None
Bytes per Line : 1280
Size Image : 614400
Colorspace : sRGB
Transfer Function : Default (maps to sRGB)
YCbCr/HSV Encoding: Default (maps to ITU-R 601)
Quantization : Default (maps to Limited Range)
Flags :
Crop Capability Video Capture: (裁剪能力)
Bounds : Left 0, Top 0, Width 640, Height 480
Default : Left 0, Top 0, Width 640, Height 480
Pixel Aspect: 1/1
Selection Video Capture: crop_default, Left 0, Top 0, Width 640, Height 480, Flags:
Selection Video Capture: crop_bounds, Left 0, Top 0, Width 640, Height 480, Flags:
Streaming Parameters Video Capture:
Capabilities : timeperframe (帧率设置,此处设置帧率后,对后续采集的视频帧率有影响)
Frames per second: invalid (1/0)
Read buffers : 0
brightness 0x00980900 (int) : min=0 max=255 step=1 default=120 value=120
contrast 0x00980901 (int) : min=0 max=127 step=1 default=23 value=23
saturation 0x00980902 (int) : min=0 max=127 step=1 default=32 value=32
hue 0x00980903 (int) : min=-15 max=15 step=1 default=3 value=3
white_balance_temperature_auto 0x0098090c (bool) : default=1 value=1
gamma 0x00980910 (int) : min=1 max=10 step=1 default=8 value=8
gain 0x00980913 (int) : min=0 max=9 step=1 default=2 value=2
power_line_frequency 0x00980918 (menu) : min=0 max=2 default=2 value=2 (60 Hz)
0: Disabled
1: 50 Hz
2: 60 Hz
white_balance_temperature 0x0098091a (int) : min=2800 max=6500 step=1 default=5000 value=5000 flags=inactive
sharpness 0x0098091b (int) : min=0 max=15 step=1 default=1 value=1
backlight_compensation 0x0098091c (int) : min=0 max=1 step=1 default=0 value=0
exposure_auto_priority 0x009a0903 (bool) : default=0 value=1
1) ./v4l2-ctl -d /dev/video6 \--set-fmt-video=width=640,height=480,pixelformat=NV12 \--stream-mmap=3 \--stream-skip=3 \--stream-to=/tmp/cif.out \--stream-count=1 \--stream-poll
The pixelformat 'NV12' is invalid
ount=1 \--stream-poll
2) ./v4l2-ctl -d /dev/video6 \--set-fmt-video=width=640,height=480,pixelformat=YUYV \--stream-mmap=3 \--stream-skip=3 \--stream-to=/tmp/cif.out \--stream-count=1 \--stream-poll
根据前面的查询命令,只有YUYV格式被支持。
将此命令的 stream-count 修改为100等,则捕获stream-count数目的帧视频。
单独拎出来,作为一节,因为这是摄像头支持格式,也是视频的入口。
例如下图某摄像头支持的格式比我们上面列举的仅支持YUYV的更丰富。
包括支持的分辨率,帧率等。
V4L2_PIX_FMT_MJPEG采集方式得到的是经过MJPEG压缩的图片,图片格式是jpeg/jpg,后缀为.jpg或.jpeg。直接将采集到的.jpeg数据依序循环写入一个文件,得到的流并不能直接播放,需要封装成avi等视频格式才能正常播放。
V4L2_PIX_FMT_YUYV采集方式得到的是yuyv格式的原始图像格式文件,后缀为.yuv,得到的yuv数据文件可直接利用pYUV等专业yuv格式查看器进行播放,yuv数据可经HEVC(H265)、H264、VP8、VP9等方式进行编码压缩,通过h.264压缩可得到h264码流,H264码流可直接用VLC播放器进行播放。
MJPEG 为压缩格式,因而其在1080P时,依然有30fps;而YUYV为原始图像,1080P仅支持5fps了。
上述采集了yuyv的图像或者视频,那么怎么查看是个问题,以及大小怎么计算?
sdk中存在mpp测试用例
./mpi_enc_test -w 640 -h 480 -t 7 -i /tmp/cif.out -o /tmp/out_f8.h264 -n 100 -f 8
-f 参数指定了输入的视频格式,此处为8,即YUYV。如果不指定,则压缩出的视频不能播放
-f 各个格式的含义:
- mpp[1055]: mpi: mpp color support list:
- mpp[1055]: mpi: color: id 0 0x00000 YUV420SP, NV12
- mpp[1055]: mpi: color: id 1 0x00001 YUV420SP-10bit
- mpp[1055]: mpi: color: id 2 0x00002 YUV422SP, NV24
- mpp[1055]: mpi: color: id 3 0x00003 YUV422SP-10bit
- mpp[1055]: mpi: color: id 4 0x00004 YUV420P, I420
- mpp[1055]: mpi: color: id 5 0x00005 YUV420SP, NV21
- mpp[1055]: mpi: color: id 6 0x00006 YUV422P, 422P
- mpp[1055]: mpi: color: id 7 0x00007 YUV422SP, NV42
- mpp[1055]: mpi: color: id 8 0x00008 YUV422-YUYV, YUY2
- mpp[1055]: mpi: color: id 10 0x0000a YUV422-UYVY, UYVY
- mpp[1055]: mpi: color: id 12 0x0000c YUV400-Y8, Y800
- mpp[1055]: mpi: color: id 65536 0x10000 RGB565
- mpp[1055]: mpi: color: id 65537 0x10001 BGR565
- mpp[1055]: mpi: color: id 65538 0x10002 RGB555
- mpp[1055]: mpi: color: id 65539 0x10003 BGR555
- mpp[1055]: mpi: color: id 65542 0x10006 RGB888
- mpp[1055]: mpi: color: id 65543 0x10007 BGR888
- mpp[1055]: mpi: color: id 65546 0x1000a ARGB8888
- mpp[1055]: mpi: color: id 65547 0x1000b ABGR8888
- mpp[1055]: mpi: color: id 65548 0x1000c BGRA8888
- mpp[1055]: mpi: color: id 65549 0x1000d RGBA8888
压缩时间
time ./mpi_enc_test -w 640 -h 480 -t 7 -i /tmp/cif.out -o /tmp/out_f8.h264 -n 100 -f 8
时间信息为:
借用瑞芯微的一张图示
gst-launch-1.0 v4l2src device=/dev/video6 num-buffers=100 ! videoconvert !video/x-raw,format=NV12,width=640,height=480 ! queue ! mpph264enc ! queue ! h264parse ! qtmux ! filesink location=/tmp/uvc_h264.mp4
元素
v4l2src
device=/dev/video6
num-buffers=100
! videoconvert
!video/x-raw,format=NV12,width=640,height=480
! queue ! mpph264enc
! queue ! h264parse
! qtmux
! filesink location=/tmp/uvc_h264.mp4
通过上述命令,压缩出的视频编解码信息如下,此处的帧率来源于哪里?