项目中处理接入流这块 需要加入SDK方面的一些扩展支持,这里说下海康的支持吧, 大华的同理。
从海康的SDK例子打开播放等等了解基本流程。
这里为了速度能够实时在海康的数据回调不用海康的解码SDK来处理而是自己接管。
例如大致下面:
auto fRealDataCallBack = [](LONG lRealHandle, DWORD dwDataType, BYTE* pBuffer, DWORD dwBufSize, void* pUser)
{
switch (dwDataType)
{
case NET_DVR_SYSHEAD:
break;
case NET_DVR_STREAMDATA:
if (dwBufSize == 0 || pUser == 0)
return;
//TODO...
break;
}
};
最后实际使用代码hknet_puller.h
#pragma once
#include "mpeg_puller.h"
#include "HCNetSDK.h"
//拉流测试一路海康
class HKNetPuller :public InputElement
{
public:
using InputElement::InputElement;
//海康数据回调
void dealData(uint8_t*& buf, int buf_size);
private:
virtual void run(void) override;
virtual bool open(void) override;
virtual void close(void) override;
virtual int read_AVPacket(AVPacket*& pkt);
private:
bool hkPlay(void);
void hkStop(void);
private:
LONG lUserID; //注册设备
LONG lRealPlayHandle; //播放句柄
private:
uint8_t* avio_ctx_buffer = nullptr;
AVIOContext* pb = nullptr;
CircularQueue streamQueue; //缓存环形队列
public:
PacketList* listPkts;
virtual bool exportOpen(void)
{
if (listPkts)
listPkts->setCodecInfo(getCodecInfo());
return true;
};
inline void setPacketListDatas(PacketList* datas)
{
listPkts = datas;
};
};
//拉流后直接解码
class HKNetDecode :public HKNetPuller
{
public:
using HKNetPuller::HKNetPuller;
virtual int read_AVFrame(AVFrame*& frm)
{
Global::freeAVFrame(frm);
return 1;
}
private:
virtual int read_AVPacket(AVPacket*& pkt) override;
FFDecode mCodec;
};
//拉流解码应用
class HKNetDecodePull :public HKNetDecode
{
public:
using HKNetDecode::HKNetDecode;
public:
virtual bool exportOpen(void)
{
if (listFrms)
listFrms->setCodecInfo(getCodecInfo());
return true;
};
virtual int read_AVFrame(AVFrame*& frm);
//下面是frame数据管理 ???