原文地址:http://www.cnblogs.com/over140/archive/2009/03/23/1419643.html?spm=5176.100239.blogcont51182.16.wcs129

前言

本章主要实现播放海康录像文件,更多播放器说明可以参考《Hikvision H264播放器编程指南V4.8》。

注意

本系列文章限于学习交流,注重过程,由于涉及公司,所以不提供源代码下载,非常抱歉!!但是请大家放心,核心、实现以及其他能够贴出来的代码我都会贴出来,并且争取尽所能的回答留言里的每一个问题,感谢大家关注,欢迎交流 :)

系列

1.     C# 视频监控系列(1):准备

2.     C# 视频监控系列(2):客户端——封装API

3.     C# 视频监控系列(3):客户端——连接服务器

4.     C# 视频监控系列(4):客户端——音频接收和抓图

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播放器——播放录像文件的更多相关文章

  1. 【转】C# 视频监控系列(13):H264播放器——控制播放和截图

    本文原文地址:http://www.cnblogs.com/over140/archive/2009/03/30/1421531.html 阿里云栖社区也有相关的视频开发案例:https://yq.a ...

  2. C# 视频监控系列:学习地址汇总

    原文地址:http://www.cnblogs.com/over140/archive/2009/04/07/1429308.html 前言 对于视频监控系统大家应该是不陌生的,实施的路况信息.地铁. ...

  3. 使用vlc播放器播放rtsp流视频

    可参考: 使用vlc播放器做rtsp服务器 web网页中使用vlc插件播放相机rtsp流视频 使用vlc进行二次开发做自己的播放器 首先需要安装vlc播放器,下载及安装步骤略 使用vlc播放器播放rt ...

  4. 音视频学习系列第(三)篇---wav文件的存储和解析

    音视频系列 什么是wav wav是一种无损的音频文件格式,wav文件有两部分,第一部分是文件头,记录一些重要的参数信息,如音频的采样率,通道数,数据位宽,第二部分是数据部分,数据部分可以是PCM,也可 ...

  5. java调用本地播放器播放视频文件。调用本地播放器不能播放指定文件的说明。

    public class OpenExe extends HttpServlet { //打开本地播放器并播放视频 public static void openExe(String file) { ...

  6. .NET MVC对接POLYV——HTML5播放器播放加密视频

    官方参考文档:http://dev.polyv.net/2017/videoproduct/v-playerapi/html5player/html5-docs/ 1.上传视频之前根据自己需要对所上传 ...

  7. .net C# 网页播放器 支持多种格式 媒体播放器 播放器 代码

    .avi格式代码片断如下:<object id='video' width='400' height='200' border='0' classid='clsid:CFCDAA03-8BE4- ...

  8. flv网页播放器播放失败

    在IIS6.0上发布网站时,在路径正确的情况下,网页flv播放器还是无法播放flv视频的解决方法. 1.打开IIS6.0管理器,打开发布的网站,点击打开属性窗口. 2.在HTTP头选项里找到MIME类 ...

  9. EasyPlayer-RTSP-Android安卓播放器播放RTSP延迟优化策略,极低延时!

    EasyPlayer-RTSP-Android安卓RTSP播放器低延迟播放延时优化策略 EasyPlayer-RTSP-Android播放器是一款专门针对RTSP协议进行过优化的流媒体播放器,其中我们 ...

随机推荐

  1. Problem B: 零起点学算法81——找出数组中最大元素的位置(下标值

    #include<stdio.h> int main(void) { ],i,max; while(scanf("%d",&n)!=EOF) { ;i<n ...

  2. MYSQL复习笔记11-排序分组

    Date: 20140223Auth: Jin 一.排序 order by作用:对查询结果进行排序1.基本语法SELECT column_name(s) FROM table_name ORDER B ...

  3. Visio中旋转文本框与箭头平行

    如图想要让文本框和箭头平行,按住shift,可以画出水平或者垂直的线,线是斜的,用文本框来标识,要框和线平行,那可以这样做: 打开视图  -  任务窗格 - 大小和位置,然后先单击选中斜线 左下角倒数 ...

  4. 明尼苏达推荐系统导论(第一课 欢迎来到RS)

    一.RS介绍 1.显示评分:直接从用户来 隐式评分:从用户活动推测得到的 2.预测是偏好的估计,是预测缺失值,推荐是从其他用户推荐项目,是推荐感兴趣的项目. 3.协同表示利用其它用户的数据 二.欢迎来 ...

  5. oracle 查看执行最慢 sql

    查询执行最慢的sql select * from (select sa.SQL_TEXT, sa.SQL_FULLTEXT, sa.EXECUTIONS "执行次数", round ...

  6. RapidXml使用方法

    一.写xml 文件 [cpp] view plaincopy #include <iostream> #include "rapidxml/rapidxml.hpp" ...

  7. 使用Gradle构建Android应用的渠道包

    所有做Android App的同志们应该都知道渠道包是什么,得力于Android生态的多样性,我等写Android应用的人类每次发布App都需要面对数十个市场,而为了能够采集到市场的表现数据,就必须为 ...

  8. [NS2]TCL语言基本语法

    (来自:<NS2仿真实验-多媒体和无线网络通信>) 1. 变量(Variable)和变量替换(Variable Substitution) tcl变量是在第一次使用set的指令来指派变量的 ...

  9. 剖析ASP.NET Core MVC(Part 1)- AddMvcCore(译)

    原文:https://www.stevejgordon.co.uk/asp-net-core-mvc-anatomy-addmvccore发布于:2017年3月环境:ASP.NET Core 1.1 ...

  10. Vue使用中遇到问题汇总(二)

    1.vue cli使用npm run dev报错cannot get / config/index.js里有两个环境:一个是build,一个dev. 在config/index.js里面修改,buil ...