博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 视频监控系列(12):H264播放器——播放录像文件
阅读量:6345 次
发布时间:2019-06-22

本文共 4035 字,大约阅读时间需要 13 分钟。

正文

     先来一张简单的效果图

  

     以下几个VC++ 代码片段:

          CPlayerDlg::OnInitDialog()          CPlayerDlg::OpenFile()          CPlayerDlg::Play()          CPlayerDlg::SetOpenState()

    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();
    }
  

 

    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();

 

    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);
        
    }

 

    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.     建议补充错误处理。

 

本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586633,如需转载请自行联系原作者

你可能感兴趣的文章
什么是Intent
查看>>
[React Native] Using the WebView component
查看>>
Swift - 添加纯净的Alamofire
查看>>
详解javascript实现自定义事件
查看>>
C#程序中设置全局代理(Global Proxy)
查看>>
SharpGL学习笔记(十五) 纹理映射
查看>>
Asp.Net MVC EF各版本区别
查看>>
Linux查看文件以及文件夹的大小
查看>>
Android App 开发技能图谱
查看>>
Remote Desktop Connection没法全屏解决方案
查看>>
扩张js的String——trim
查看>>
AE数据加载
查看>>
状态模式
查看>>
for update造成的Oracle锁表与解锁
查看>>
真有用?Snap和Flatpak 通吃所有发行版的打包方式。
查看>>
Multiload-ng
查看>>
Atitit mac os 版本 新特性 attilax大总结
查看>>
中国金融出版社出版的2016版《公司信贷》
查看>>
只需一点小修改,HTC Vive画面会更清晰锐利
查看>>
页面接口防刷 解决思路一nginx
查看>>