rtsp_tensorrt/pipeline/input/video_reader.hpp
sladro e13cb3659c feat: 初始化项目结构
- 创建基本项目结构和目录
- 添加CMake构建系统
- 实现基础的配置解析功能
- 添加YOLO推理框架支持
- 集成RTSP和视频流处理功能
- 添加性能监控和日志系统
2024-12-24 16:25:03 +08:00

93 lines
2.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <string>
#include <memory>
#include <chrono>
#include <thread>
#include <atomic>
#include <opencv2/videoio.hpp>
#include "frame_queue.hpp"
namespace pipeline {
class VideoReader {
public:
struct Config {
int buffer_size; // 缓冲区大小
float target_fps; // 目标帧率0表示使用视频原始帧率
int frame_timeout_ms; // 读取帧超时时间(毫秒)
bool loop_playback; // 是否循环播放
bool async_reading; // 是否使用异步读取
Config()
: buffer_size(30)
, target_fps(0.0f)
, frame_timeout_ms(5000)
, loop_playback(false)
, async_reading(true) // 默认使用异步读取
{}
};
explicit VideoReader(const Config& config = Config{});
~VideoReader();
// 禁用拷贝
VideoReader(const VideoReader&) = delete;
VideoReader& operator=(const VideoReader&) = delete;
// 打开视频文件
bool open(const std::string& filepath);
// 关闭视频文件
void close();
// 读取一帧(带超时和帧率控制)
bool read(cv::Mat& frame);
// 获取视频信息
bool isOpened() const { return is_opened_; }
std::string getFilePath() const { return filepath_; }
float getCurrentFps() const { return current_fps_; }
double getOriginalFps() const { return original_fps_; }
int getTotalFrames() const { return total_frames_; }
int getCurrentFrame() const { return current_frame_; }
// 视频控制
bool seek(int frame_number);
void restart();
// 帧队列状态
bool hasFrames() const;
size_t getQueueSize() const;
size_t getQueueCapacity() const;
private:
cv::VideoCapture cap_; // OpenCV视频捕获器
std::string filepath_; // 视频文件路径
std::atomic<bool> is_opened_{false}; // 打开状态
Config config_; // 配置参数
// 视频信息
double original_fps_{0.0}; // 原始帧率
int total_frames_{0}; // 总帧数
int current_frame_{0}; // 当前帧号
float current_fps_{0.0f}; // 当前实际帧率
// 帧率控制相关
std::chrono::steady_clock::time_point last_frame_time_; // 上一帧时间
void updateFrameRate(); // 更新帧率
void controlFrameRate(); // 控制帧率
// 视频格式检查
bool checkVideoFormat(); // 检查视频格式是否支持
// 异步读取相关
std::unique_ptr<FrameQueue> frame_queue_; // 帧队列
std::unique_ptr<std::thread> read_thread_; // 读取线程
std::atomic<bool> stop_flag_{false}; // 停止标志
void readLoop(); // 读取循环
bool readNextFrame(cv::Mat& frame); // 读取下一帧
};
} // namespace pipeline