63,594
社区成员




看到海康官网上有提供播放库SDK,用QT试了一下示例代码,代码调试通过了,运行时就是显示不出来画面,不知道啥原因。这是我的代码
#include <stdio.h>
#include <iostream>
#include "iostream"
#include "Windows.h"
#include "PlayM4.h"
using namespace std;
LONG g_nPort = -1;
#define READ_BUF_SIZE 200
#define PRIVT_HEAD_LEN 40
#define DECODE_NORMAIL 0
#define DISPLAY_NORMAL 0x00000001
void CALLBACK DecCBFun(long nPort,char * pBuf,long nSize,
FRAME_INFO * pFrameInfo,
void* nUser, void* nReserved2)
// long nReserved1,long /*nReserved2*/)
{
//---------------------------------------
// 获取解码后音频数据
if (pFrameInfo->nType == T_AUDIO16)
{
printf("test:: get audio data !\n");
}
//---------------------------------------
// 获取解码后视频数据
else if ( pFrameInfo->nType == T_YV12 )
{
printf("test:: get video data !\n");
}
}
void CALLBACK DisplayCBFun(long nPort,char * pBuf,long nSize,long nWidth,long nHeight,long nStamp,long nType,void* nReserved)
{
printf("zytest: get vid pic !\n");
// if(m_strCapPicPath.Compare(""))
// {
// sFilePath.Format("%s\\capture%02d.bmp", "g:\\", m_npic_bmp++);
// }
// else
// {
// sFilePath.Format("C:\\capture%02d.bmp", m_npic_bmp++);
// }
char *pic = (char *)"dfdg.bmp";
//连续抓BMP图片
PlayM4_ConvertToBmpFile(pBuf,nSize,nWidth,nHeight,nType, pic);
}
using namespace std;
typedef HWND (WINAPI *PROCGETCONSOLEWINDOW)();
PROCGETCONSOLEWINDOW gGetConsoleWindow;
int main()
{
BOOL bFlag = FALSE;
int nError = 0;
FILE* fp = NULL;
char* pBuffer = NULL;
//---------------------------------------
// 获取控制台窗口句柄
HMODULE hKernel32 = GetModuleHandle(L"kernel32");
gGetConsoleWindow = (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,"GetConsoleWindow");
//---------------------------------------
// 获取播放库通道号
PlayM4_GetPort(&g_nPort);
//打开待解码文件
fp = fopen( "test.mp4", ("rb") );
if (fp == NULL)
{
printf("cannot open the file !\n");
return -1;
}
pBuffer = new char[READ_BUF_SIZE];
if (pBuffer == NULL)
{
return -1;
}
//读取文件中文件头
fread( pBuffer, PRIVT_HEAD_LEN, 1, fp );
//设置流模式类型
PlayM4_SetStreamOpenMode(g_nPort,STREAME_FILE);
//打开流模式
PlayM4_OpenStream(g_nPort,(PBYTE)pBuffer,PRIVT_HEAD_LEN,1024 * 1024);
PlayM4_SetDecCBStream(g_nPort, 1);
PlayM4_SetDecodeFrameType(g_nPort, DECODE_NORMAIL);
//设置解码回调
PlayM4_SetDecCallBackExMend(g_nPort,DecCBFun,NULL,0,NULL);
//设置显示回调
// PlayM4_SetDisplayCallBack(g_nPort,DisplayCBFun);
LONG times;
//---------------------------------------
// 获取显示窗口句柄
HWND hWnd = gGetConsoleWindow();
RECT strSrcRect = {0};
strSrcRect.left = 0;
strSrcRect.top = 0;
strSrcRect.right = 200;
strSrcRect.bottom = 150;
PlayM4_SetDisplayRegion(g_nPort, 1, &strSrcRect, hWnd, 1);
PlayM4_SetDisplayType(g_nPort, DISPLAY_NORMAL);
PlayM4_Play(g_nPort,hWnd);
LONG dwWidth;
LONG dwHeight;
LONG dwSize;
PBYTE m_pCapBuf;
DWORD dwCapSize;
//获取当前视频文件的分辨率
bFlag = PlayM4_GetPictureSize(g_nPort,&dwWidth,&dwHeight);
dwSize = dwWidth * dwHeight * 5;
//申请抓图内存
if (m_pCapBuf == NULL)
{
m_pCapBuf = new BYTE[dwSize];
if (m_pCapBuf == NULL)
{
return -1;
}
}
//抓图BMP图片
bFlag = PlayM4_GetBMP(g_nPort,m_pCapBuf,dwSize,&dwCapSize);
if (bFlag == FALSE)
{
nError = PlayM4_GetLastError(g_nPort);
}
if (m_pCapBuf != NULL)
{
delete [] m_pCapBuf;
m_pCapBuf = NULL;
}
while (!feof(fp))
{
fread( pBuffer, READ_BUF_SIZE, 1, fp );
while (1)
{
bFlag = PlayM4_InputData(g_nPort,(PBYTE)pBuffer,READ_BUF_SIZE);
times = PlayM4_GetFileTime(g_nPort);
printf("%d\n", times);
if (bFlag == FALSE)
{
nError = PlayM4_GetLastError(g_nPort);
//若缓冲区满,则重复送入数据
if (nError == PLAYM4_BUF_OVER)
{
Sleep(2);
continue;
}
}
PlayM4_RefreshPlay(g_nPort);
//若送入成功,则继续读取数据送入到播放库缓冲
break;
}
}
Sleep(10000);
//---------------------------------------
// 停止解码
PlayM4_Stop(g_nPort);
//关闭流,回收源数据缓冲
PlayM4_CloseStream(g_nPort);
//释放播放库端口号
PlayM4_FreePort(g_nPort);
if (fp != NULL)
{
fclose(fp);
fp = NULL;
}
if (pBuffer != NULL)
{
delete [] pBuffer;
pBuffer = NULL;
}
return 0;
}
运行时可以看到打印的信息。