GStreamer开发笔记(二):GStreamer在ubnutn平台部署安装,测试gstreamer/cheese/ffmpeg/fmplayer打摄像头延迟和内存
前言
本篇介绍ubuntu平台的GStreamer部署安装,然后测试摄像头,进行性能延迟对比。
略。
由于在虚拟机ubuntu上也会测试usb摄像头,因为不是直接硬件到ubuntu,而是先到windows然后虚拟机桥接到ubuntu,可能会到usb摄像头的延迟产生一定影响,但根据经验,大概率几毫秒到几十毫秒之间。
离线安装比较难,首先就要安装几十个依赖工具和库,离线没有这些的话,就是套娃+套娃+套娃,需要费很大劲逐一安装,且解决各种依赖问题,所以就算离线安装也需要先把ubuntu的辅助工具都打上做成个镜像,再去离线安装gstreamer,这里不建议没依赖库的时候直接离线安装。
  
sudo apt-get update
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
命令行打开usb摄像头
gst-launch-1.0.exe -v ksvideosrc do-stats=TRUE ! videoconvert ! autovideosink
命令行打开播放文件
gst-launch-1.0 playbin uri=file:///<你的视频>
gst-launch-1.0 playbin uri=file:////home/yang/Desktop/test.avi
  
命令行打开usb摄像头
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,framerate=30/1 ! videoconvert ! autovideosink
  
使用gstreamer:
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,framerate=30/1 ! videoconvert ! autovideosink
  
  内存占用:
  
cheese相机:
sudo apt-get install cheese
sudo cheese
  
  内存占用:
  
  Ubuntu打开usb摄像头
  
sudo apt-get install ffmpeg
ffplay -f v4l2 /dev/video0
  
  对比内存
  
sudo apt-get install fmplayer
  
  对比内存:
  
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/videodev2.h>
#include <errno.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_pixels.h>
#define WIDTH 640
#define HEIGHT 480
int main() {
    setbuf(stdout, NULL);
    int fd;
    struct v4l2_format fmt;
    struct v4l2_requestbuffers req;
    struct v4l2_buffer buf;
    void *buffer_start;
    unsigned int buffer_length;
    // 打开摄像头设备
    fd = open("/dev/video0", O_RDWR);
    if (fd == -1) {
        perror("打开摄像头设备失败");
        return EXIT_FAILURE;
    }
    // 设置视频格式
    memset(&fmt, 0, sizeof(fmt));
    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    fmt.fmt.pix.width = WIDTH;
    fmt.fmt.pix.height = HEIGHT;
    fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
    fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
    if (ioctl(fd, VIDIOC_S_FMT, &fmt) == -1) {
        perror("设置视频格式失败");
        close(fd);
        return EXIT_FAILURE;
    }
    // 请求缓冲区
    memset(&req, 0, sizeof(req));
    req.count = 1;
    req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    req.memory = V4L2_MEMORY_MMAP;
    if (ioctl(fd, VIDIOC_REQBUFS, &req) == -1) {
        perror("请求缓冲区失败");
        close(fd);
        return EXIT_FAILURE;
    }
    // 映射缓冲区
    memset(&buf, 0, sizeof(buf));
    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    buf.memory = V4L2_MEMORY_MMAP;
    buf.index = 0;
    if (ioctl(fd, VIDIOC_QUERYBUF,  
                    
                     
                    
                 
                    
                