【转】C# 视频监控系列(12):H264播放器——播放录像文件
前言
本章主要实现播放海康录像文件,更多播放器说明可以参考《Hikvision H264播放器编程指南V4.8》。
注意
本系列文章限于学习交流,注重过程,由于涉及公司,所以不提供源代码下载,非常抱歉!!但是请大家放心,核心、实现以及其他能够贴出来的代码我都会贴出来,并且争取尽所能的回答留言里的每一个问题,感谢大家关注,欢迎交流 :)
系列
5. C# 视频监控系列(5):客户端——给服务器端发送字符串和录像(数据捕获)
6. C# 视频监控系列(6):服务器端——封装API(上) [HikServer.dll]
7. C# 视频监控系列(7):服务器端——封装API(下) [DS40xxSDK.dll]
8. C# 视频监控系列(8):服务器端——预览和可被客户端连接
9. C# 视频监控系列(9):服务器端——数据捕获(抓图 + 录像)
10. C# 视频监控系列(10):服务器端——验证、设置画面质量、字幕叠加、板卡序列号
11. C# 视频监控系列(11):H264播放器——封装API[HikPlayM4.dll]
12. 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_GetPictureSize(PORT,&m_nWidth,&m_nHeight); 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播放器——控制播放和截图
本文原文地址:http://www.cnblogs.com/over140/archive/2009/03/30/1421531.html 阿里云栖社区也有相关的视频开发案例:https://yq.a ...
- C# 视频监控系列:学习地址汇总
原文地址:http://www.cnblogs.com/over140/archive/2009/04/07/1429308.html 前言 对于视频监控系统大家应该是不陌生的,实施的路况信息.地铁. ...
- 使用vlc播放器播放rtsp流视频
可参考: 使用vlc播放器做rtsp服务器 web网页中使用vlc插件播放相机rtsp流视频 使用vlc进行二次开发做自己的播放器 首先需要安装vlc播放器,下载及安装步骤略 使用vlc播放器播放rt ...
- 音视频学习系列第(三)篇---wav文件的存储和解析
音视频系列 什么是wav wav是一种无损的音频文件格式,wav文件有两部分,第一部分是文件头,记录一些重要的参数信息,如音频的采样率,通道数,数据位宽,第二部分是数据部分,数据部分可以是PCM,也可 ...
- java调用本地播放器播放视频文件。调用本地播放器不能播放指定文件的说明。
public class OpenExe extends HttpServlet { //打开本地播放器并播放视频 public static void openExe(String file) { ...
- .NET MVC对接POLYV——HTML5播放器播放加密视频
官方参考文档:http://dev.polyv.net/2017/videoproduct/v-playerapi/html5player/html5-docs/ 1.上传视频之前根据自己需要对所上传 ...
- .net C# 网页播放器 支持多种格式 媒体播放器 播放器 代码
.avi格式代码片断如下:<object id='video' width='400' height='200' border='0' classid='clsid:CFCDAA03-8BE4- ...
- flv网页播放器播放失败
在IIS6.0上发布网站时,在路径正确的情况下,网页flv播放器还是无法播放flv视频的解决方法. 1.打开IIS6.0管理器,打开发布的网站,点击打开属性窗口. 2.在HTTP头选项里找到MIME类 ...
- EasyPlayer-RTSP-Android安卓播放器播放RTSP延迟优化策略,极低延时!
EasyPlayer-RTSP-Android安卓RTSP播放器低延迟播放延时优化策略 EasyPlayer-RTSP-Android播放器是一款专门针对RTSP协议进行过优化的流媒体播放器,其中我们 ...
随机推荐
- 【差分约束系统】【最短路】【spfa】CDOJ1646 穷且益坚, 不坠青云之志。
求一个有n个元素的数列,满足任意连续p个数的和不小于s, 任意连续q个数的和不大于t. 令sum[i]表示前i项的和(0<=i<=n,sum[0]=0) 那么题目的条件可转化为: sum[ ...
- 记录Debug神经网络的方法
debugNNIntroduction to debugging neural networksThe following advice is targeted at beginners to neu ...
- python函数式编程之匿名函数、装饰器、偏函数
匿名函数 当我们在传入函数时,有些时候,不需要显式的定义函数,直接传入匿名函数就行.如下面 lambda x: x*x 在python中,关键字lambda表示匿名函数,冒号前面的x表示函数参数 匿名 ...
- linux禁ping与限制ip登录
以root进入linux系统,然后编辑文件icmp_echo_ignore_allvi /proc/sys/net/ipv4/icmp_echo_ignore_all将其值改为1后为禁止PING将其值 ...
- js中propertyIsEnumerable()方法使用介绍
javascript的propertyIsEnumerable()方法使用介绍 概述 propertyIsEnumerable()用来检测属性是否属于某个对象的,如果检测到了,返回true,否则fal ...
- unity3d-地图制作之云彩飘动
首先,我先声明,关于美工制作我是一点都不了解,甚至基本上没接触过,所以今天开始我就兼并这美工加程序来学习. 当然,我只是对unity中的美术比较感兴趣而已,仅此而已. 所以,如果我在文章中讲的不对的地 ...
- java >>> 和 >>>=的区别
java >> 和 >>> 以及 >>>= 的区别 可能大家都知道java中>> 和 >>> 的区别,那这里我也啰嗦一下, ...
- Java 定时任务 & 任务调度
任务调度是指基于 给定时间点,给定时间间隔 或者 给定执行次数 自动执行任务. 方式1:通过 Thread 来实现 例如如下的代码,可以每隔 1000 毫秒做一次打印操作. public class ...
- iOS:手势的详解UIGestureReconizer
手势类:UIGestureReconizer 父类: 手势状态枚举 typedef NS_ENUM(NSInteger, UIGestureRecognizerState) { UIGesture ...
- TensorFlow------读取图片实例
TensorFlow------读取图片实例: import tensorflow as tf import os def readpic(filelist): ''' 读取人物图片并转换成张量 :p ...