#ifndef _cffmpeg_rec_hpp_ #define _cffmpeg_rec_hpp_ #include #include #include #include #include "../buz/recorder.hpp" struct AVPacket; class CPacket; namespace ffwrapper { class FormatIn; class CodedData; } // namespace ffwrapper namespace cffmpeg_wrap { class rec { private: ffwrapper::FormatIn *recRef_; int min_cache_len_; // 录像的实例,对应任务 std::unordered_map > map_rec_; // 多线程添加任务实例,在读流线程使用录像,但是添加在另一个线程 std::mutex mtx_rec_; // recoder将录像文件的信息放到此处 typedef struct record_file_info{ int frmIdx; std::string fPath; std::string recID; }RecInfo; std::list list_recInfo_; // 多线程录像,加锁获取录像后的信息 std::mutex mtx_recInfo_; // 缓存的视频帧,等待firerecsignal触发开始录像 std::list list_pkt_; // 多线程,生产者线程reader push pkt,消费者,录像线程pop std::mutex mtx_pkt_; private: // 查找缓存中的录制帧 void findRecFramesIndex(int64_t &fired_id, const int duration, int &start, int &end); // 录像实例的回调函数,录像完成后设置录像文件路径,id和帧id void setRecInfo(std::string &id, int &index, std::string &path); // 缓存视频包 void cachePacket(const CPacket &pkt); // 丢弃缓存 int shrinkCache(); // 创建录像实例开始录像 std::unique_ptr startRec(std::string id, std::string dir, const int64_t &frameID, const int mind, const int maxd, const bool audio); // 清除缓存,断线重连时需要 void clear(); public: void NewRec(const char* id, const char *output, const int64_t &frameID, const int mindur, const int maxdur, const bool audio); // 准备好录像 void Load(ffwrapper::FormatIn *in); void Unload(); const bool Loaded() const; // 缓存录像的视频包,等待触发录像,或直接放到录像缓存 void SetPacket(const CPacket &pkt); // 触发录像 void FireRecSignal(const char* sid,const int64_t &id); // 获取录像文件路径和帧id void GetRecInfo(std::string &recID, int &index, std::string &path); // 设置录制时长作为缓存 void SetRecMinCacheTime(const int min); public: rec(); ~rec(); }; } // namespace cffmpeg_wrap #endif