一个非常不错的学习嵌入式c语言的网络视频监控代码,可以通过它学习视频流传输,视频生成原理,以及视频监控的一些框架思想。
demo框架:
![图片[1]-嵌入式开发-网络视频监控学习代码-代码猫-优质代码分享学习平台](https://oss.daimamao.com/wp-content/uploads/2024/10/20241018172511357-1024x623.png)
包含的功能
网页端-实时截图,实时视频流查看,具体请看以下截图。
![图片[2]-嵌入式开发-网络视频监控学习代码-代码猫-优质代码分享学习平台](https://oss.daimamao.com/wp-content/uploads/2024/10/20241018172736138-1024x576.png)
代码结构:
![图片[3]-嵌入式开发-网络视频监控学习代码-代码猫-优质代码分享学习平台](https://oss.daimamao.com/wp-content/uploads/2024/10/20241018172815164-1024x576.png)
如何在 VMware 中的 Ubuntu 16 系统上调试成功
- 准备环境
- 安装必要的库和工具
打开终端并输入以下命令,安装开发所需的库:
sudo apt update sudo apt install build-essential v4l-utils libv4l-dev
- 检查摄像头是否工作
在终端中使用以下命令,确认摄像头工作正常:
v4l2-ctl --list-devices v4l2-ctl --all
如果检测到了设备 /dev/video0,说明摄像头已连接成功。
- 编译代码
在代码所在目录中创建一个 Makefile,内容如下:
all: main main: main.o camera.o @gcc -o main main.o camera.o main.o: main.c camera.h @gcc -c main.c camera.o: camera.c camera.h @gcc -c camera.c clean: @rm -f *.o main
然后运行以下命令编译代码:
make
- 运行程序
使用以下命令运行程序:
sudo ./main
注意:需要使用 sudo 权限来访问 /dev/video0。
以下是实时截图的代码解释:
使用V4L2接口捕获摄像头数据并将其保存为YUV格式文件。主要步骤包括:
- 打开并初始化摄像头。
- 映射内存缓冲区。
- 启动摄像头视频流。
- 等待设备变为可读并捕获一帧数据。
这是一个非常经典的Linux下的V4L2摄像头捕获Demo,适合你作为C语言学习和Linux系统编程的入门项目。你可以尝试修改它来捕获更多帧,或处理其他格式的视频数据。
在Linux系统中使用V4L2(Video4Linux2)接口实现一个简单的摄像头捕获Demo程序。以下是对camera.h、camera.c和main.c的代码逐部分解读,包括函数的作用和代码逻辑。
camera.h 解析
#define IMG_WIDTH 640
#define IMG_HEIGHT 480
- 设置捕获图像的宽度和高度。
struct camera_t { void *start; int length; };
- 定义一个结构体,用于描述缓冲区的起始地址和长度。
extern int init_camera(const char *dev_path); extern int init_mmap(int fd); extern int start_camera(int fd); extern int read_camera(int fd);
- 声明4个主要函数:
- init_camera:初始化摄像头设备。
- init_mmap:初始化内存映射(mmap)。
- start_camera:启动视频流。
- read_camera:读取摄像头帧数据。
camera.c 解析
1. init_camera 函数
int init_camera(const char *dev_path)
- 作用:打开摄像头设备并检查其是否具备视频捕获能力。
- 详细步骤:
2. init_mmap 函数
int init_mmap(int fd)
- 作用:初始化内存映射,将摄像头的缓冲区从内核空间映射到用户空间。
- 详细步骤:
3. start_camera 函数
int start_camera(int fd)
- 作用:启动视频流。
- 使用ioctl调用VIDIOC_STREAMON开启摄像头流。
4. read_camera 函数
int read_camera(int fd)
- 作用:从摄像头读取一帧数据并保存为YUV格式的文件。
- 详细步骤:
main.c 解析
- 初始化摄像头设备
int cam_fd = init_camera(“/dev/video0”);
- 打开并初始化摄像头设备,如果失败,则退出程序。
- 初始化内存映射
if(-1 == init_mmap(cam_fd)){ perror(“init_mmap() failure!”); return -1; }
- 初始化缓冲区的内存映射。
- 启动摄像头视频流
start_camera(cam_fd);
- 开启摄像头视频流。
- 设置超时和等待捕获数据
struct timeval tv; tv.tv_sec = 20; tv.tv_usec = 0; fd_set fds; FD_ZERO(&fds); FD_SET(cam_fd, &fds);
- 设置等待超时时间为20秒,并初始化fd_set。
- 调用select等待摄像头数据
int r = select(cam_fd + 1, &fds, NULL, NULL, &tv); if (0 == r) { printf(“no frame for read!\n”); return 0; }
- 使用select等待摄像头设备变为可读状态。如果超时未捕获到数据,则打印信息并退出。
- 读取并保存帧数据
if (FD_ISSET(cam_fd, &fds)) { if (-1 == read_camera(cam_fd)) { printf(“read_camera() failure!\n”); return -1; } }
- 如果设备可读,则调用read_camera读取一帧数据并保存为picture.yuv。
程序工作流程总结
- 打开并初始化摄像头设备(/dev/video0)。
- 初始化内存映射,将内核缓冲区映射到用户空间。
- 启动摄像头视频流。
- 使用select等待摄像头设备的输入,超时时间为20秒。
- 如果有数据可读,则读取一帧数据并保存为picture.yuv文件。
涉及的重要系统调用和函数
VIDIOC_* 系列 ioctl 调用:用于控制摄像头设备。
open:用于打开设备文件。
ioctl:与设备驱动程序交互,用于查询和设置设备属性。
mmap:将设备缓冲区映射到用户空间。
select:等待文件描述符变为可读或写入状态。
暂无评论内容