参考
其主要代码就是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, "无效数据"