你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

全网首发,用STM32F429实现的网页摄像头mjpeg-stream  

[复制链接]
shanji 发布时间:2019-4-1 17:58
本帖最后由 shanji 于 2019-4-27 09:03 编辑
  R) H) ?$ l# q: z( |; M+ K( u  o0 U+ G& |, p
https://www.stmcu.org.cn/module/forum/thread-609701-1-1.html
* ~4 ~. M% B  R# z" a0 w距上次分享了个网络摄像头的示例也有一段时间了,用的裸TCP协议,这次来玩玩不同的花样,网页摄像头mjpeg-stream传输,用HTTP协议。网上搜了下,清一色的在Linux下实现的,在单片机上实现的还真没找到,为了玩起来,只能琢磨linux下的代码。( `; Q* b; A8 a, a
        一、先把网页做出来
' r0 y6 L9 P# d! |! R  x* W      网页端的实现比较简单,用img标签,例:6 y, ^: I' }7 }: O4 b! T! I
<html>4 a8 X% G& ]0 S, ~
      <head>2 G! F  ~* |' z; a
      </head>
% q6 p% E# S' n5 q- }5 ~1 v      <body>) \2 \( H' R& \, X4 `1 P# ^
      <img src="http://192.168.1.199:80/?stm32=mjpeg">,此处的ip指的是服务器的ip。/ n- m: f6 k9 A4 C) |# `" G& F( Z
      </body>! {! g/ D  U$ E
</html>
( V% ]/ L  _$ w% z      二、 服务端的代码实现1 _/ I; U9 g$ b) O6 C- P5 l8 F
      要在网页上看到不断刷新的图片,服务端需要发送如下的相应包8 y! D3 u6 K3 @$ b
     HTTP/1.1 200 OK\r\n, J  X) P9 g8 ^5 @  J2 b# ?7 d3 p
& i: T+ Z9 P; T1 L: [* S
     Content-Type: multipart/x-mixed-replace;boundary=xxxxxxxx\r\n\r\n   //boundary后面的字段自行定义
     关于multipart/x-mixed-replaceboundary网上有很多专业解释,我就不copy了,知道怎么用它就对了。
    要发送图片时的数据包格式是
  --xxxxxxxx\r\n
   Content-Type: img/jpeg\r\n
   Content-Length: 2048\r\n\r\n  //此帧图片的大小
   循环发送这样的数据包给网页,网页上就能看到不断刷新的画面了      
   有了上面的基础,就可以开始码代码。
    关键代码:
     程序中使用了RT-Therad RTOS,用socket编程。
  1. **
    - E1 f8 `! p% o: v' u# h  t( e
  2.   * @brief 开始发送流* c' O- e6 G* B: X
  3.   * @param  client,count7 h1 D+ t% f  f5 r. f* z
  4.   * @retval None! b; F' a7 f; b- ^' y5 a3 F& P
  5.   */
    ! P) R% Y) q% t% z% w
  6. HTTP_STA HTTP_Streamer_Start(int client,u8 count)9 G2 f6 q9 f, v: W, j: _; X
  7. {        : H" K+ n1 G% C5 c
  8.     int frame_size=0;+ V# U; G! |$ w6 s3 h
  9.    uint16_t haed_len=0;/ h. o6 o0 }! x$ E- @# u
  10.    sprintf(buffer, "HTTP/1.1 200 OK\r\n"\0 _# r& B6 _8 H' q% y4 g! H
  11.    "Connection: Keep-Alive\r\n"\$ ~# B6 ]. ?: v! Y
  12.    "Server: MJPG-Streamer/0.2\r\n"\+ I" K6 K- y8 o
  13.    "Cache-Control:no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0\r\n"\
    - Q, V1 A/ p6 r, P% Z
  14.    "Pragma:no-cache\r\n"\& @' _) U$ r( O8 B' K& d9 ^
  15.    "Expires:WED, 23 Jan 2019 01:00:00 GMT\r\n"\
    4 {1 q# B4 ?3 V
  16.    "Content-Type: multipart/x-mixed-replace;boundary=openmcu\r\n\r\n"\7 o/ Q3 I7 g, h+ l/ y, Y
  17.    "--openmcu\r\n");
    ; \1 @0 b4 Y) o2 S" [/ O9 ]) o
  18.                               0 E& S9 y+ n6 N% P( u$ x. y, G
  19.     haed_len=strlen(buffer);
    : F' y- p" p. Z2 {* m
  20.    //printf("\r\n%s\r\n",buffer);7 o7 f% ?1 l: n* `2 ~/ k% A. D
  21.    if(send(client, buffer,haed_len, 0)==-1)( A  z2 h$ b+ y
  22.    {) Z- Z1 L- [) }  d) `; ?
  23.       return HTTP_FAIL;) i3 z) H; R6 I
  24.    }, ~& _. x2 P3 Z% e; `- d
  25.   #if USE_CAMERA* [# g' \8 }. y) ~( X6 ^5 J
  26.   frame_size=jpeg_data_len();
    ( }& y% s. ]2 z4 h9 ?& V4 I
  27.   if(frame_size==0) return HTTP_FAIL;% S: G: Z: d& L  E3 @7 O( G
  28.   #else
    1 i' Q4 ^& L1 @& M
  29.   if(count==0)- t' B2 ?7 l6 j
  30.   frame_size=sizeof(cam_data);
      B# h8 K5 d: Q
  31.   else if(count==1)8 U7 l2 {2 b2 t: a
  32.   frame_size=sizeof(cam_data2);
    ) [0 y( }# S. ~. A' _
  33.   #endif            G+ k3 b. l, l
  34.   haed_len=strlen(buffer);; s; p, ?& x9 e, W  ]  n
  35. , Z% x8 S# j. X; c9 L4 \- B  x2 R
  36.   sprintf(buffer, "Content-Type: image/jpeg\r\n"\" D$ N  l' s( A. X
  37.   "Content-Length: %d\r\n\r\n", frame_size);& T* m$ \! |6 S  @5 k
  38.   printf("\r\n%s\r\n",buffer);( p4 h+ J: E4 Y1 Q1 m0 t
  39.   haed_len=strlen(buffer);3 f1 o* l9 O! D( t6 C
  40.   if(send(client, buffer,haed_len, 0)==-1)
    1 D8 z3 I; [0 C) I: }0 w7 k" n
  41.   {
    + W) E) t! G/ L, K: h2 j4 l5 }5 {
  42.      return HTTP_FAIL;& N6 G- s% x2 F. h7 {
  43.    }
    $ q, Z5 C0 t  ~2 G3 S
  44.   #if USE_CAMERA
    2 Y( E3 ]1 v  t3 h$ _
  45.   memcpy(&buffer[haed_len],(char*)ptr,frame_size);
    ' Z* a) }3 F: d/ H7 U# T: M5 b6 g
  46.   #else
    ' q5 c8 {7 L+ D- x( p/ ]  @+ |
  47.   if(count==0)
    * u: {: O/ [' Z+ T( o
  48.   memcpy(&buffer[haed_len],(char*)cam_data,frame_size);1 P/ C9 c+ a, h# p
  49.   else if(count==1)1 z$ C( _# ^" X! L& m
  50.   memcpy(&buffer[haed_len],(char*)cam_data2,frame_size);) Q, |. }, I4 \. X" Q$ @5 J
  51.   #endif                 
    ) b5 e& ]+ r' Y  |3 g
  52.   if(send(client, &buffer[haed_len],frame_size, 0)==-1)5 W6 l5 X4 C+ U  o$ j
  53.   {
    8 l& `6 H2 Q3 ?6 o* e
  54.      return HTTP_FAIL;  c; @: X) U, c
  55.   }( J0 c: ~, T! Z4 G, ^
  56.   #if USE_CAMERA
    * f. W0 @' B3 F$ b! u; r5 z
  57.        newframe=0;  " Y' d. x2 N7 [( k) I
  58.        cam_start();         
    # m4 f& p" r: `$ o% Z
  59.   #endif
    ( o4 c+ q7 I, Y  D" ?
  60.       //lwip_close(client);               
    / w4 M! M6 l; N- J& p! d! J; g" B8 q$ ]
  61.   return HTTP_OK;
    9 a4 d% e' ^$ o
  62. }
复制代码
1 v4 A; X4 x' V# i, p
发送完第一帧图片后,循环发送前面介绍的图片数据格式,就能看到摄像头的实时画面了。
GIF2.gif
( `9 U' D  |8 G1 `- R
测试源码
【】STM32F429_网络摄像头(网页版)V1.1.rar (1.74 MB, 下载次数: 354)

评分

参与人数 2 ST金币 +13 收起 理由
你若安好_清风徐来 + 5 很给力!
g921002 + 8 很给力!

查看全部评分

1 收藏 19 评论202 发布时间:2019-4-1 17:58

举报

202个回答
昱枫 回答时间:2019-12-19 10:06:22
学习了,
6 [+ c: I: L1 b4 }# X7 C6 r; }下次可以和楼主的整合一起
7 U( S- g6 s2 _" u: Z, e- p/ g将视频实时显示在屏幕上,. e  P1 x- d2 w7 k; H& I/ z# p
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=622494&page=1#pid2473242
3 h9 ?6 Y6 V# I7 z
0 h+ `" t1 r. x' B( s: T感谢支持下
$ i9 g1 l2 Z, W8 [* _
shanji 回答时间:2019-4-3 10:34:11
yklstudent-1794 发表于 2019-4-3 10:16, ^/ @! m  {) a5 F4 [
楼主请教下,发送数据后就立即关闭连接,之前发送的数据还能发送出去吗? ...
# p  d$ m8 ]$ I6 m" L! U
关闭连接后发不出去了,需要重新等待客户端的连接。
yklstudent 回答时间:2019-4-3 10:43:01
shanji 发表于 2019-4-3 10:34* r+ o8 x  x) Q
关闭连接后发不出去了,需要重新等待客户端的连接。

0 }/ x# L* e8 ?0 R% a( U那为什么send后面要close呢,这样之前的send数据也发不出去啊
海迹天涯 回答时间:2019-4-2 09:30:25
厉害了我的哥
3111272 回答时间:2019-4-2 09:31:44
膜拜大佬
Wature 回答时间:2019-4-2 09:58:24
真的是厉害了我的哥
神奇小芭比 回答时间:2019-4-2 09:59:41
厉害了我的歌
Kevin_G 回答时间:2019-4-2 10:11:11
点赞,超级牛
xiaobai.. 回答时间:2019-4-2 10:41:30
不错
网络孤客 回答时间:2019-4-2 10:54:27
厉害,学习学习!
Bowen 回答时间:2019-4-2 10:54:58
厉害了,学习下
STMWoodData 回答时间:2019-4-2 11:29:19
提示: 作者被禁止或删除 内容自动屏蔽
与我非 回答时间:2019-4-2 11:35:29
厉害厉害
yklstudent 回答时间:2019-4-2 12:32:20
MARK,厉害了我的哥
STMCU-管管 回答时间:2019-4-2 13:00:43
支持支持
七哥 回答时间:2019-4-2 13:04:33
膜拜
老牛洋车 回答时间:2019-4-2 13:20:00
佩服!拜楼主为师。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版