ret=pthread_create(&cam_id,NULL,cam_work,NULL); //启动摄像头采集线程

void *cam_work(void *arg)
{struct sockaddr_in img_peer;socklen_t len=sizeof(struct sockaddr_in);struct v4l2_buffer buf_temp;int on=1,dst_fd,ret,count,jpg_len;char temp[64];if(cam_flag<1) return;memset(&buf_temp,0,sizeof(buf_temp));buf_temp.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;buf_temp.memory = V4L2_MEMORY_MMAP;//开启视频if(ioctl(camfd,VIDIOC_STREAMON,&on)<0){perror("camera stream");return;}while(1){//开始监听imgsockimgcfd=accept(img_fd,(struct sockaddr *)&img_peer,&len);  strcpy(server_info.net.img_socket,"connected");while(imgcfd){if(ioctl(camfd,VIDIOC_DQBUF,&buf_temp)<0){perror("DQBUF");cam_flag=0;exit(-1);}//测试将图像写入文件//dst_fd=open("./test.bmp",O_RDWR|O_CREAT|O_TRUNC,0777);//write(dst_fd,img[buf.index],buf.length);//close(dst_fd);//dst_fd=open("./test2.bmp",O_RDWR|O_CREAT|O_TRUNC,0777);//count =0;//while(count<buf.length)//{//count+=write(dst_fd,img[buf.index]+count,1024);//}//close(dst_fd);*/count=0;write(server_info.net.img_cfd,"img_start",9);ret=read_img(); if(ret<=0){ioctl(camfd,VIDIOC_QBUF,&buf_temp);continue;}int xx;printf("%d %d frame\n",xx++,buf_temp.bytesused);while(count<buf_temp.bytesused){ret=write(server_info.net.img_cfd,img[buf.index]+count,1450);if(ret<=0){close(imgcfd);imgcfd=0;break;}count+=ret;server_info.net.img_tx +=ret;ret=read_img();if(ret<=0)break;}ioctl(camfd,VIDIOC_QBUF,&buf_temp);}//end while}//end while
}
//初始化相机
int init_camera(void)
{int ret=0,i;printf("Init camera %s...",server_info.cdev_cam);camfd=open(server_info.cdev_cam,O_RDWR);if(camfd<0){printf("Open error...Ignore\n");cam_flag=0;return 1;}printf("...ok\n");//查询驱动信息ioctl(camfd,VIDIOC_QUERYCAP,&cap);printf("DriverName:%s\n",cap.driver);printf("Card Name:%s \n",cap.card);printf("Bus info:%s\n",cap.bus_info);printf("DriverVersion:%u.%u.%u\n",\(cap.version>>16)&0Xff,\(cap.version>>8)&0Xff,\cap.version & 0xff);  //显示当前支持的数据格式Mjpeg yuyvfmtdesc.index=0;fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;while(ioctl(camfd,VIDIOC_ENUM_FMT,&fmtdesc)!=-1)printf("Support:%d %s\n",fmtdesc.index++,fmtdesc.description);//显示支持的解析度for(i=0;;i++){fmtsize.index=i;fmtsize.pixel_format = fmtdesc.pixelformat;if(ioctl(camfd,VIDIOC_ENUM_FRAMESIZES,&fmtsize)<0)break;switch(fmtsize.type){case V4L2_FRMSIZE_TYPE_DISCRETE:printf("Width = %d Height = %d\n",\fmtsize.discrete.width,fmtsize.discrete.height);break;}}//end for//设置摄像头工作参数memset(&fmt,0,sizeof(fmt));fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;fmt.fmt.pix.width = server_info.cam.width;fmt.fmt.pix.height = server_info.cam.height;//fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;//fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;if(ioctl(camfd,VIDIOC_S_FMT,&fmt)<0){perr("camera set format")return -1;}  //申请1个缓冲区req.count=1;req.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;req.memory=V4L2_MEMORY_MMAP;if(ioctl(camfd,VIDIOC_REQBUFS,&req)<0){perr("camera request buff")return -1;}memset(&buf,0,sizeof(buf));for(i=0;i<1;i++){buf.index = i;buf.type =V4L2_BUF_TYPE_VIDEO_CAPTURE;//获得缓冲区首地址放入img[]里if(ioctl(camfd,VIDIOC_QUERYBUF,&buf)==0){printf("buffer %d offset=%d len=%d\n",i,buf.m.offset,buf.length);img[i]=(char*) mmap(NULL,buf.length,PROT_READ,MAP_SHARED,\camfd,buf.m.offset);if(img[i]==MAP_FAILED){perr("mmap failed");return -1;}//加入缓冲区采集队列if(ioctl(camfd,VIDIOC_QBUF,&buf)<0){perr("qbuf")return -1;}}//end if}//end forcam_flag=1;
}

局域网socket传输视频流相关推荐

  1. 基于DirectShow的局域网内音视频流的多机共享

    1.  引言 在局域网内传输音.视频等多媒体数据主要有两种方案:下载和流式传送.下载的主要缺点是,必须等全部内容传输完毕,然后才能在本地机器打开:而采用流式传输方案,多媒体数据流可以连续.实时地向用户 ...

  2. 利用VC++实现局域网实时传输

    本文针对不同的局域网,提出一种通用的实时视频传输的解决方案.在使用Divx编解码的基础上,提出了从压缩.组帧.发送到接收.解压整个流程的思想,具体实施方案和VC++实现核心源代码以及传输控制策略,有效 ...

  3. 第三季1:ORTP库的移植与局域网视频传输

    以下内容源于朱有鹏课程,如有侵权,请告知删除. 本季课程重点在于使用ORTP库来实现局域网视频实时传输. 一.ORTP的介绍 1.视频网络传输的两种方式 (1)基于下载 比如http(Hyper Te ...

  4. python 编写一个局域网文件传输的程序

    可以使用 Python 的 socket 模块来编写一个局域网文件传输程序. 首先,你需要在服务端程序中创建一个 socket 对象,并绑定到特定的 IP 地址和端口上.然后,服务端可以通过调用 so ...

  5. 局域网传输还在用飞鸽?还在用QQ,其实Python也可以实现类似的功能!Python基于scoket实现多路复用TCP局域网文件传输

    局域网传输的基本信息 1.IO是什么? ⦁定义 ⦁ 阻塞IO ⦁ 非阻塞IO 2.IO多路复用 定义 select具体用法 3.实现多路复用局域网文件传输 server.py client.py Fi ...

  6. Python局域网socket无法连接的问题解决

    Python局域网socket无法连接的问题解决 服务器端的socket监听的是否是服务器的IP地址(并不是什么'localhost'或者'127.0.0.1'这种).即客户端需要连接的IP地址填入即 ...

  7. socket传输结构体,c++,发送OK,recv返回字节大小正确但接受数据为空

    socket传输结构体,c++,发送OK,recv返回字节大小正确但接受数据为空 服务端在ubuntu服务器下,客户端在windows下,采用socket进行通信,在客户端接收数据时,出现了诡异的情况 ...

  8. linux c 图像处理,基于uClinux的图像处理及Socket传输的实现-计算机应用与软件.PDF...

    基于uClinux的图像处理及Socket传输的实现-计算机应用与软件 第32卷第4期 计算机应用与软件 Vol32No.4 2015年4月 ComputerApplicationsandSoftw ...

  9. java socket 传输压缩文件_java基于socket传输zip文件功能示例

    本文实例讲述了java基于socket传输zip文件的方法.分享给大家供大家参考,具体如下: 服务器端程序: import java.io.*; import java.net.*; import j ...

最新文章

  1. linux find命令中-print0和xargs中-0的用法
  2. C# Marshal的使用,非托管内存中分配内存注意的问题
  3. UIBackgroundTaskIdentifier 进入后台后结束任务再挂起APP
  4. Thinkpad T61/R61/X61安装XP驱动流程
  5. Git submodule 知识总结
  6. 敏捷开发你必须知道的7件事
  7. Android studio3.2学习开发JNI并且生成so库教程
  8. SQL server 2008配置与用户名登录
  9. 基于小脑模型神经网络轨迹跟踪matlab程序
  10. 让注册体验来得更简单点吧
  11. vmware10密钥
  12. 车牌识别摄像头php,高清车牌识别摄像头SDK支持二次开发
  13. ExtJs6学习(二)【环境介绍,构建程序】
  14. vs2019安装和使用教程(详细)
  15. Linux 4G模块pppd拨号上网脚本解析
  16. itunes更新失败卸载失败(AppleMobileDeviceSupport6464安装时回滚的解决办法)
  17. html5数学公式编辑器,Daum Equation Editor:数学公式编辑器
  18. 小程序开通直播的思路总结
  19. ubuntu和windows双系统默认启动顺序
  20. 算术移位和逻辑移位详解

热门文章

  1. 上传文件,压缩临时图片,不做本地图片存储,用于传输
  2. input边框怎么去掉
  3. Thinkphp6 对接google谷歌第三方登录接口
  4. 【JMeter】总结 jmeter 中各种函数
  5. 基于MIMO的滤波器组多载波调制技术(后期将附上MATLAB代码)
  6. tif文件转为shp文件_在arcgis中怎么把tif格式的遥感图像转换为矢量图
  7. mysql 5.7的my.ini的位置在隐藏文件夹“ProgramData”下面
  8. 常用SQL语句大全实例总结-基础篇
  9. C/C++基于朋友圈的商品推荐系统
  10. 网盘拉新项目的变现玩法解析!