C# 视频监控系列(12):H264播放器——播放录像文件
正文
先来一张简单的效果图
以下几个VC++ 代码片段:
CPlayerDlg::OnInitDialog()
Hik_PlayM4_SetVolume(PORT,m_SoundSlider.GetPos());
// 其他代码
//set the capture picture call back function;
Hik_PlayM4_SetDisplayCallBack(PORT,DisplayCBFun);
//set the wave audio call back funtion;
Hik_PlayM4_SetAudioCallBack(PORT,WaveCBFun, (long)this);
// 其他代码
Hik_PlayM4_SetEncTypeChangeCallBack(PORT,funEncChange,(long)this);
#if (WINVER > 0x0400)
//If do not support multi monitor,may not call!
Hik_PlayM4_InitDDrawDevice();
Hik_PlayM4_SetDDrawDevice(PORT,0);
#endif
//Test adapter Capability;
TestCapability(0);
Hik_PlayM4_SetFileEndMsg(PORT,m_hWnd,WM_FILE_END);
Hik_PlayM4_SetEncChangeMsg(PORT,m_hWnd,WM_ENC_CHANGE);
if(m_strPlayFileName.Compare(""))
{
if(m_bStreamType)
OpenStream();
else
OpenFile();
}
CPlayerDlg::OpenFile()
Hik_PlayM4_SetFileRefCallBack(PORT,FileRefDone,(DWORD)this);
Hik_PlayM4_SetVerifyCallBack(PORT, 0, 0xffffffff, VerifyFun, (DWORD) this);// verify the whole file;
if(!Hik_PlayM4_OpenFile(PORT,m_strPlayFileName.GetBuffer(m_strPlayFileName.GetLength())))
{
m_strPlayFileName="";
CString csError;
csError.Format("Open file failed(%d)",Hik_PlayM4_GetLastError(PORT));
MessageBox(csError);
return ;
}
SetOpenState();
m_nMaxFileTime=Hik_PlayM4_GetFileTime(PORT);
if(!m_nMaxFileTime)
{
MessageBox("File seconds is zero");
return;
}
m_nTotalHour=m_nMaxFileTime/3600;
m_nTotalMinute=(m_nMaxFileTime%3600)/60;
m_nTotalSecond=m_nMaxFileTime%60;
m_nTotalFrames=Hik_PlayM4_GetFileTotalFrames(PORT);
numFrames=m_nTotalFrames;
//If you want to change the display buffer. Do hear!
//Hik_PlayM4_SetDisplayBuf(PORT,25);
Play();
CPlayerDlg::Play()
OnThrow0();
//#ifdef _TEST_CALLBACK
if(m_bConvert)
Hik_PlayM4_SetDecCallBack(PORT,DecCBFun);
else
m_pMainMenu->EnableMenuItem(ID_FILE_CLOSE, FALSE);
//#endif
if(m_bPlaying)
{
Hik_PlayM4_Play(PORT,GetDlgItem(IDC_SHOW)->m_hWnd);
}
else
{
if(m_bStreamType)
{
::SetFilePointer(m_hStreamFile,m_nHeadSize,0,FILE_BEGIN);
Hik_PlayM4_ResetSourceBuffer(PORT);
SetEvent(m_hEventInput);
}
m_bPlaying = Hik_PlayM4_Play(PORT,GetDlgItem(IDC_SHOW)->m_hWnd);
m_bSound=Hik_PlayM4_PlaySound(PORT);
if(m_bPlaying)
SetTimer(PLAY_TIMER,500,NULL);
}
CPlayerDlg::SetOpenState()
Hik_PlayM4_SetOverlayMode(PORT,TRUE,RGB(255,0,255));
代码分析:
1. 从OnInitDialog部分代码可以看出主要是设置声音、判断是不是双击视频文件或者直接从流中读取数据。
2. OpenFile和SetOpenState是打开文件、设置画面大小、显示统计信息,如总帧数、视频总时间。
3. Play播放打开的视频文件。
4. 注意这里不讨论直接从流中读取数据并播放。
以下是非完全对应的C# Code:
//uesed port;can be from 0 to 15;
int PORT = 0;
//视频文件路径
private string m_strPlayFileName;
private void Form3_Load(object sender, EventArgs e)
{
//设置音量
HikPlayer.Hik_PlayM4_SetVolume(PORT, 0xFFFF);
HikPlayer.Hik_PlayM4_SetFileEndMsg(PORT, pVideo.Handle, HikPlayer.WM_FILE_END);
HikPlayer.Hik_PlayM4_SetEncChangeMsg(PORT, pVideo.Handle, HikPlayer.WM_ENC_CHANGE);
}
/// <summary>
/// 打开文件并播放
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPlay_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
m_strPlayFileName = openFileDialog1.FileName;
if (!string.IsNullOrEmpty(m_strPlayFileName))
{
OpenFile();
//设置画面质量
HikPlayer.Hik_PlayM4_SetPicQuality(PORT, true);
}
else
MessageBox.Show("请选择文件!!");
}
}
private void OpenFile()
{
//打开播放文件
HikPlayer.Hik_PlayM4_OpenFile(PORT, m_strPlayFileName);
Play();
}
public void SetOpenState()
{
//m_bOpen=TRUE;
int m_nWidth, m_nHeight;
//获取原始图像的大小,可根据这个自动设置播放器大小
HikPlayer.Hik_PlayM4_GetPictureSize(PORT, out m_nWidth, out m_nHeight);
HikPlayer.Hik_PlayM4_SetOverlayMode(PORT, true, Color.FromArgb(255, 0, 255).ToArgb());
}
private void Play()
{
//开始播放
HikPlayer.Hik_PlayM4_Play(PORT, pVideo.Handle);//this.Handle);
//播放声音
HikPlayer.Hik_PlayM4_PlaySound(PORT);
}
代码说明:
1. 相对于VC++例子,这里省略了许多代码,比如空委托、显示统计信息等。
2. 如果文件打开出错,有可能是前面视频录像文件有问题,你可以先用自带的播放器试一下。
3. 建议补充错误处理。
结束
加油~~~快接近尾声了 : )
C# 视频监控系列(12):H264播放器——播放录像文件相关推荐
- C# 视频监控系列(13):H264播放器——控制播放和截图
C# 视频监控系列(13):H264播放器--控制播放和截图 前言 本该把这部分和上一篇合成一篇的,无奈挣扎半天,还是想对称起来,客户端3篇.服务器端3篇--所有播放器也勉强凑3篇吧(封装API的文章 ...
- C# 视频监控系列(14):总结贴——VC++代码转成C#小结
前言 关键字:c++ to C# 原计划是再写一篇H264播放器转换AVI的文章才开始写总结的,至今未能成功,由于时间问题并且也暂时没有这个需求,所以决定从原计划中去掉这一章节直接进入总结贴,然后结束 ...
- C# 视频监控系列(15):总结贴——可能用到的C# WinForm技术小结
前言 本章主要把可能用到的C# WinForm 功能性代码在这里汇总一下,以备实现其他功能来满足客户的其他需求,或者方便自己开发. 注意 本系列文章限于学习交流,注重过程,由于涉及公司,所以不提供源代 ...
- C# 视频监控系列(11):H264播放器——封装API[HikPlayM4.dll]
前言 当你认真的写完客户端和服务器端的时候可能不需要再继续往下看关于播放器的代码和说明,因为你已经掌握了如何转换VC++代码的技巧了,加上GOOGLE再来完成这个播放器应该算小菜了.但是作为我的系列, ...
- C# 视频监控系列(2):客户端——封装API
前言 本章主要是在C#封装的海康DVR客户端SDK 的代码上修改的,并参考<Hikvision 板卡网络开发包编程手册V4.7.pdf>补上更完整的注释,并且参照VC++源码做了小部分修改 ...
- C# 视频监控系列(10):服务器端——验证、设置画面质量、字幕叠加、板卡序列号...
C# 视频监控系列(10):服务器端--验证.设置画面质量.字幕叠加.板卡序列号 豆豆网 技术应用频道 2009年04月08日 [字号:小 中 大] 收藏本文 被过滤广告 关键字: NetB ...
- C# 视频监控系列(9):服务器端——数据捕获(抓图 + 录像)
前言 录像功能是监控系统中最重要的功能之一,除了本文的功能实现外,还需要你自己考虑合适的存储策略:存储大小.时间段.存储盘符等. 注意 本系列文章限于学习交流,注重过程,由于涉及公司,所以不提供源代码 ...
- C# 视频监控系列(5):客户端——给服务器端发送字符串和录像(数据捕获)
前言 这几天加紧赶工写服务器端的程序,所有系列文章更新较慢,见谅: ) 注意 本系列文章限于学习交流,注重过程,由于涉及公司,所以不提供源代码下载,非常抱歉!!但是请大家放心,核心.实现以及其他能够贴 ...
- C# 视频监控系列(7):服务器端——封装API(下)(1)
前言 写系列文章的时候[前言]部分变得无言了,可能来得顺利了点吧: ) 本章中提供的封装均是我用笨办法从<<Hikvision 板卡网络开发包编程手册V4.7>>和<&l ...
- react项目中使用阿里播放器播放视频,包括切换视频,播放定时跳转(兼容ios和andro),播放完成
react项目中使用阿里播放器播放视频,包括切换视频,播放定时跳转(兼容ios和andro),播放完成 1.index.html引入阿里播放器的cdn <link rel="style ...
最新文章
- windows 80端口被占用的解决方法
- 【语法】点语法的应用
- vc6可编译的 linux 源码,Linux 下源码编译FFMEG
- Google推出了Python最牛逼的编辑器,你知道吗?
- mysql 优化 - like模糊查询优化
- pandas读取excel带汉字的列头_Pandas读取excel与中文文件名
- 内蒙古2021年高考成绩查询系统入口,2021年内蒙古高考成绩查询网址,内蒙古高考成绩查询系统时间安排...
- python正则表达式基础
- Curve fitting C: Non-linear Iterative Curve Fitting中文翻译
- 沟通CTBS助真科电子跨平台接入
- python编写udp端口扫描工具全
- 什么是盒子模型,盒子模型,标准盒模型,怪异盒模型,两种盒模型的区别,box-sizing属性
- CDN缓存原理和介绍
- 为文件夹属性添加安全标签的方法
- Linux上安装Matlab2020a
- 中国作家维权联盟向苹果和百度发出律师函
- 如何快速保存PPT中的图片资源
- P4546 [THUWC2017]在美妙的数学王国中畅游
- cs6给画笔分组_ps里笔刷怎么分组
- 微信小程序人工智能之添加学生信息