linux下视频采集服务器.docx
- 文档编号:11033601
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:25
- 大小:23.37KB
linux下视频采集服务器.docx
《linux下视频采集服务器.docx》由会员分享,可在线阅读,更多相关《linux下视频采集服务器.docx(25页珍藏版)》请在冰豆网上搜索。
linux下视频采集服务器
linux下多线程网络编程,实现arm9视频采集和网络发送jpeg数据,使用udp协议,自己写的,搞了好几天!
linux下的多线程比较复杂易出错。
linuxnetworkunderthemulti-threadedprogramming,videocaptureandrealizeARM9sendjpegdatanetwork,usingudpprotocol,wroteitmyself,engagedinforseveraldays!
linuxunderthemorecomplicatedmulti-threaded,error-prone.
1.//多线程成功实例
2.#include
3.#include
4.#include
5.#include
6.#include
7.#include
8.#include
9.#include
10.#include
11.#include
12.#include
13.#include
14.#include
15.#include
16.#include
17.#include
18.#include
19.#include
20.#include
21.#include
22.#include
23.#include
24.#include
25.#include
26.#include
27.#include
28.#include
29.#include
30.
31.#define BUFSIZE 6
32.#define DATA 32*1024
33.#define PORT 5000
34.#define RTP_HDR_SZ 12
35.#define VIDEO_PALETTE_JPEG 21
36.
37.unsigned char buf[BUFSIZE+2][DATA];
38.int head,tail;
39.
40.sem_t writen;
41.sem_t readn;
42.
43.struct ARG{int sockfd;
44. int sin_size;
45. struct sockaddr_in client;
46.};
47.
48.struct FDG{
49.int video_fd;
50.};
51.
52.typedef unsigned char u_int8;
53.typedef unsigned short u_int16;
54.
55.int get_jpegsize (unsigned char *buf, int insize);
56.double tdbl(struct timeval *a);
57.pthread_mutex_t buffer_mutex=PTHREAD_MUTEX_INITIALIZER;
58.
59.static void *producer(void *fdg)
60.{
61. struct FDG *vd;
62. int video_fd;
63.
64. if(sizeof(fdg)!
=sizeof(struct FDG))
65. {
66. perror("producer arg error");
67. exit
(1);
68. }
69. else
70. {
71. vd=(struct FDG *)fdg;
72. video_fd=vd->video_fd;
73. free(fdg);
74. fdg=NULL;
75. }
76.
77.
78. for( ; ; )
79. {
80. sem_wait(&writen);//减少可读的资源数
81. pthread_mutex_lock(&buffer_mutex);//进入互斥区
82. // memset(buf[head], 's', 20);
83. read(video_fd, buf[head], DATA);
84. head=(head+1) % BUFSIZE;
85.
86. pthread_mutex_unlock(&buffer_mutex);//离开互斥区
87. sem_post(&readn);//增加可读资源数
88. // sleep(0.0001);
89. }
90.}
91.static void *consumer(void *arg)
92.{
93. int sockfd;
94. int sin_size;
95. int jpegsize;
96. struct sockaddr_in client;
97. struct ARG *info;
98. typedef struct {
99. unsigned int version:
2;/* protocol version */
100. unsigned int p:
1; /* padding flag */
101. unsigned int x:
1; /* header extension flag */
102. unsigned int cc:
4; /* CSRC count */
103. unsigned int m:
1; /* marker bit */
104. unsigned int pt:
7; /* payload type */
105. unsigned int seq:
16; /* sequence number */
106. unsigned int ts; /* timestamp */
107. unsigned int ssrc; /* synchronization source */
108. } rtp_hdr_t;
109. struct timeval start;
110. rtp_hdr_t rtphdr;
111. u_int8 *jpeg_data;
112. u_int8 *packet_buf;
113. unsigned int ts;
114. unsigned int ssrc;
115. u_int8 *ptr;
116. u_int8 frame,bframe;
117. int bytes_left ;//jpeg数据总长度
118. int data_len,packetsize;//packetsize变量
119. info=( struct ARG *)arg;
120. if(info->sockfd<0)
121. {
122. perror("error error");
123. exit
(1);
124. }
125.
126. if(info->sin_size!
=16)
127. {
128. perror("err error");
129. exit
(1);
130. }
131. sockfd=info->sockfd;
132. sin_size=info->sin_size;
133. memcpy(&client,&info->client,sizeof(info->client));
134. free(arg);
135. arg=NULL;
136.
137. packetsize=RTP_HDR_SZ+2050;
138. packet_buf = (u_int8 *)calloc(packetsize, sizeof(u_int8));
139. jpeg_data= (u_int8 *) malloc(DATA);
140.
141. for(;;)
142. {
143. frame=0;
144. gettimeofday(&start, 0);
145. ts = (unsigned int)(tdbl(&start)*1000);
146. ssrc = 125;
147. /* Initialize RTP header*/
148.
149. rtphdr.version = 2;
150. rtphdr.p = 0;
151. rtphdr.x = 0;
152. rtphdr.cc = 0;
153. rtphdr.m = 0;
154. rtphdr.pt = 40;
155. rtphdr.seq = 1;
156. rtphdr.ts = htonl(ts);
157. rtphdr.ssrc = htonl(ssrc);
158.
159. sem_wait(&readn);//减少可读的资源数
160.
161. pthread_mutex_lock(&buffer_mutex);//进入互斥区
162.
163. jpegsize=get_jpegsize(buf[tail],DATA);
164.
165. if(jpegsize!
=-1)
166. {
167. memcpy(jpeg_data,buf[tail],jpegsize);
168. }
169.
170. tail=(tail+1) % BUFSIZE;
171.
172. pthread_mutex_unlock(&buffer_mutex);//离开互斥区
173.
174. sem_post(&writen);//增加可读资源数
175.
176. bytes_left = jpegsize;
177.
178. while (bytes_left > 0)
179. {
180. ptr = packet_buf + RTP_HDR_SZ;
181.
182. bframe=frame;
183.
184. data_len = packetsize - (ptr - packet_buf)-2;//每一分片大小
185.
186. if (data_len >= bytes_left) //当为最后一个分片时
187. {
188. data_len = bytes_left;
189. rtphdr.m = 1;
190. bframe=255;
191. data_len=jpegsize%2048;
192. }
193.
194. *ptr=bframe; ptr++;
195. *ptr=frame; ptr++;
196.
197. rtphdr.seq = htons(rtphdr.seq);
198. memcpy(packet_buf, &rtphdr, RTP_HDR_SZ);
199. memcpy(ptr, jpeg_data + frame*2048, data_len);
200.
201. if(sendto(sockfd,packet_buf,(ptr - packet_buf) + data_len,
202.0,(struct sockaddr *)&client,sin_size)<0)
203. {
204. perror(" sendto error");
205. }
206.
207. frame++;
208. bytes_left -= 2048;
209. rtphdr.seq = ntohs(rtphdr.seq);
210. rtphdr.seq++;
211. }
212.
213. sleep(0.0001);
214. }
215. free(packet_buf);
216. free(jpeg_data);
217. pthread_exit(NULL);
218.}
219.
220.
221.int main()
222.{
223. clock_t oldtick,newtick;
224. float time1 ;
225. static int vf=0;
226. int i;
227. clock_t totalold,totalnew;
228. int video_fd;
229. struct video_capability grab_cap;
230.
231. int width = 320;
232. int height = 240;
233.
234.
235. struct video_picture grab_pic;
236. struct video_mmap grab_map;
237. struct video_mbuf grab_buf;
238.
239.
240. int sockfd;
241. int sin_size;
242. struct sockaddr_in client;
243. struct sockaddr_in server;
244. char msg[100];
245. struct ARG *arg;
246. struct FDG *fdg;
247. pthread_t p_tid;
248. pthread_t c_tid;
249. head=0;
250. tail=0;
251. for(i=0; i 252. { 253. bzero(buf[i],DATA); 254. 255. } 256. sem_init(&writen,0,BUFSIZE); 257. sem_init(&readn,0,0); 258. 259.//数据采集……………………………………………… 260.loop: 261. totalold = clock(); 262. video_fd = open("/dev/video0", O_RDWR); 263. if (video_fd == -1) 264. { 265.//\u6253\u5f00\u6444\u50cf\u5934 266. fprintf(stderr, "can not open video0"); 267. exit (1); 268. } 269. oldtick = clock(); 270. if ((ioctl(video_fd, VIDIOCGCAP, &grab_cap)) < 0) 271. { 272. fprintf(stderr, "ioctl VIDEOCGCAP failed."); 273. exit (1); 274. } 275. newtick = clock(); 276. time1 = (double)(newtick - oldtick)/ CLOCKS_PER_SEC; 277. printf("\n%f second is take to ioctl VIDEOCGCAP \n",time1); 278. 279.printf("The VideoCap Name: %s\n", grab_cap.name); 280.printf("The hannels: %d\n", grab_cap.channels); 281.printf("The Audios: %d\n", grab_cap.audios); 282.printf("The maxwidth: %d, maxheight: %d, minwidth %d, minheight: %d\n", 283.grab_cap.maxwidth, grab_cap.maxheight, 284.grab_cap.minwidth, grab_cap.minheight); 285. 286. oldtick = clock(); 287. 288.if ((ioctl(video_fd, VIDIOCGPICT, &grab_pic)) < 0) 289.{ 290. fprintf(stderr, "ioctl VIDIOCGPICT failed."); 291. exit (1); 292.} 293. newtick = clock(); 294. time1 = (double)(newtick - oldtick)/ CLOCKS_PER_SEC; 295. printf("\n%f second is take to ioctl VIDIOCGPICT \n",time1); 296. 297.printf("The brightness: %d\nThe hue: %d\nThe colour: %d\n 298.The contrast: %d\nThe whiteness: %d\nThe depth: %d\nThe palette: %d\n", 299.grab_pic.brightness, grab_pic.hue, grab_pic.colour, grab_pic.contrast, 300.grab_pic.whiteness, grab_pic.depth, grab_pic.palette); 301. 302. oldtick = clock(); 303. 304.if ((ioctl(video_fd, VIDIOCGMBUF, &grab_buf)) < 0) 305.{ 306. fprintf(stderr, "ioctl VIDIOCGMBUF, failed."); 307. exit (1); 308.} 309. newtick = clock(); 310. time1 = (double)(newtick - oldtick)/ CLOCKS_PER_SEC; 311. printf("\n%f second is take to ioctl VIDIOCGMBUF \n",time1); 312. 313.printf("The mapping size: %d\nThe mapping frames: %d\nThe mapping offset %d\n", 314.grab_buf.size, grab_buf.frames, grab_buf.offsets); 315.printf("The mapping size: %d nihao\n",grab_buf.size); 316.grab_map.width = width; 317.grab_map.height = height; 318.grab_map.format = VIDEO_PALETTE_JPEG; 319.grab_map.frame = 0; 320.if(vf==0) 321.{ 322. vf=vf+1; 323. close(video_fd);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 视频 采集 服务器