视频录像循环存储

2023-10-09 20:10
文章标签 存储 循环 视频录像

本文主要是介绍视频录像循环存储,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前写过V4L2获取摄像头数据,就想着基于这个来写一个小程序。想起家里的摄像头可以循环存储视频到本地,就顺手写了一个类似的功能。
首先将V4L2的整个过程封装成三个函数,初始化函数、获取数据帧函数、结束获取函数,如下图所示:在这里插入图片描述
接下来需要思考的一个问题是如何循环的新建和删除文件,这里我用的方式是循环队列的方式,如下图所示:
在这里插入图片描述
栈的最大空间为MaxSize,我们牺牲一个空间,使得方便判断栈空和栈满。此时队头和队尾相同的话,则栈空,若是队头加一等于队尾的话,那就是队列满。(队尾指向队列最后一个,队头指向队首的下一个位置)这就是循环队列。

文件名我是直接用时间戳来命名,视频存储格式为yuv格式,代码如下。

void Get_FileName(char *str)
{int ii;time_t t;t = time(NULL);ii = time(&t);sprintf(str,"%d",ii);strcat(str,".yuv");//printf("file_name:%s\n",str);
}

最后就是存储一帧视频的逻辑代码,如下

void Save_Video(char *one_frame,__u32 frame_length, struct V4L2_Grab* my_video)
{if(my_video->file_info.Index == 0){//创建之前先检查文件是否到达设定的最大值if(my_video->file_info.All_Num >= 3)//如果文件数量大于3,删除最老的文件{printf("文件数量大于3!\n");if(remove(queue_pop(&my_video->file_info.que)) == 0){printf("remove ok~\n");my_video->file_info.All_Num--;}}memset(temp,'0',10);Get_FileName(temp);//获取文件名称存入tempqueue_push(&my_video->file_info.que,temp);my_video->file_info.fp = fopen(temp,"a+");my_video->file_info.All_Num++;fwrite(one_frame,1,frame_length,my_video->file_info.fp);my_video->file_info.Index++;}else{fwrite(one_frame,1,frame_length,my_video->file_info.fp);my_video->file_info.Index++;}if(my_video->file_info.Index > my_video->file_info.Frame_Max){fclose(my_video->file_info.fp);my_video->file_info.Index = 0;printf("All_Num:%d\n",my_video->file_info.All_Num);}
}

但是写完感觉自己设置的结构体太啰嗦了。。

这篇关于视频录像循环存储的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/175266

相关文章

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

Nginx部署React项目时重定向循环问题的解决方案

《Nginx部署React项目时重定向循环问题的解决方案》Nginx在处理React项目请求时出现重定向循环,通常是由于`try_files`配置错误或`root`路径配置不当导致的,本文给大家详细介... 目录问题原因1. try_files 配置错误2. root 路径错误解决方法1. 检查 try_f

Spring三级缓存解决循环依赖的解析过程

《Spring三级缓存解决循环依赖的解析过程》:本文主要介绍Spring三级缓存解决循环依赖的解析过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、循环依赖场景二、三级缓存定义三、解决流程(以ServiceA和ServiceB为例)四、关键机制详解五、设计约

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处