用C语言多线程代码实现无数个摄像头随时抓拍上传服务器网页端查看和视频的程序
时间: 2024-02-05 20:11:18 浏览: 123
以下是用C语言多线程实现无数个摄像头随时抓拍上传服务器的示例程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <time.h>
#define MAX_CAMERAS 100
#define IMAGE_WIDTH 640
#define IMAGE_HEIGHT 480
// 用于存储每个摄像头的状态
typedef struct {
int id; // 摄像头ID
int is_running; // 摄像头是否正在运行
char image_file[256]; // 最新抓拍的图像文件名
pthread_t thread_id; // 摄像头线程ID
} camera_t;
// 摄像头线程函数,不断抓取图像并上传服务器
void* camera_thread(void* arg) {
camera_t* camera = (camera_t*)arg;
char image_file[256];
while (1) {
// 生成随机图像文件名
time_t t = time(NULL);
struct tm* tm_info = localtime(&t);
strftime(image_file, sizeof(image_file), "camera%d_%Y%m%d%H%M%S.jpg", tm_info, camera->id);
// 模拟抓取图像
printf("Camera %d: capturing image %s\n", camera->id, image_file);
usleep(1000000); // 暂停1秒
// 上传图像到服务器
printf("Camera %d: uploading image %s to server\n", camera->id, image_file);
usleep(500000); // 暂停0.5秒
// 更新摄像头状态
strcpy(camera->image_file, image_file);
}
return NULL;
}
int main() {
int num_cameras;
camera_t cameras[MAX_CAMERAS];
// 读取摄像头数量
printf("Enter number of cameras: ");
scanf("%d", &num_cameras);
if (num_cameras > MAX_CAMERAS) {
printf("Error: too many cameras\n");
return 1;
}
// 启动每个摄像头线程
for (int i = 0; i < num_cameras; i++) {
cameras[i].id = i + 1;
cameras[i].is_running = 1;
strcpy(cameras[i].image_file, "");
int ret = pthread_create(&cameras[i].thread_id, NULL, camera_thread, &cameras[i]);
if (ret != 0) {
printf("Error: failed to create camera thread %d\n", i + 1);
return 1;
}
}
// 主线程循环,等待用户输入查看某个摄像头最新图像
while (1) {
int camera_id;
printf("\nEnter camera ID to view latest image (0 to exit): ");
scanf("%d", &camera_id);
if (camera_id == 0) {
break;
}
// 查找指定摄像头的最新图像
char latest_image[256];
for (int i = 0; i < num_cameras; i++) {
if (cameras[i].id == camera_id) {
strcpy(latest_image, cameras[i].image_file);
break;
}
}
// 如果找到了最新图像,打印图像文件名
if (strlen(latest_image) > 0) {
printf("Latest image from camera %d: %s\n", camera_id, latest_image);
} else {
printf("Error: camera %d not found or no images captured yet\n", camera_id);
}
}
// 停止每个摄像头线程
for (int i = 0; i < num_cameras; i++) {
cameras[i].is_running = 0;
pthread_join(cameras[i].thread_id, NULL);
}
return 0;
}
```
该程序使用了一个 camera_t 结构体来存储每个摄像头的状态,包括摄像头ID、是否正在运行、最新抓拍的图像文件名和摄像头线程ID。摄像头线程函数不断抓取图像并上传服务器,然后更新摄像头状态。主线程循环等待用户输入查看某个摄像头的最新图像,然后查找指定摄像头的最新图像并打印图像文件名。程序还能够停止每个摄像头线程并等待线程退出。
阅读全文