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