本帖最后由 shanji 于 2019-4-27 09:03 编辑
https://www.stmcu.org.cn/module/forum/thread-609701-1-1.html
距上次分享了个网络摄像头的示例也有一段时间了,用的裸TCP协议,这次来玩玩不同的花样,网页摄像头mjpeg-stream传输,用HTTP协议。网上搜了下,清一色的在Linux下实现的,在单片机上实现的还真没找到,为了玩起来,只能琢磨linux下的代码。
一、先把网页做出来
网页端的实现比较简单,用img标签,例:
<html>
<head>
</head>
<body>
<img src="http://192.168.1.199:80/?stm32=mjpeg">,此处的ip指的是服务器的ip。
</body>
</html>
二、 服务端的代码实现
要在网页上看到不断刷新的图片,服务端需要发送如下的相应包
HTTP/1.1 200 OK\r\n
Content-Type: multipart/x-mixed-replace;boundary=xxxxxxxx\r\n\r\n //boundary后面的字段可自行定义 关于multipart/x-mixed-replace和boundary网上有很多专业解释,我就不copy了,知道怎么用它就对了。 要发送图片时的数据包格式是 --xxxxxxxx\r\n Content-Type: img/jpeg\r\n Content-Length: 2048\r\n\r\n //此帧图片的大小 循环发送这样的数据包给网页,网页上就能看到不断刷新的画面了 有了上面的基础,就可以开始码代码。 关键代码: 程序中使用了RT-Therad RTOS,用socket编程。 - **
- * @brief 开始发送流
- * @param client,count
- * @retval None
- */
- HTTP_STA HTTP_Streamer_Start(int client,u8 count)
- {
- int frame_size=0;
- uint16_t haed_len=0;
- sprintf(buffer, "HTTP/1.1 200 OK\r\n"\
- "Connection: Keep-Alive\r\n"\
- "Server: MJPG-Streamer/0.2\r\n"\
- "Cache-Control:no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0\r\n"\
- "Pragma:no-cache\r\n"\
- "Expires:WED, 23 Jan 2019 01:00:00 GMT\r\n"\
- "Content-Type: multipart/x-mixed-replace;boundary=openmcu\r\n\r\n"\
- "--openmcu\r\n");
-
- haed_len=strlen(buffer);
- //printf("\r\n%s\r\n",buffer);
- if(send(client, buffer,haed_len, 0)==-1)
- {
- return HTTP_FAIL;
- }
- #if USE_CAMERA
- frame_size=jpeg_data_len();
- if(frame_size==0) return HTTP_FAIL;
- #else
- if(count==0)
- frame_size=sizeof(cam_data);
- else if(count==1)
- frame_size=sizeof(cam_data2);
- #endif
- haed_len=strlen(buffer);
- sprintf(buffer, "Content-Type: image/jpeg\r\n"\
- "Content-Length: %d\r\n\r\n", frame_size);
- printf("\r\n%s\r\n",buffer);
- haed_len=strlen(buffer);
- if(send(client, buffer,haed_len, 0)==-1)
- {
- return HTTP_FAIL;
- }
- #if USE_CAMERA
- memcpy(&buffer[haed_len],(char*)ptr,frame_size);
- #else
- if(count==0)
- memcpy(&buffer[haed_len],(char*)cam_data,frame_size);
- else if(count==1)
- memcpy(&buffer[haed_len],(char*)cam_data2,frame_size);
- #endif
- if(send(client, &buffer[haed_len],frame_size, 0)==-1)
- {
- return HTTP_FAIL;
- }
- #if USE_CAMERA
- newframe=0;
- cam_start();
- #endif
- //lwip_close(client);
- return HTTP_OK;
- }
复制代码
发送完第一帧图片后,循环发送前面介绍的图片数据格式,就能看到摄像头的实时画面了。
测试源码 |
下次可以和楼主的整合一起
将视频实时显示在屏幕上,
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=622494&page=1#pid2473242
感谢支持下
关闭连接后发不出去了,需要重新等待客户端的连接。
那为什么send后面要close呢,这样之前的send数据也发不出去啊