使用Python开发海康sdk实现对视频流截图JPG方法

参考

Python实现海康sdk等登录操作验证-优快云博客

其主要代码就是GetJPEG方法,但是由于pytohn要调用底层的c++,对于传入参数上有点区别,需要额外注意一下。

self.play_lib.PlayM4_GetJPEG(self.play_ctrl_port,mcBuffer,mcSize,ctypes.byref(refSize))
 

使用下文代码中的 start_playback(33)方法进行回放视频

请注意 通道号如果是硬盘录像机则通道1实际通道号要填写33,而普通摄像头通道1就是1。

主要的功能代码:

   def _dec_callback(self, nPort, pBuf, nSize, pFrameInfo, nUser, nReserved2):
        if pFrameInfo.contents.nType == 3:  # YUV视频帧
            
            #申请一个存储jpg文件的空间
            mcSize = int(pFrameInfo.contents.nWidth * pFrameInfo.contents.nHeight* 1.5)   #3/2=1.5 
            mcBuffer = (c_ubyte * mcSize)()         #申请空间
            refSize=c_uint32(0)                     #返回的实际大小
            
            #GetBMP和GetJPEG方法
            #参考plyampeg4.h 头文件
            # PLAYM4_API BOOL __stdcall PlayM4_GetBMP(LONG nPort,PBYTE pBitmap,DWORD nBufSize,DWORD* pBmpSize);
            # PLAYM4_API BOOL __stdcall PlayM4_GetJPEG(LONG nPort,PBYTE pJpeg,DWORD nBufSize,DWORD* pJpegSize);

            #请求获取JPEG字节流
            #self.play_ctrl_port 为通道号,默认为1
            if self.play_lib.PlayM4_GetJPEG(self.play_ctrl_port,mcBuffer,mcSize,ctypes.byref(refSize)):
               
                #转换字节流,并且裁切实际尺寸
                jpgBuffer=bytearray(mcBuffer)
                refSize=refSize.value
                jpgBuffer=jpgBuffer[:refSize]
                
                #存储为磁盘文件,或进行其他操作
                with open("tmp.jpg","wb") as fp:
                    fp.write(jpgBuffer)
                
                print("截图成功",refSize)
            else:
                print("截图失败",self.play_lib.PlayM4_GetLastError(self.play_ctrl_port))


    def _real_data_callback(self, lPlayHandle, dwDataType, pBuffer, dwBufSize, pUser):

        if dwDataType == NET_DVR_SYSHEAD:

            self.play_lib.PlayM4_SetStreamOpenMode(self.play_ctrl_port, 0)
            if self.play_lib.PlayM4_OpenStream(self.play_ctrl_port, pBuffer, dwBufSize, 1024 * 1024):
                self.func_dec_callback = self.decode_func(self._dec_callback)
                self.play_lib.PlayM4_SetDecCallBackExMend(self.play_ctrl_port, self.func_dec_callback, None, 0, None)
                if self.play_lib.PlayM4_Play(self.play_ctrl_port, None):
                    return True, "播放启动成功"
                else:
                    return False, "播放启动失败"
            else:
                print("打开流失败!",self.play_lib.PlayM4_GetLastError(self.play_ctrl_port))
            
    
        elif dwDataType == NET_DVR_STREAMDATA:
            
            #不断地将接受到的数据流传入给PlayMpeg4进行处理
            self.play_lib.PlayM4_InputData(self.play_ctrl_port, pBuffer, dwBufSize) == 1


        return False, "无效数据"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值