海康相机播放库SDK调用问题,显示不出来视频

陌生人的天堂 2023-05-24 16:58:07

看到海康官网上有提供播放库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;
}

运行时可以看到打印的信息。

...全文
37 回复 打赏 收藏 转发到动态 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
相关推荐
本季课程通过移植ORTP调用ORTP函数来实现H.264裸流数据的网络传输,并且在Windows中安装VLC播放器,并在VLC中通过配置文件的方式来解析ORTP发送的裸流实现视频实时预览。本季课程的核心是ORTP协议的讲解,ORTP的移植、部署和调用,VLC软件的用法讲解和配置文件讲解,Wireshark网络抓包工具的用法讲解,实时视频流传输和解析的体验和编程实现。随着通信行业发展,网速越来越快,网络也从文本时代发展越过语音时代到了现在视频时代,“优酷、爱奇艺”、“微视频”、“直播”等的出现也是视频逐步成为主流媒体的证据和表现。航拍、视频监控、刷脸过关检测、汽车ADAS系统等应用也是视频在主流行业中的应用,因此视频的采集、编解码、传输、识别等技术变得越来越有价值,涌现出了“海康威视”、“大华股份”、“深圳英飞拓”等一批明星企业,名扬海内外,动辄市值几百亿。同时在芯片级,国产华为海思HI35XX系列视频编解码方案也逐步取代进口芯片(如TI、安霸)成为主流方案。视频行业技术含量高、难度大、学习周期长、发展变化快而资料少,因此行业比较缺人、工资较高。如海康威视,普通高校硕士研究生应届进入年薪普遍高于15-20万,在嵌入式linux领域也算高工资技术方向了。本项目是朱老师及其团队推出的一个嵌入式linux领域重量级企业级实战项目,选用华为海思HI3518E方案,结合OV9712/AR0130 Sensor实现图像采集和H.264编码压缩,并通过ethernet和WIFI,以socket实时流和RTSP等方式,实现720P/960P高清视频传输。本项目共分11季,从海思SDK开发环境搭建,到sample程序讲解、SDK中API函数解析,到H.264编解码、RTSP流媒体传输、MP4文件打包,到图像IQ调试、图像识别等视频领域高阶内容,可以说从零基础入手,对图像采集、编解码、网络传输、图像存储和识别做了全方位的详细讲解和代码分析,是目前市面上**一套系统讲解图像和视频技术的视频课程。

63,594

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下