// // Created by ps on 19-1-10. // #ifndef GB28181SDK_VIDEOCAPTUREELEMENT_H #define GB28181SDK_VIDEOCAPTUREELEMENT_H #include "FFmpegDecoderJPG.h" #include "28181SDK.h" #include //#include //#include class RtspAnalysManager; namespace BASICGB28181 { class VideoCaptureElementWithRtp : public basic::PipeElement { public: explicit VideoCaptureElementWithRtp(std::string &chanPubID, int fps, int streamTransType, int gpuIdx = -1, RtspAnalysManager *manager = nullptr); virtual ~VideoCaptureElementWithRtp(); /*** * 获取当前实时流接收数据线程运行状态 * @return */ bool getRunning(); cv::Mat getImage(); //保存视频接口,从RtspAnalysManager发起调用 void SaveVideo(const std::string &strImageName); //设置保存视频的最小和最大长度,单位是秒,实际的运行情况有一些差距,需要完善 void SetVideoMinMaxSeconds(const int minSeconds, const int maxSeconds); //根据timeStamp创建路径 std::string MakeDir(const std::string &timeStamp); private: int reopenTime{1000}; int m_gpuIdx; int m_fps; int m_streamTransType; std::string m_chanPubID; std::atomic m_picCount{0}; //几张图丢一张,目前是8张丢一张 const int m_nPicsPickOne = 8; FFmpegDecoderJPG m_fFmpegDecoderJPG; cv::Mat m_image; long m_userdata; RtspAnalysManager *m_pManager; std::atomic m_running; std::atomic m_waitSignal; //用来保存录像视频的路径 std::string m_cutPath; private: /*** * 启动实时流接收数据线程 * @param streamTransType 流数据发送方式 * @return */ bool startRtpStream(int streamTransType = 1); /*** * 停止实时流接收数据线程 * @return */ bool stopRtpStream(); /*** * rtp组包回调函数 * @param handle * @param datatype * @param frametype * @param data * @param datalen * @param userdata */ static void streamcallback(long handle, int datatype, int frametype, unsigned char *data, int datalen, long userdata); virtual void threadFunc() override; virtual void threadInitial() override; virtual void threadClosing() override; }; } #endif //GB28181SDK_VIDEOCAPTUREELEMENT_H