ffmpeg海康SDK流接入的支持

该项目涉及将海康的SDK与ffmpeg结合,以实现流媒体的实时处理。通过学习海康SDK的示例,了解基本操作流程,并选择不使用海康的解码SDK,而是自行接管数据回调以提高速度。具体实现代码可在提供的链接中找到。
摘要由CSDN通过智能技术生成

项目中处理接入流这块 需要加入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数据管理 ???
 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值