局域网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)
  {
   //开始监听imgsock
   imgcfd=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 yuyv
   fmtdesc.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 for
  
   cam_flag=1;
}


  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用 Python 的 socket 模块可以实现局域网内的通信。 下面是一个简单的示例代码: 服务端: ```python import socket HOST = '' PORT = 5000 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen(1) conn, addr = s.accept() print('Connected by', addr) while True: data = conn.recv(1024) if not data: break conn.sendall(data) conn.close() ``` 客户端: ```python import socket HOST = 'localhost' PORT = 5000 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) s.sendall(b'Hello, world') data = s.recv(1024) print('Received', repr(data)) s.close() ``` 在以上代码中,服务端监听本地地址和端口,并且接收客户端的连接请求。客户端连接服务端后,发送数据并接收服务端返回的数据。可以根据自己的需求修改代码。 ### 回答2: Python中的socket编程可以用于在局域网中实现网络通信。使用socket库可以在python程序中创建客户端和服务器端,使它们可以通过socket连接进行通信。 首先,服务器端需要创建一个socket对象并将其绑定到IP地址和端口号上。之后,服务器端可以使用socket对象的listen()方法来监听客户端的连接请求。一旦有客户端请求连接,服务器端可以使用socket对象的accept()方法来接受连接,并创建一个新的socket对象,用于与客户端进行通信。服务器端可以使用这个新的socket对象的send()和recv()方法来发送和接收数据。 客户端需要创建一个socket对象并将其连接到服务器的IP地址和端口号上。之后,客户端可以使用socket对象的send()和recv()方法来发送和接收数据。 在实际应用中,可以使用Python的socket库配合其他网络协议(如TCP或UDP)来实现各种功能,例如创建一个简单的聊天程序、传输文件等。 总结起来,Python的socket编程可以让程序在局域网中实现网络通信,通过创建socket对象来创建客户端和服务器端,并使用socket对象的方法来进行数据传输。 ### 回答3: Python的Socket模块是用来实现网络通信的一种机制,可以用于在局域网内进行网络通信。使用Socket模块,我们可以创建一个服务器端和一个或多个客户端,它们之间可以进行双向数据交换。 在局域网中进行Socket通信时,服务器端首先通过指定一个IP地址和端口号来创建一个服务器Socket对象。然后,通过调用对象的bind()方法将服务器Socket对象与指定的IP地址和端口号绑定在一起。接着,服务器Socket对象通过调用listen()方法开始监听来自客户端的连接请求。 客户端通过创建一个客户端Socket对象,并指定连接的服务器的IP地址和端口号来连接到服务器端。客户端Socket对象通过调用connect()方法来与服务器Socket对象进行连接。 一旦服务器端和客户端建立连接,它们可以通过调用send()和recv()方法来进行数据的发送和接收。服务器可以通过调用accept()方法接受客户端的连接请求,并通过调用send()方法向客户端发送数据。客户端可以通过调用recv()方法接收服务器端发送过来的数据。 在局域网内进行Socket通信可以方便地实现多台计算机之间的数据交换,例如可以通过局域网socket在不同计算机之间进行文件传输、网络聊天等。使用Python的Socket模块,我们可以简单快速地实现局域网内的网络通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值