IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> v4l2帧的tcp传输模板 -> 正文阅读

[网络协议]v4l2帧的tcp传输模板

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <error.h>
#include <string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <fcntl.h>
#include <linux/videodev2.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <strings.h>


struct buffer
{
	void* start;
	unsigned int length;
}*buffers;

int main(void)
{
	char id[10];
	int ret;
	int sockfd; //套接字描述符

	sockfd = socket(AF_INET ,SOCK_STREAM, 0); //创建通信套接字(TCP)
	if(sockfd == -1)
	{
		printf("socket failed\n");
		exit(-1);
	}

	//定义addr存入本机地址信息
	struct sockaddr_in addr;

   	addr.sin_family = AF_INET; //协议
	addr.sin_port = htons(9999);    //端口
	addr.sin_addr.s_addr= inet_addr("127.0.0.1"); //服务器地址

	ret = connect(sockfd, (struct sockaddr *)&addr, sizeof(addr));  //连接tcp客服端

	// printf("sdf\n");
	if(ret == -1)
	{
		printf("connect failed!\n");
		return 0;
   	}
    	printf("connect success!\n");
	strcpy(id, "video");
	send(sockfd, id, sizeof(id),0);//发送身份信息

    //打开摄像头
	int fd = open("/dev/video0",O_RDWR);
	if(fd<0)
		return -1;

	// 查看设备属性
	struct v4l2_capability cap;
	ioctl(fd,VIDIOC_QUERYCAP,&cap);
	printf("Driver Name:%s\nCard Name:%s\nBus info:%s\nDriver Version:%u.%u.%u\n",cap.driver,cap.card,cap.bus_info,(cap.version>>16)&0XFF, (cap.version>>8)&0XFF,cap.version&0XFF);
	//设置摄像头格式
	struct v4l2_format fmt;
	fmt.fmt.pix.width = 1024;
	fmt.fmt.pix.height = 768;
	fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
	ioctl(fd, VIDIOC_S_FMT,&fmt);
	
	//申请摄像头采集图片的buf
	struct v4l2_requestbuffers req;
	memset(&req,0,sizeof(req));
	req.count = 3; //缓冲个数 
	req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	req.memory = V4L2_MEMORY_MMAP;
	ioctl(fd, VIDIOC_REQBUFS,&req);
	
	// //映射 系统空间 ---> 用户空间
	buffers = (struct buffer*)calloc(req.count, sizeof (*buffers));
	if (!buffers) {
		fprintf(stderr, "Out of memory/n");
		exit(EXIT_FAILURE);
	}
	for (unsigned int n_buffers = 0; n_buffers < req.count; ++n_buffers)
	{
		struct v4l2_buffer buf;
		memset(&buf,0,sizeof(buf));
		buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
		buf.memory = V4L2_MEMORY_MMAP;
		buf.index = n_buffers;
		// 查询序号为n_buffers 的缓冲区,得到其起始物理地址和大小
		if (-1 == ioctl(fd, VIDIOC_QUERYBUF, &buf)) exit(-1);
		buffers[n_buffers].length = buf.length;
		// 映射内存
		buffers[n_buffers].start = mmap(NULL,buf.length,PROT_READ | PROT_WRITE ,MAP_SHARED,fd, buf.m.offset);
		if (MAP_FAILED == buffers[n_buffers].start) exit(-1);
	}

	// 把四个缓冲帧放入队列,并启动数据流
	unsigned int i;
	enum v4l2_buf_type type;
	for (i = 0; i < 3; ++i) // 将缓冲帧放入队列
	{
		struct v4l2_buffer buf;
		buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
		buf.memory = V4L2_MEMORY_MMAP;
		buf.index = i;
		ioctl(fd, VIDIOC_QBUF, &buf);
	}
	type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	ioctl(fd, VIDIOC_STREAMON, &type);


	struct v4l2_buffer buf; 
	// CLEAR (buf);
	buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	buf.memory = V4L2_MEMORY_MMAP;
	while(1) {
		ioctl(fd, VIDIOC_DQBUF, &buf); // 从缓冲区取出一个缓冲帧
		
		// printf("图片大小: %d\n", buf.bytesused);
		send(sockfd, &(buf.bytesused), 4, 0);  //发送图片长度信息
		send(sockfd, buffers[buf.index].start, buf.bytesused, 0);//发送图片

		ioctl(fd, VIDIOC_QBUF, &buf);   // 从缓冲区放回一个缓冲帧
		// break;
		usleep(500);
	}
	//关闭摄像头
	close(sockfd);
	close(fd);
    return 0;
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-01-04 13:46:39  更:2022-01-04 13:47:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/5 9:27:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码