VScode+esp-idf:例程(esp32-web-camera)保存视频到sd卡(附源码)

2023-05-16

文章目录

  • 1.移植到《esp32-web-camera》
  • 2. jpeg2avi使用方法
    • 2.1 何处调用jpeg2avi_start
    • 2.2 何处调用jpeg2avi_add_frame
    • 2.3何处调用jpeg2avi_end
  • 3.编译运行工程
  • 4.源代码

昨天测试了保存图片到sd卡,我就想,视频就是一帧帧图片构成的,现在离保存视频只差一步之遥。网络上使用ESP32保存视频,最多是python+openCV的方法。我想使用esp-idf原生态应该也可以做到。
于是百度到下面的文章:
1.作者:原野追逐,《 JPEG流封装AVI视频》。这篇文章将原理结合代码,讲得非常详细。 这个没有语音数据的
立马把源代码拷贝过来,几乎不用修改,直接就可以使用。非常感谢作者原野追逐的贡献。
在这里插入图片描述
在这里插入图片描述

1.移植到《esp32-web-camera》

在上一篇文章《VScode+esp-idf:安信可esp32-cam开发板测试sd卡》的工程里增加文件 “Jpeg2AVI.c” “list.c”,其他不变:

set(COMPONENT_SRCS "app_main.c" "app_wifi.c" "app_camera.c" "app_httpd.c" 
                   "app_mdns.c" "app_sd.c" "Jpeg2AVI.c" "list.c")

2. jpeg2avi使用方法

准备开始
重复写入
准备结束
fopen
jpeg2avi_start
jpeg2avi_add_frame
jpeg2avi_end
fclose

2.1 何处调用jpeg2avi_start

在我们这个工程中,在SdCard_init函数最后面调用jpeg2avi_start(这里的avi文件名应该有实时时间戳):

void SdCard_init(void)
{
......
    sdmmc_card_print_info(stdout, card);

    fp_avi = fopen("/sdcard/sample.avi","wb");
    if(fp_avi == NULL){
        ESP_LOGE(TAG, "Failed to open file for writing");
        return;
    }    
    jpeg2avi_start(fp_avi);
}

2.2 何处调用jpeg2avi_add_frame

这个 StartStream 按键会启动实时视频读取和传输到网页,在这里面把读取的图片写入avi文件,保存到sd卡。
在这里插入图片描述
StartStream 按键触发的函数是 stream_handler
在这里插入图片描述

2.3何处调用jpeg2avi_end

这里对函数进行简单的介绍:

void jpeg2avi_end(FILE *fp, int width, int height, int fps);

照片的宽度和高度就是像素,最高像素是由摄像头的物理参数决定的,小于最高像素就可以由软件设定。网页中也可以修改:
在这里插入图片描述
出于各种原因,我选了800(宽) x 600(高)的像素。这里说一下如何在初始化时设置像素:
在这里插入图片描述
宏定义 FRAMESIZE_SVGA(800x600)在 《$ENV{IDF_PATH}/examples/esp32-web-camera-master/components/esp32-camera/driver/include/sensor.h》中:

typedef enum {
    FRAMESIZE_96X96,    // 96x96
    FRAMESIZE_QQVGA,    // 160x120
    FRAMESIZE_QCIF,     // 176x144
    FRAMESIZE_HQVGA,    // 240x176
    FRAMESIZE_240X240,  // 240x240
    FRAMESIZE_QVGA,     // 320x240
    FRAMESIZE_CIF,      // 400x296
    FRAMESIZE_HVGA,     // 480x320
    FRAMESIZE_VGA,      // 640x480
    FRAMESIZE_SVGA,     // 800x600
    FRAMESIZE_XGA,      // 1024x768
    FRAMESIZE_HD,       // 1280x720
    FRAMESIZE_SXGA,     // 1280x1024
    FRAMESIZE_UXGA,     // 1600x1200
    // 3MP Sensors
    FRAMESIZE_FHD,      // 1920x1080
    FRAMESIZE_P_HD,     //  720x1280
    FRAMESIZE_P_3MP,    //  864x1536
    FRAMESIZE_QXGA,     // 2048x1536
    // 5MP Sensors
    FRAMESIZE_QHD,      // 2560x1440
    FRAMESIZE_WQXGA,    // 2560x1600
    FRAMESIZE_P_FHD,    // 1080x1920
    FRAMESIZE_QSXGA,    // 2560x1920
    FRAMESIZE_INVALID
} framesize_t;

调用 jpeg2avi_end函数,首先要停止写入,就是先停止实时视频。我借用调整LED亮度的命令调用这个函数。
在这里插入图片描述
有这个命令的前提是配置LED闪光灯使能:
在这里插入图片描述
在函数 cmd_handle中调用:
在这里插入图片描述

3.编译运行工程

编译,写入,运行:
1.第一次点击StartStream 按键开始录制;
2.第二次点击StartStream 按键停止录制;
3.点击 LED Intensity完成收尾工作。

I (706575) camera_httpd: MJPG: 21235B 76ms (13.2fps), AVG: 69ms (14.5fps), 0+0+0+0=0 0
I (706655) camera_httpd: MJPG: 23257B 79ms (12.7fps), AVG: 69ms (14.5fps), 0+0+0+0=0 0
I (706715) camera_httpd: MJPG: 20800B 63ms (15.9fps), AVG: 69ms (14.5fps), 0+0+0+0=0 0
I (706785) camera_httpd: MJPG: 23200B 68ms (14.7fps), AVG: 69ms (14.5fps), 0+0+0+0=0 0
I (706855) camera_httpd: MJPG: 23911B 74ms (13.5fps), AVG: 69ms (14.5fps), 0+0+0+0=0 0
I (706925) camera_httpd: MJPG: 23817B 71ms (14.1fps), AVG: 70ms (14.3fps), 0+0+0+0=0 0
I (706995) camera_httpd: MJPG: 23163B 66ms (15.2fps), AVG: 70ms (14.3fps), 0+0+0+0=0 0
I (707075) camera_httpd: MJPG: 22794B 74ms (13.5fps), AVG: 70ms (14.3fps), 0+0+0+0=0 0
I (707145) camera_httpd: MJPG: 23467B 72ms (13.9fps), AVG: 70ms (14.3fps), 0+0+0+0=0 0
W (707215) httpd_txrx: httpd_sock_err: error in send : 104
I (707215) camera_httpd: Set LED intensity to 0
W (707215) httpd_uri: httpd_uri: uri handler execution failed
I (709555) camera_httpd: led_intensity = 64
I (709585) camera_httpd: close AVI file

从打印出来的信息,写入的视频流,1秒才13-15帧,视频不是很流畅;可见要同时完成读取摄像头数据、传输到网页、写入sd卡这3个功能,对esp32来说很吃力。

4.源代码

本文为了测试保存avi视频,几乎没有什么逻辑可言,纯粹为了测试功能而实现。读者可以在这个的基础上去完善。
比如我就想做一个延时拍摄的摄像机,可以设置1秒-60秒拍一张,然后以1秒24帧的速度播放,这个esp32就能轻松胜任。用按键启动和停止拍摄。
https://gitee.com/huangweide001/esp32_test/tree/master/camera_web_server_avi

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VScode+esp-idf:例程(esp32-web-camera)保存视频到sd卡(附源码) 的相关文章

随机推荐

  • 游戏升级之路

    七十一雾央原创 转载请注明 http blog csdn net hust xy 楼主学习编程有两年了 xff0c 决定向游戏发展大概就是半年前了 xff0c 在这里总结一下游戏方面的学习经历过 xff0c 给初学的朋友们参考下 xff0c
  • Nmap安装和使用详解

    文章目录 Nmap概述功能概述运行方式 Nmap安装Nmap参数详解目标说明主机发现端口扫描端口说明和扫描顺序服务与版本探测脚本扫描操作系统探测时间和性能防火墙 IDS规避和欺骗输出选项使用示例 常用扫描命令扫描ip地址或域名扫描整个网段扫
  • MSCKF_VIO:MSCKF的双目版本

    论文 xff1a MSCKF的双目版本 Robust Stereo Visual Inertial Odometry for Fast Autonomous Flight 下载地址 xff1a 点击 源码地址 xff1a https git
  • 功能测试,系统测试,兼容性测试,手工测试

    功能测试 功能测试一般需要根据编写的 测试用例 xff0c 执行测试用例 xff0c 执行的过程中提交缺陷 xff1b 功能测试一般至少会有两轮 xff0c 遇到比较麻烦的项目甚至会有三到四轮 xff0c 而每一轮测试都有其侧重点 xff0
  • C++ sdk 获取执行文件所在路径

    TCHAR szFilePath MAX PATH 43 1 61 0 GetModuleFileName NULL szFilePath MAX PATH tcsrchr szFilePath T 39 39 1 61 0 szFileP
  • UART串口

    一 串口的历史 首先 xff0c 串口对每一个做硬件和嵌入式软件的人来说 xff0c 就是一个必备的工具 xff0c 调试一个带MCU或者CPU的系统 我们在调试的过程中 xff0c 一般第一件事情 xff1a GPIO点灯 xff0c 第
  • C++软件工程师的发展前景如何?

    目前国内的嵌入式开发非常火 xff0c 而C 43 43 主要用于底层的嵌入式开发 驱动开发等 xff0c 也用于WINCE等嵌入式系统的应用软件开发 可以说C 43 43 软件工程师发展前景还是不错的 xff0c 下面就给大家具体介绍一下
  • 成为一名C++开发工程师,需要具备哪些条件?

    C 43 43 是C语言的继承 xff0c 它既可以进行C语言的过程化程序设计 xff0c 又可以进行以抽象数据类型为特点的基于对象的程序设计 xff0c 还可以进行以继承和多态为特点的面向对象的程序设计 C 43 43 擅长面向对象程序设
  • 一年精通,三年熟悉,五年了解,十年用过!C++真的这么难吗?

    C 43 43 有句俗话说 xff1a 一年精通 三年熟悉 五年了解 十年用过 如果可以把C 43 43 程序员分层的话 xff0c 看看你在第几层 xff1f 第0层 掌握基本的C 43 43 语法 xff0c 会写一些基本的if els
  • 【C语言实现贝塞尔曲线】无聊人士专用程序,PS钢笔工具最初原形~

    简介 动态演示贝塞尔曲线的绘制过程 支持任意点数 任意阶次 点击鼠标右键 xff0c 在鼠标位置将创建新的点 按住鼠标左键拖动控制点 空格键屏幕将清空 一起来玩一玩吧 xff01 运行效果 源码 程序名称 xff1a 贝塞尔曲线 inclu
  • c++ stream iword、pword和register_callback函数

    pword xff0c stream 的 register callback函数 include lt iostream gt include lt sstream gt using namespace std const int name
  • AWS CLI version 2 在 Windows 下的安装

    首先你需要到下面的链接地址中下载需要的应用 xff1a https awscli amazonaws com AWSCLIV2 msi 双击运行 双击运行下载的可以运行的文件 下一步继续 下一步继续安装进程 许可协议 你需要同意许可协议后继
  • MATLAB安装时为英文如何切换中文

    MATLAB安装时为英文如何切换中文 MATLAB安装问题 问题描述 2018b及以上版本的MATLAB安装时 xff0c 其中英文模式会根据电脑所在区域环境进行配置 若电脑所在区域环境不在中国 xff0c 则MATLAB初始化安装会被定义
  • VINS-Fusion-RGBD在双轮差数轮小车上配置并进行稠密建图

    VINS Fusion RGBD在小车上进行稠密建图 1 轮式里程计代替视觉里程计2 其他获得更为鲁棒性建图效果的做法3 点云地图及栅格地图的获得4 多个参数可配置 VINS Mono由于存在运动初始化过程 xff0c 对于地面小车来说运动
  • ST LINK V2.1接线图

    方便查询 xff0c 图片来源已经忘记了 xff0c 如有冒犯请通知我 特此记录以防忘记 anlog 2020年8月29日
  • ROS笔记之Gazebo机器人仿真(二)——Soildworks搭建机器人模型

    1 引言 机器人的模型是通过URDF文件进行描述 xff0c 具体说明可以参考URDF 但对于一些复杂的机器人 xff0c 通过直接编写URDF文件就比较繁琐 xff0c 这里我们介绍一种通过专业的三维建图软件Soildworks构建模型然
  • ROS笔记之Gazebo机器人仿真(四)——Rviz及Gazebo下机器人模型显示

    1 引言 上一章中我们成功导出了URDF文件 xff0c 这章中我们将学习如何在Rviz和Gazebo下显示我们创建的三维模型 2 预备 首先 xff0c 我们需要对导出的URDF文件进行下修改 xff08 1 xff09 package
  • 制作树莓派镜像img,并在其他新板上使用,实现批量克隆树莓派板

    1 将现有的系统制作成镜像img 2 配置网络 1 将现有的系统制作成镜像img 1 1 先将新买的sd卡用SDFormatter工具格式化 xff0c 以作备用 1 2 将带有系统的sd卡用Win32DiskImager exe工具Rea
  • Qt开发-Qt对象间的关系

    一 Qt对象间的关系 1 Qt对象间可以存在父子关系 xff08 1 xff09 每个对象都保存有它所有子对象的指针 xff08 2 xff09 每一个对象都有一个指向其父对象的指针 2 当指定Qt对象的父对象时 xff08 1 xff09
  • VScode+esp-idf:例程(esp32-web-camera)保存视频到sd卡(附源码)

    文章目录 1 移植到 esp32 web camera 2 jpeg2avi使用方法2 1 何处调用jpeg2avi start2 2 何处调用jpeg2avi add frame2 3何处调用jpeg2avi end 3 编译运行工程4