【GStreamer 】3-2 gstreamer实现USB相机采集图片和录像

29 篇文章 9 订阅
19 篇文章 33 订阅

0、硬件平台和测试环境说明

        感觉网上看这一类说明,常常最大的疑惑就是,为什么别人能用,我自己就不成了,其实很多时候都是各自的环境交代不清楚所致。所以我觉得讲操作前,必须先交代自己的测试环境。

        我自己使用的是TX1核心模块,安装ubuntu 18.04 的环境。安装了英伟达配套的所有cuda的套件库。

nvidia@nvidia-desktop:~$ sudo lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.5 LTS
Release:    18.04
Codename:   bionic

1 、查看usb摄像头可用的分辨率

nvidia@nvidia-desktop:~$ v4l2-ctl --device=/dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
    Index       : 0
    Type        : Video Capture
    Pixel Format: 'MJPG' (compressed)
    Name        : Motion-JPEG
        Size: Discrete 1280x720
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 800x600
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 352x288
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 320x240
            Interval: Discrete 0.033s (30.000 fps)
​
    Index       : 1
    Type        : Video Capture
    Pixel Format: 'YUYV'
    Name        : YUYV 4:2:2
        Size: Discrete 1280x720
            Interval: Discrete 0.200s (5.000 fps)
        Size: Discrete 800x600
            Interval: Discrete 0.050s (20.000 fps)
        Size: Discrete 640x480
            Interval: Discrete 0.040s (25.000 fps)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 352x288
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 320x240
            Interval: Discrete 0.033s (30.000 fps)

        可以看到,我测试使用的USB相机可以支持MJPG格式的压缩视频,恒定30HZ帧率,也可以提供YUYV这种RAW格式的视频,但是图像分辨率越大,帧率也会变低,需要根据情况做一定的调整。

2、采集USB摄像头保存至图片

2.1 采集YUV格式的图片

#jpegenc 输入video/x-raw个数,输出image/jpeg格式
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=1 \
! 'video/x-raw,format=YUY2,width=1280, height=720, framerate=5/1' \
! jpegenc ! filesink location=/home/nvidia/Pictures/file_1280_720_YUV_1401.jpg
​
#采集Size: Discrete 640x480 图片
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=1 \
! 'video/x-raw,format=YUY2,width=640, height=480, framerate=25/1' \
! jpegenc ! filesink location=/home/nvidia/Pictures/file_640_480_YUV_1401.jpg

2.2 采集jpeg格式的图片

#指定设备 /dev/video0 采集一帧 num-buffers=1 ,数据格式 image/jpeg,width=1280,height=720
#filesink 这是一个只消费数据的对象,传入保存位置,将数据输出到指定位置
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=1 \
! image/jpeg,width=1280,height=720 ! \
filesink location=/home/nvidia/Pictures/file_1280_720_1724.jpg
​
#也可以补全所有的参数framerate=30/1
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=1 \
! image/jpeg,width=1280,height=720,framerate=30/1 ! \
filesink location=/home/nvidia/Pictures/file_jpeg_1280_720_1417.jpg
​
#采集不同的分辨率
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=1 \
! image/jpeg,width=640,height=480,framerate=30/1 ! \
filesink location=/home/nvidia/Pictures/file_jpeg_640_480_1417.jpg
 

3、采集USB摄像头保存成视频

3.1 采集yuv格式输入的,输出AVI视频

        AVI英文全称为Audio Video Interleaved,即音频视频交错格式,是微软公司于1992年11月推出、作为其Windows视频软件一部分的一种多媒体容器格式。

        AVI文件将音频(语音)和视频(影像)数据包含在一个文件容器中,允许音视频同步回放。类似DVD视频格式,AVI文件支持多个音视频流。AVI信息主要应用在多媒体光盘上,用来保存电视、电影等各种影像信息。

#采集video/x-raw格式,生成AVI
#avimux 要向生成AVI,必须用的插件多路复用,常用来做音视频混合成一个文件,实现AVI格式交错
gst-launch-1.0 videotestsrc num-buffers=100 \
! 'video/x-raw,format=YUY2,width=1280, height=720, framerate=10/1' \
! avimux  ! filesink location=/home/nvidia/Pictures/x-raw.avi
​
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=100 \
! 'video/x-raw,format=YUY2,width=1280, height=720, framerate=5/1' \
! avimux  ! filesink location=/home/nvidia/Pictures/video0-x-raw.avi
​
#jpegenc 是GStreamer 中迎来实现JPEG image 编码的插件。其输入为 video/x-raw ,输出为image/jpeg
#将video/x-raw格式编码成image/jpeg,生成AVI,都是可以的
gst-launch-1.0 videotestsrc num-buffers=100 \
! 'video/x-raw,format=YUY2,width=1280, height=720, framerate=5/1' \
! jpegenc ! avimux ! filesink location=/home/nvidia/Pictures/jpeg.avi
​
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=100 \
! 'video/x-raw,format=YUY2,width=1280, height=720, framerate=5/1' \
! jpegenc ! avimux ! filesink location=/home/nvidia/Pictures/video0-jpeg.avi

 

3.2 采集MJPG格式输入的,输出AVI视频

#使用USB相机采集 Size: Discrete 1280x720
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=100 \
! image/jpeg,width=1280,height=720,framerate=30/1 ! \
avimux ! filesink location=/home/nvidia/Pictures/jpeg_1280_720_1417.avi

3.3 采集YUV格式输入的,编码成 H.264格式,输出MP4文件

        从 v4l2 设备获取视频流,编码成 H.264格式,并混合到一个MP4文件中

#x264enc 其输入为 video/x-raw ,输出为video/x-h264
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=100 \
! 'video/x-raw,format=YUY2,width=1280, height=720, framerate=5/1' \
! videoconvert  \
! x264enc ! mp4mux ! filesink location=/home/nvidia/Pictures/x264-video-1280-720.mp4

#也有人这么写,单独开一个队列去做,也是可以的
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=100 \
! 'video/x-raw,format=YUY2,width=640, height=480, framerate=25/1' \
! videoconvert \
! queue ! x264enc ! mp4mux ! filesink sync=false location=/home/nvidia/Pictures/camera-h264-640x480.mp4

        不使用videoconvert 会报错

pipeline: could not link v4l2src0 to x264enc0, x264enc0 can't handle caps video/x-raw, format=(string)YUY2, width=(int)1280, height=(int)720, framerate=(fraction)5/1

 

拷贝到WIN下可以直接播放。

 

3.4 采集MJPG格式输入的,输出MP4文件

gst-launch-1.0 v4l2src device=/dev/video0  num-buffers=100 \
! image/jpeg,width=1280,height=720,framerate=30/1 ! \
! jpegdec ! videoconvert \
! tee name=srctee srctee. \
! queue2 ! xvimagesink srctee. \
! queue2 ! x264enc threads=4 sliced-threads=TRUE tune=zerolatency ! matroskamux ! filesink location = output.mp4 srctee. \
! queue2 ! videoconvert ! video/x-raw,format=RGB ! fakesink
 
# jpegdec jpeg解码
# x264enc 编码成X264
# mp4mux 混合生成MP4 
gst-launch-1.0 v4l2src device=/dev/video0  num-buffers=100 \
! image/jpeg,width=1280,height=720,framerate=30/1  \
! jpegdec ! videoconvert \
! x264enc ! mp4mux ! filesink location=/home/nvidia/Pictures/x264-video-1280-720.mp4

 

3.5 一边显示,一边录视频

gst-launch-1.0 v4l2src device=/dev/video0  num-buffers=300 \
! image/jpeg,width=1280,height=720,framerate=30/1  \
! jpegdec ! videoconvert \
! tee name=srctee srctee. \
! queue2 ! xvimagesink srctee. \
! queue2 ! x264enc threads=4 sliced-threads=TRUE tune=zerolatency ! matroskamux ! filesink location = /home/nvidia/Pictures/output.mp4 
​
​
#不同分辨率
gst-launch-1.0 v4l2src device=/dev/video0  num-buffers=300 \
! image/jpeg,width=640,height=480,framerate=30/1  \
! jpegdec ! videoconvert \
! tee name=srctee srctee. \
! queue2 ! xvimagesink srctee. \
! queue2 ! x264enc threads=4 sliced-threads=TRUE tune=zerolatency ! matroskamux ! filesink location = /home/nvidia/Pictures/output2.mp4 
​实际效果感觉比较卡顿

 

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
这段代码是在Docker容器中执行的一系列命令,用于安装一些软件包和依赖项。具体来说,它执行以下操作: 1. `apt-get clean`:清理apt-get缓存,以释放磁盘空间。 2. `apt-get update`:更新apt-get软件包列表。 3. `apt-get install -y`:安装以下软件包和依赖项: - `python3`:Python 3的主要二进制文件。 - `python3-pip`:Python 3的包管理工具pip。 - `libopencv-dev`:OpenCV开发库的头文件和静态库。 - `python3-opencv`:Python 3的OpenCV绑定。 - `build-essential`:构建软件包所需的基本工具和编译器。 - `yasm`:视频编解码器的汇编器。 - `cmake`:跨平台的构建工具。 - `libtool`:通用库支持脚本工具。 - `libc6`、`libc6-dev`:C标准库的运行时库和开发文件。 - `unzip`:解压缩工具。 - `wget`:网络下载工具。 - `libnuma1`、`libnuma-dev`:NUMA(非统一内存访问)系统的库和开发文件。 - `libgstreamer1.0-0`:GStreamer多媒体框架的核心库。 - `gstreamer1.0-plugins-base`、`gstreamer1.0-plugins-good`、`gstreamer1.0-plugins-bad`、`gstreamer1.0-plugins-ugly`、`gstreamer1.0-libav`:GStreamer插件和解码器。 - `gstreamer1.0-doc`、`gstreamer1.0-tools`、`gstreamer1.0-x`、`gstreamer1.0-alsa`、`gstreamer1.0-gl`、`gstreamer1.0-gtk3`、`gstreamer1.0-qt5`、`gstreamer1.0-pulseaudio`:GStreamer的文档、工具和相关库。 - `libglib2.0-dev`:GLib开发库的头文件。 - `libgstrtspserver-1.0-dev`:GStreamer RTSP服务器库的开发文件。 - `gstreamer1.0-rtsp`:GStreamer的RTSP插件。 这些操作旨在为容器配置一个适合开发的环境,使其能够支持Python编程、OpenCV图像处理和GStreamer多媒体处理等任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器人虎哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值