# avi_read **Repository Path**: a5k3rn3l/avi_read ## Basic Information - **Project Name**: avi_read - **Description**: 读取 AVI 文件里面的流,然后把每个流的包给你读出来,但是并不帮你解码里面的包,你要自己解码。为嵌入式开发而设计,不调用任何内存分配释放函数,你需要提供文件操作相关的回调函数(这边建议你的嵌入式系统使用 fatfs 来读取文件)。 - **Primary Language**: Unknown - **License**: LGPL-2.1 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-04 - **Last Updated**: 2026-01-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AVI 视频文件解析(无解码) [Chinglish](Readme.md) | 简体中文 读取 AVI 文件,列举里面的流,然后你根据你的需要来读取里面的流,我给你拆成一个个的包,你自己解码。 ## 添加源码到你的工程里 就下面这几个文件复制到你的项目里: * `avi_read/avi_guts.h` * `avi_read/avi_reader.c` * `avi_read/avi_reader.h` 记得保留原作者署名。原作者:0xAA55。这样的好处就是,我的代码垃圾不代表你的代码垃圾,别人读你的代码的时候不会只骂你。 添加到项目后,确保 `avi_reader.c` 能参与编译,并且其它两个头文件能被你的源码文件包含。 建议在你的嵌入式项目里使用 [Phat](https://gitee.com/a5k3rn3l/phat.git) 库,它比 `FatFs` 接口设计更明确。除此以外,如果你的文件系统库支持超过 4GB 的文件,在工程的宏定义里增加:`AVI_ENABLE_4GB_FILES 1` 我的项目文件夹里有 `.sln` 文件和 `.vcxproj` 文件。这些文件与你无关,因为我使用 Visual Studio 2026 进行开发和调试。你如果也安装了 Visual Studio 2026,你也可以用它来调试,然后给我发 PR。 ## 用法 直接看 `avi_reader.h` 头文件里面有接口定义,懂 C 的人肯定都能看懂这些接口定义。 以下的回调函数你必须实现:(如果是嵌入式环境,你有 `Phat`,那就比较好实现了) ```c fssize_t (*f_read)(void *buffer, size_t len, void* userdata); fssize_t (*f_seek)(fsize_t offset, void* userdata); fssize_t (*f_tell)(void* userdata); ``` 除此以外还有一个函数指针被用于初始化 `avi_stream_reader` 但是你可以不用实现它,而是填 `NULL` 作为参数: ```c void (*logprintf)(void* userdata, const char* fmt); ``` 你填 `NULL` 的话,我的库默认的实现就是调用 `vprintf()` 来打印调试信息。 ## 参考实例项目 比如一个嵌入式环境用的是 STM32H7 单片机(这玩意儿都不算单片机了吧,能外接内存,还有内存管理器外设可以设定内存权限,外设也多得一匹,CPU 也有指令缓存和数据缓存) 它有: - JPEG 硬编解码器 - DAC 数模转换器(拿来播音频)或者 IIS 音频协议(外接 IIS 音频播放器拿来播音频) - SDIO 接口,焊接到 SD/TF 卡的插槽上面的管脚上去。 - 提示:如果你说“哎!我的设备用 SD 卡的”,那你得出钱买 SD 卡的专利。但是你如果说“哎!我的设备是插 TF 卡的。”那你就能省下一笔钱诶! - 显示屏。STM32H750 它有直接驱动液晶屏的外设,但是低分辨率情况下你就只用个 SPI 去驱动一下 ILI9341 可以省下很多管脚。 用了我的库,你就能: 1. 从 AVI 文件里的 `MJPEG` 视频流里提取出一帧帧的 JPEG 图像。用你的 JPEG 硬解码器去解码,然后输出到你的显示屏上。 2. 从 AVI 文件里的 `PCM` 音频流里提取出 `PCM` 音频,用 DAC 方案或者 IIS 方案去播放,具体随你。 你要是单片机的 CPU 足够屌,频率贼高,那你可以直接用 `libjpeg` 去解码 JPEG 帧。反正使用 JPEG 硬解码外设也就是帮你节省了大约 95% 的 CPU 使用率罢。 如果你的 AVI 文件里面的视频流不是 `MJPEG`,而是完全没有压缩的裸的 BMP 流,那就用不着什么 JPEG 解码器了,直接把 BMP 图像怼显示屏上。但是这样的话,你的 SDIO 读文件的带宽就非常吃紧。 如果你的 AVI 文件使用的是 `DivX`,`Xvid`,`H264` 这些格式的视频流: * 在当前假设的嵌入式系统环境下,你没有对应的硬解码器,你只能放弃播放。 * 或者你有更屌的嵌入式系统,有贼高的 CPU 频率,那就干脆软解码来实现播放。但是集成这些软解码器到你的单片机上是有点麻烦的。 * 或者干脆再拉高你的设备的条件水平,上 `buildroot`,配置 `FFmpeg`,使用 `FFmpeg` 已经集成好了的软解码器。 注意如果你真要做个播放器,你得做好按指定的帧率(根据我的库从 AVI 文件里读出的帧数)来播放。JPEG 硬解码的实现、DAC 输出信号的放大、使用 `fatfs` 通过 SDIO 来列举、读取 AVI 文件这些是你要去做的工作,我只负责帮你解析 AVI 文件。