llinux,树莓派,摄像头共享内存转websocket播放延迟一秒内

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>

//libjpeg-dev libjpeg8-dev

int Cmaera(unsigned char *mptr[4],unsigned int size[4])
{
int fd = open("/…/…/dev/video0",O_RDWR);
if(fd<0)
{
printf(“打开摄像头失败\n”);
return -1;
}
struct v4l2_format vfmt;
vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
vfmt.fmt.pix.width = 720;
vfmt.fmt.pix.height = 360;
vfmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
vfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
int ret = ioctl(fd,VIDIOC_S_FMT,&vfmt);
if(ret < 0)
{
printf(“打开摄像头失败\n”);
return -1;
}
struct v4l2_requestbuffers reqbuffer;
reqbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
reqbuffer.count = 4;
reqbuffer.memory = V4L2_MEMORY_MMAP;
ret = ioctl(fd,VIDIOC_REQBUFS,&reqbuffer);
if(ret < 0)
{
printf(“申请内核空间失败\n”);
return -1;
}
struct v4l2_buffer mapbuffer;
mapbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

for(int i = 0;i < 4;i++)
{
mapbuffer.index = i;
ret = ioctl(fd,VIDIOC_QUERYBUF,&mapbuffer);
if(ret < 0)
{
printf(“查询内核空间失败\n”);
}
mptr[i] = (unsigned char *)mmap(NULL,mapbuffer.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,mapbuffer.m.offset);
size[i] = mapbuffer.length;
ret = ioctl(fd,VIDIOC_QBUF,&mapbuffer);
if(ret < 0)
{
printf(“放回内核空间失败\n”);
}
}
int type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
ret = ioctl(fd,VIDIOC_STREAMON,&type);
if(ret < 0)
{
printf(“开启失败\n”);
}
struct v4l2_buffer readbuffer;
readbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
int shmid;
char *shmbuf=0;
if((shmid = shmget(666,271360,0777 | IPC_CREAT)) < 0)
{
printf(“共享内存错误id\n”);
}
if((shmbuf = shmat(shmid,0,0)) < (char *)0)
{
printf(“共享内存错误\n”);
}
while(1)
{
ret = ioctl(fd,VIDIOC_DQBUF,&readbuffer);
if(ret < 0)
{
printf(“提取失败\n”);
}
{
memcpy(shmbuf,mptr[readbuffer.index],readbuffer.length);
}
ret = ioctl(fd,VIDIOC_QBUF,&readbuffer);
if(ret < 0)
{
printf(“放回列队失败\n”);
}

}

ret = ioctl(fd,VIDIOC_STREAMOFF,&type);
if(ret < 0)
{
printf(“提取失败\n”);
}

for(int i = 0;i < 4;i++)
{
munmap(mptr[i],size[i]);
}
close(fd);

}

int main(int argc, char *argv[])
{
unsigned char *mptr[4];
unsigned int size[4];
int id = getpid();
int pid = getppid();
char * ppid = NULL;
FILE *files;
files = fopen("/wss/log/Cmaera_pid.log",“wb+”);
fprintf(files,"%d",id);
fclose(files);
Cmaera(mptr,size);
return -1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值