# Lf_ai **Repository Path**: liu2580liu/lf_ai ## Basic Information - **Project Name**: Lf_ai - **Description**: 海思ai枪机 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-06 - **Last Updated**: 2026-08-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LfPro_sytj - 视频流处理项目 ## 项目概述 LfPro_sytj 是一个基于 **Hi3516CV610** 平台的高性能视频流处理项目,支持 H.264/JPEG 编码、多协议实时视频传输(RTSP/RTMP/UDP)以及视频录制功能。项目采用模块化设计,具有良好的可扩展性和线程安全性。 --- ## 目录结构 ``` LfPro_sytj/ ├── app/ # 应用程序代码 │ ├── include/ # 头文件目录 │ │ ├── core/ # 核心模块 │ │ │ ├── app_context.h # 应用上下文管理 │ │ │ ├── error_code.h # 统一错误码定义 │ │ │ ├── error_logger.h # 错误日志记录 │ │ │ ├── thread_safe.h # 线程安全工具 │ │ │ ├── common_utils.h # 公共工具函数 │ │ │ └── test_framework.h # 测试框架 │ │ ├── video/ # 视频处理模块 │ │ │ ├── channel_manager.h # 通道管理 │ │ │ ├── stream_manager.h # 流管理 │ │ │ ├── mpp_main.h # MPP主接口 │ │ │ ├── packet_queue.h # 数据包队列 │ │ │ ├── mp4_io.h # MP4文件操作 │ │ │ ├── h264_to_mp4.h # H264转MP4 │ │ │ └── realtime_mp4.h # 实时MP4录制 │ │ ├── network/ # 网络模块 │ │ │ ├── rtsp_sender.h # RTSP发送 │ │ │ ├── rtsp_stream.h # RTSP流处理 │ │ │ ├── rtsp_cmd.h # RTSP命令处理 │ │ │ ├── rtmp_sender.h # RTMP发送 │ │ │ ├── udp_sender.h # UDP发送 │ │ │ └── udp_sender_local.h # 本地UDP发送 │ │ ├── client/ # 客户端模块 │ │ │ ├── image_client.h # 客户端接口 │ │ │ └── client_utils.h # 客户端工具 │ │ ├── storage/ # 存储模块 │ │ │ ├── config_manager.h # 配置管理 │ │ │ └── log_system.h # 日志系统 │ │ ├── platform/ # 平台适配模块 │ │ │ ├── platform_adapter.h # 平台适配接口 │ │ │ ├── hi_isp.h # ISP配置 │ │ │ └── camera_controller.h # 相机控制 │ │ └── communal.h # 公共定义 │ └── src/ # 源文件目录 │ ├── core/ # 核心模块实现 │ ├── video/ # 视频处理实现 │ ├── network/ # 网络模块实现 │ ├── client/ # 客户端实现 │ ├── storage/ # 存储模块实现 │ ├── platform/ # 平台适配实现 │ ├── app_start.c # 应用入口 │ ├── communal.c # 公共实现 │ ├── communal_config.c # 公共配置 │ └── config.c # 配置管理实现 ├── thirdparty/ # 第三方依赖 │ └── rtmp/ # RTMP库 (librtmp) ├── Makefile # 构建脚本 └── README.md # 项目说明 ``` --- ## 核心功能 ### 视频编码 - **H.264 视频编码**:基于海思 MPP(Media Process Platform) - **JPEG 图像编码**:支持高质量图像压缩 - **多分辨率支持**:1080p/720p/D1/CIF 等 - **帧率配置**:5-30fps 可调 - **码率控制**:CBR/VBR 模式 ### 实时传输 | 协议 | 特点 | 适用场景 | |------|------|----------| | **RTSP** | 低延迟、实时性好 | 安防监控、实时预览 | | **RTMP** | 稳定可靠、支持CDN | 直播推流 | | **UDP** | 超低延迟、轻量级 | 局域网实时传输 | ### 视频录制 - **MP4 文件格式**:标准 MP4 封装,兼容性好 - **实时 MP4**:边录边写,支持长时间录制 - **定时录制**:支持定时启停 - **循环覆盖**:存储空间不足时自动覆盖旧文件 ### 拍照功能 - **JPEG 格式输出**:高质量图像 - **单帧捕获**:随时抓拍 - **连拍模式**:支持连续抓拍 ### 多通道管理 - **通道0**:视频录制 + 实时视频流 - **通道1**:拍照/图像捕获 - **独立控制**:各通道可独立启停 --- ## 编译说明 ### 环境要求 - **编译器**:arm-linux-musleabi-gcc (版本 10.3.0+) - **SDK**:Hi3516CV610_SDK_V1.0.1.0 - **操作系统**:Linux (Ubuntu 18.04+/CentOS 7+) - **内存**:至少 512MB 可用内存 - **存储空间**:至少 1GB 可用空间 ### 编译命令 ```bash # 进入项目目录 cd LfPro_sytj # 清理旧构建 make clean # 编译项目 make ``` ### 编译选项 ```bash # 启用调试模式(包含详细日志) make DEBUG=1 # 启用详细编译输出 make VERBOSE=1 # 指定日志级别(编译时配置) make LOG_LEVEL=3 # 编译测试 make test ``` --- ## 使用方法 ### 启动应用 ```bash # 基本启动 ./main # 指定配置文件 ./main -c /etc/app/config.ini # 后台运行 nohup ./main > /var/log/app.log 2>&1 & ``` ### 命令行参数 | 参数 | 说明 | 默认值 | |------|------|--------| | `-c` | 配置文件路径 | ./config.ini | | `-l` | 日志级别 (0-5) | 3 | | `-o` | 输出目录 | ./output | | `-d` | 后台运行模式 | 否 | | `-h` | 显示帮助信息 | - | ### 日志级别说明 | 级别 | 值 | 说明 | |------|-----|------| | LOG_OFF | 0 | 关闭日志 | | LOG_FATAL | 1 | 致命错误 | | LOG_ERROR | 2 | 错误 | | LOG_WARN | 3 | 警告 | | LOG_INFO | 4 | 信息 | | LOG_DEBUG | 5 | 调试 | --- ## API 接口 ### 视频录制控制 ```c /** * @brief 启动视频录制 * @param file_path 输出文件路径 * @param duration 录制时长(秒),0 表示无限录制 * @return 错误码 */ int start_video_recording(const char* file_path, int duration); /** * @brief 停止视频录制 * @return 错误码 */ int stop_video_recording(void); /** * @brief 检查录制状态 * @return 1-正在录制,0-未录制 */ int is_recording(void); ``` ### 实时视频控制 ```c /** * @brief 启动实时视频流 * @param protocol 协议类型("rtsp", "rtmp", "udp") * @param server_ip 服务器IP * @param port 服务器端口 * @return 错误码 */ int start_realtime_video(const char* protocol, const char* server_ip, int port); /** * @brief 停止实时视频流 * @return 错误码 */ int stop_realtime_video(void); /** * @brief 检查实时流状态 * @return 1-正在传输,0-未传输 */ int is_streaming(void); ``` ### 拍照控制 ```c /** * @brief 启动连续拍照模式 * @param file_path 输出目录路径 * @param interval 拍照间隔(秒) * @return 错误码 */ int start_photo_capture(const char* file_path, int interval); /** * @brief 停止连续拍照 * @return 错误码 */ int stop_photo_capture(void); /** * @brief 单帧抓拍 * @param file_path 输出文件路径 * @return 错误码 */ int capture_single_photo(const char* file_path); ``` ### 双通道控制 ```c /** * @brief 同时启动录制和实时流 * @param video_path 录制文件路径 * @param protocol 传输协议 * @param server_ip 服务器IP * @param port 服务器端口 * @return 错误码 */ int start_both_channels(const char* video_path, const char* protocol, const char* server_ip, int port); /** * @brief 停止所有通道 * @return 错误码 */ int stop_both_channels(void); ``` ### 配置接口 ```c /** * @brief 加载配置文件 * @param file_path 配置文件路径 * @return 错误码 */ int config_load(const char* file_path); /** * @brief 保存配置到文件 * @param file_path 配置文件路径 * @return 错误码 */ int config_save(const char* file_path); /** * @brief 获取配置项 * @param section 配置段名 * @param key 配置键名 * @param value 输出值缓冲区 * @param value_len 缓冲区长度 * @return 错误码 */ int config_get(const char* section, const char* key, char* value, int value_len); /** * @brief 设置配置项 * @param section 配置段名 * @param key 配置键名 * @param value 配置值 * @return 错误码 */ int config_set(const char* section, const char* key, const char* value); ``` --- ## 配置文件 配置文件格式(config.ini): ```ini [video] resolution = 1080p ; 分辨率: 1080p, 720p, D1, CIF frame_rate = 25 ; 帧率: 5-30fps bit_rate = 2000000 ; 码率: 单位bps gop_size = 50 ; I帧间隔 profile = main ; 编码profile: baseline, main, high [recording] enable = 1 ; 启用录制: 0-关闭, 1-开启 output_dir = ./recordings ; 输出目录 max_duration = 3600 ; 最大录制时长(秒), 0表示无限 max_file_size = 524288000 ; 最大文件大小(字节), 0表示无限制 auto_overwrite = 1 ; 自动覆盖旧文件: 0-关闭, 1-开启 [stream] protocol = rtsp ; 默认协议: rtsp, rtmp, udp server_ip = 192.168.1.100 ; 服务器IP server_port = 554 ; 服务器端口 buffer_size = 102400 ; 发送缓冲区大小 [network] timeout = 30 ; 连接超时(秒) retry_count = 3 ; 重连次数 retry_interval = 5 ; 重连间隔(秒) [log] level = 3 ; 日志级别: 0-5 output = file ; 输出方式: console, file, both file_path = ./logs/app.log ; 日志文件路径 max_files = 5 ; 日志文件保留数量 max_file_size = 10485760 ; 单文件最大大小(字节) [device] channel = 0 ; 默认通道 sensor_type = 0 ; 传感器类型 isp_config = default ; ISP配置文件 ``` --- ## 错误码说明 错误码范围:**1700-1799** | 错误码 | 描述 | 处理建议 | |--------|------|----------| | 1700 | 成功 | - | | 1701 | 参数错误 | 检查输入参数是否正确 | | 1702 | 内存分配失败 | 检查系统内存是否充足 | | 1703 | 初始化失败 | 检查硬件状态和驱动 | | 1704 | 通道已占用 | 先停止当前通道再启动 | | 1705 | 通道未启动 | 先启动通道再操作 | | 1706 | 网络连接失败 | 检查网络连接和服务器状态 | | 1707 | 文件操作失败 | 检查文件路径和权限 | | 1708 | 编码错误 | 检查编码器配置 | | 1709 | 解码错误 | 检查输入数据格式 | | 1710 | 未知错误 | 查看日志获取详细信息 | --- ## 日志系统 项目采用统一的日志系统 `log_system`,具有以下特点: ### 日志宏定义 ```c LOG_FATAL(format, ...) // 致命错误,程序可能终止 LOG_ERROR(format, ...) // 错误,功能无法正常执行 LOG_WARN(format, ...) // 警告,需要关注但不影响执行 LOG_INFO(format, ...) // 信息,正常运行状态 LOG_DEBUG(format, ...) // 调试,详细信息用于排查问题 ``` ### 日志格式 ``` [时间戳] [级别] 文件名:行号(函数名): 日志内容 ``` 示例: ``` 2024-05-14 10:30:45.123 [INFO] stream_manager.c:156(start_video_recording): Video recording started 2024-05-14 10:30:45.456 [DEBUG] rtmp_sender.c:128(rtmp_connect): Connecting to rtmp://192.168.1.100/live ``` --- ## 线程安全说明 项目使用以下线程安全工具确保并发安全: | 工具 | 类型 | 用途 | |------|------|------| | `SafeMutex_t` | 互斥锁 | 保护共享资源访问 | | `SafeFlag_t` | 原子标志位 | 线程安全的状态标志 | | `AtomicCounter_t` | 原子计数器 | 线程安全的计数操作 | | `PacketQueue_t` | 线程安全队列 | 跨线程数据传递 | ### 线程模型 - **主线程**:应用控制和状态管理 - **编码线程**:视频编码处理 - **传输线程**:网络数据发送 - **录制线程**:文件写入操作 - **ISP线程**:图像信号处理 --- ## 测试支持 项目提供单元测试框架,测试用例位于 `app/src/core/test_core.c`。 ```bash # 运行所有测试 make test # 运行特定测试 make test TEST=test_stream_manager # 生成测试报告 make test_report ``` 测试覆盖范围: - 核心工具函数测试 - 配置管理测试 - 数据包队列测试 - 网络传输测试 --- ## 代码规范 ### 命名规范 - **函数名**:采用小写字母加下划线(`snake_case`),如 `start_video_recording` - **变量名**:采用小写字母加下划线,如 `stream_buffer` - **常量名**:全大写加下划线,如 `MAX_BUFFER_SIZE` - **宏定义**:全大写加下划线,如 `LOG_INFO` - **结构体名**:采用大写字母开头的驼峰命名(`PascalCase`),如 `VideoConfig` ### 代码风格 - 缩进:使用 4 个空格 - 大括号:统一换行 - 空格:运算符前后加空格 - 注释:函数前必须有 Doxygen 风格注释 --- ## 调试与故障排除 ### 常见问题 | 问题 | 可能原因 | 解决方法 | |------|----------|----------| | 编译失败 | 缺少依赖或环境变量未配置 | 检查交叉编译环境和 SDK 路径 | | 启动失败 | 权限不足或配置文件错误 | 检查文件权限和配置文件格式 | | 视频无输出 | 摄像头未连接或驱动问题 | 检查硬件连接和驱动状态 | | 网络传输失败 | 网络不通或服务器未启动 | 检查网络连接和服务器状态 | | 内存占用过高 | 内存泄漏或缓冲区过大 | 检查代码并调整缓冲区配置 | ### 调试技巧 ```bash # 启用调试模式编译 make DEBUG=1 # 设置日志级别为 DEBUG ./main -l 5 # 使用 GDB 调试 gdb ./main # 查看进程状态 ps aux | grep main # 查看内存使用 free -h ``` --- ## 版本历史 | 版本 | 日期 | 说明 | |------|------|------| | v1.0.0 | 2026-05-14 | 初始版本,支持视频录制、实时传输、拍照功能 | --- ## 许可证 本项目仅供内部使用。未经授权,不得复制或分发。 --- ## 联系信息 如有问题或建议,请联系开发团队。 --- **注意**:项目基于 Hi3516CV610 平台开发,需要相应的硬件环境才能运行。