海康视频writefile写文件怎么调用回调函数中某个参数实现视频流的保存。

liangqingchao 2014-03-30 08:54:59
现在有海康视频开发包。通过writefile函数的调取。把其给的开发包中的视频流回调函数中的某个参数调取。进行视频流的视频保存。现在代码如下
///实时流回调函数
void CALLBACK fRealDataCallBack(LONG lRealHandle,DWORD dwDataType,BYTE *pBuffer,DWORD dwBufSize,void *pUser)
{
DWORD dRet;
switch (dwDataType)
{
case NET_DVR_SYSHEAD:
if (!PlayM4_GetPort(&nPort))
{
break;
}
if (!PlayM4_OpenStream(nPort,pBuffer,dwBufSize,1024*1024))
{
dRet=PlayM4_GetLastError(nPort);
break;
}

//设置解码回调函数 只解码不显示
// if (!PlayM4_SetDecCallBack(nPort,DecCBFun))
// {
// dRet=PlayM4_GetLastError(nPort);
// break;
// }

//设置解码回调函数 解码且显示
if (!PlayM4_SetDecCallBackEx(nPort,DecCBFun,NULL,NULL))
{
dRet=PlayM4_GetLastError(nPort);
break;
}

//打开视频解码
if (!PlayM4_Play(nPort,hPlayWnd))
{
dRet=PlayM4_GetLastError(nPort);
break;
}

//打开音频解码, 需要码流是复合流
if (!PlayM4_PlaySound(nPort))
{
dRet=PlayM4_GetLastError(nPort);
break;
}
break;

case NET_DVR_STREAMDATA:
BOOL inData=PlayM4_InputData(nPort,pBuffer,dwBufSize);
while (!inData)
{
Sleep(10);
inData=PlayM4_InputData(nPort,pBuffer,dwBufSize);
OutputDebugString("PlayM4_InputData failed \n");
}
}
}

//取流
void CDecCallBack_DemoDlg::OnOK()
{
// TODO: Add extra validation here
BOOL bRet1;
UpdateData(TRUE);
if (llRealHandle<0)
{
UpdateData(TRUE);

if (lUserID<0)
{
ErrorNum.Format("Login failed Error number :%d\n",NET_DVR_GetLastError());
OutputDebugString(ErrorNum);
}

//////////////////////////////////////////////////////////////////////////
NET_DVR_CLIENTINFO ClientInfo;
ClientInfo.lChannel = iPChannel; //Channel number 设备通道号
ClientInfo.hPlayWnd = NULL; //窗口为空,设备SDK不解码只取流
ClientInfo.lLinkMode = 0; //Main Stream
ClientInfo.sMultiCastIP = NULL;

//预览取流
llRealHandle = NET_DVR_RealPlay_V30(lUserID,&ClientInfo,fRealDataCallBack,NULL,TRUE);

if (llRealHandle<0)
{
ErrorNum.Format("NET_DVR_RealPlay_V30 failed! Error number: %d\n",NET_DVR_GetLastError());
AfxMessageBox(ErrorNum);
return;
}
// else
// {
// DWORD dwTmp;
// HANDLE hfile = CreateFile("D:\\aaa.mp4", GENERIC_WRITE, 0, NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// WriteFile(hfile,fRealDataCallBack,_tcslen((LPCTSTR)fRealDataCallBack)*sizeof(TCHAR),&dwTmp,NULL);
// CloseHandle(hfile);
// }

GetDlgItem(IDOK)->SetWindowText("Stop");
}
else
{
//停止预览
if (NET_DVR_StopRealPlay(llRealHandle))
{
bRet1=NET_DVR_GetLastError();
}
llRealHandle=-1;

//停止解码
if (nPort>-1)
{
if (!PlayM4_StopSound())
{
bRet1=PlayM4_GetLastError(nPort);
}
if (!PlayM4_Stop(nPort))
{
bRet1=PlayM4_GetLastError(nPort);
}
if (!PlayM4_CloseStream(nPort))
{
bRet1=PlayM4_GetLastError(nPort);
}
PlayM4_FreePort(nPort);
nPort=-1;
}

//关闭保存解码后数据的音视频文件
if (Audiofile!=NULL)
{
fclose(Audiofile);
Audiofile=NULL;
}

if (Videofile!=NULL)
{
fclose(Videofile);
Videofile=NULL;
}

GetDlgItem(IDOK)->SetWindowText("Start Play");
}

UpdateData(FALSE);
// CDialog::OnOK();
}

此时我在写一个视频保存的的函数。这个函数实现如下
void CDecCallBack_DemoDlg::OnButton2() 
{
// TODO: Add your control notification handler code here
DWORD dwTmp=0;
HANDLE hfile = CreateFile("D:\\aaa.mp4", GENERIC_WRITE, 0, NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hfile,fRealDataCallBack,_tcslen((LPCTSTR)fRealDataCallBack)*sizeof(TCHAR),&dwTmp,NULL);
CloseHandle(hfile);
}

这个总是保存不了视频流。有人告诉我是WriteFile函数中的第二个参数应该调取fRealDataCallBack函数中的pBuffer参数。但是我不会。求大神帮帮忙。看看怎么才能取流保存。实现通过取流保存的功能。
...全文
529 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36140470 2016-10-09
  • 打赏
  • 举报
回复
没有那么麻烦直接在取流函数里加 WriteFile(hFile,pBuffer,dwBufSize,&dWruteSize,NULL);取流录制就好了
神-气 2014-04-08
  • 打赏
  • 举报
回复
fRealDataCallBack不是函数地址么,你把这个函数地址写到文件中是什么意思 ?
wqvbjhc 2014-04-07
  • 打赏
  • 举报
回复
你在fRealDataCallBack取到流,就应该在fRealDataCallBack保存视频数据。 在OnButton2里面能干什么?
qjgdftxmu 2014-04-07
  • 打赏
  • 举报
回复
问题太专了,除非是和你同方向的人,要不很难
liangqingchao 2014-04-07
  • 打赏
  • 举报
回复
还是没有人会么?难道沉底了????
liangqingchao 2014-03-31
  • 打赏
  • 举报
回复
引用 2 楼 jzycode 的回复:
大神什么大神,既然你用海康的相机,那直接看文档呗,或者打海康的技术支持电话,跑到这里来问!
我打电话都问了。他们没有这个开发包。也不帮忙实现。我想实现的目的就是一个海康视频服务器有2个通道。每个通道保存1分钟视频。但是海康开发包给的都是每个通道一个视频。合着两个通道就的保存两个视频文件。但是我需要把这两个视频在保存的时候合并为一个视频。海康没有这个开发包。都已经问完了。他让我自己取视频流用writefile函数实现保存。所以我就来请教了。
_船长_ 2014-03-31
  • 打赏
  • 举报
回复
大神什么大神,既然你用海康的相机,那直接看文档呗,或者打海康的技术支持电话,跑到这里来问!
liangqingchao 2014-03-31
  • 打赏
  • 举报
回复
没人解决么??求大神啊求大神!!!

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧