局域网socket传输视频流
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传输视频流相关推荐
- 基于DirectShow的局域网内音视频流的多机共享
1. 引言 在局域网内传输音.视频等多媒体数据主要有两种方案:下载和流式传送.下载的主要缺点是,必须等全部内容传输完毕,然后才能在本地机器打开:而采用流式传输方案,多媒体数据流可以连续.实时地向用户 ...
- 利用VC++实现局域网实时传输
本文针对不同的局域网,提出一种通用的实时视频传输的解决方案.在使用Divx编解码的基础上,提出了从压缩.组帧.发送到接收.解压整个流程的思想,具体实施方案和VC++实现核心源代码以及传输控制策略,有效 ...
- 第三季1:ORTP库的移植与局域网视频传输
以下内容源于朱有鹏课程,如有侵权,请告知删除. 本季课程重点在于使用ORTP库来实现局域网视频实时传输. 一.ORTP的介绍 1.视频网络传输的两种方式 (1)基于下载 比如http(Hyper Te ...
- python 编写一个局域网文件传输的程序
可以使用 Python 的 socket 模块来编写一个局域网文件传输程序. 首先,你需要在服务端程序中创建一个 socket 对象,并绑定到特定的 IP 地址和端口上.然后,服务端可以通过调用 so ...
- 局域网传输还在用飞鸽?还在用QQ,其实Python也可以实现类似的功能!Python基于scoket实现多路复用TCP局域网文件传输
局域网传输的基本信息 1.IO是什么? ⦁定义 ⦁ 阻塞IO ⦁ 非阻塞IO 2.IO多路复用 定义 select具体用法 3.实现多路复用局域网文件传输 server.py client.py Fi ...
- Python局域网socket无法连接的问题解决
Python局域网socket无法连接的问题解决 服务器端的socket监听的是否是服务器的IP地址(并不是什么'localhost'或者'127.0.0.1'这种).即客户端需要连接的IP地址填入即 ...
- socket传输结构体,c++,发送OK,recv返回字节大小正确但接受数据为空
socket传输结构体,c++,发送OK,recv返回字节大小正确但接受数据为空 服务端在ubuntu服务器下,客户端在windows下,采用socket进行通信,在客户端接收数据时,出现了诡异的情况 ...
- linux c 图像处理,基于uClinux的图像处理及Socket传输的实现-计算机应用与软件.PDF...
基于uClinux的图像处理及Socket传输的实现-计算机应用与软件 第32卷第4期 计算机应用与软件 Vol32No.4 2015年4月 ComputerApplicationsandSoftw ...
- java socket 传输压缩文件_java基于socket传输zip文件功能示例
本文实例讲述了java基于socket传输zip文件的方法.分享给大家供大家参考,具体如下: 服务器端程序: import java.io.*; import java.net.*; import j ...
最新文章
- linux find命令中-print0和xargs中-0的用法
- C# Marshal的使用,非托管内存中分配内存注意的问题
- UIBackgroundTaskIdentifier 进入后台后结束任务再挂起APP
- Thinkpad T61/R61/X61安装XP驱动流程
- Git submodule 知识总结
- 敏捷开发你必须知道的7件事
- Android studio3.2学习开发JNI并且生成so库教程
- SQL server 2008配置与用户名登录
- 基于小脑模型神经网络轨迹跟踪matlab程序
- 让注册体验来得更简单点吧
- vmware10密钥
- 车牌识别摄像头php,高清车牌识别摄像头SDK支持二次开发
- ExtJs6学习(二)【环境介绍,构建程序】
- vs2019安装和使用教程(详细)
- Linux 4G模块pppd拨号上网脚本解析
- itunes更新失败卸载失败(AppleMobileDeviceSupport6464安装时回滚的解决办法)
- html5数学公式编辑器,Daum Equation Editor:数学公式编辑器
- 小程序开通直播的思路总结
- ubuntu和windows双系统默认启动顺序
- 算术移位和逻辑移位详解
热门文章
- 上传文件,压缩临时图片,不做本地图片存储,用于传输
- input边框怎么去掉
- Thinkphp6 对接google谷歌第三方登录接口
- 【JMeter】总结 jmeter 中各种函数
- 基于MIMO的滤波器组多载波调制技术(后期将附上MATLAB代码)
- tif文件转为shp文件_在arcgis中怎么把tif格式的遥感图像转换为矢量图
- mysql 5.7的my.ini的位置在隐藏文件夹“ProgramData”下面
- 常用SQL语句大全实例总结-基础篇
- C/C++基于朋友圈的商品推荐系统
- 网盘拉新项目的变现玩法解析!