博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 视频监控系列(13):H264播放器——控制播放和截图
阅读量:5942 次
发布时间:2019-06-19

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

正文

     一、控制播放

          1.1     暂停/播放/停止

               VC++ Code:

//
//
//
Funtion:Play or change the play speed to normal;
//
/
void CPlayerDlg::OnPlay() 
{
    
//
 TODO: Add your control notification handler code here
    Play();
}
void CPlayerDlg::Play()
{
    m_nSpeed=
0
;
    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);
        
    }
    
if
(m_bPlaying)
        SetPlayState();
    
else
    {
        CString csError;
        csError.Format(
"
Play the file faild.(%d)
"
,Hik_PlayM4_GetLastError(PORT));
        AfxMessageBox(csError);
    }
    
}
//
//
Funtion:pause.
//
void CPlayerDlg::OnPause() 
{
    
//
 TODO: Add your control notification handler code here
    
if
(m_bPlaying)
    {
        m_bPause=!m_bPause;
        Pause(m_bPause);
    }
}
void CPlayerDlg::Pause(BOOL bPause)
{
    
if
(m_bPaused == bPause)
        return;
    m_bPaused=bPause;
    Hik_PlayM4_Pause(PORT,bPause);
    TRACE(
"
PAUSE %d\n
"
,m_bPaused);
}
///
//
//
Function: Stop
///
//
void CPlayerDlg::OnStop() 
{
    
//
 TODO: Add your control notification handler code here
    
    
if
(m_bPlaying)
    {
        Stop();
    }
    
if
(m_bConvert)
    {
       
if
(outFile!=NULL)
          closeWriffFiles();    
       
if
(yuvBuf!=NULL)
       {
           free(yuvBuf);
           yuvBuf=NULL;
       }
       m_bConvert=
0
;    
       
//
    }
}
void CPlayerDlg::Stop()
{
    CButton *pButton;
    
if
(!m_bPlaying)
        return;
    KillTimer(PLAY_TIMER);
    
if
(Hik_PlayM4_StopSound())
    {
        m_bSound=FALSE;
        pButton = (CButton *)GetDlgItem(IDC_SOUND);
        pButton
->
SetIcon(m_hSoundStopIcon);
    }
    
//
continue before stop.Add by lgl at 9-19;
    m_bPause=FALSE;
    
    
//
stop
    m_bPlaying = !Hik_PlayM4_Stop(PORT);
    
if
(!m_bPlaying)    
    {
        SetStopState();
        
if
(m_bStreamType)
            ResetEvent(m_hEventInput);
    }
    
}

               C#     Code:

        
//
是否暂停
        
private
 
bool
 isPause;
        
///
 
<summary>
        
///
 播放
        
///
 
</summary>
        
///
 
<param name="sender"></param>
        
///
 
<param name="e"></param>
        
private
 
void
 btnPlay_Click(
object
 sender, EventArgs e)
        {
            
if
 (
!
string
.IsNullOrEmpty(m_strPlayFileName))
            {
                
//
是否暂停->播放
                
if
 (isPause)
                {
                    HikPlayer.Hik_PlayM4_Pause(PORT, 
false
);
                    isPause 
=
 
false
;
                }
                
else
                    OpenFile();
            }
        }
        
///
 
<summary>
        
///
 暂停
        
///
 
</summary>
        
///
 
<param name="sender"></param>
        
///
 
<param name="e"></param>
        
private
 
void
 btnPause_Click(
object
 sender, EventArgs e)
        {
            HikPlayer.Hik_PlayM4_Pause(PORT, 
true
);
            isPause 
=
 
true
;
        }
        
///
 
<summary>
        
///
 停止
        
///
 
</summary>
        
///
 
<param name="sender"></param>
        
///
 
<param name="e"></param>
        
private
 
void
 btnStop_Click(
object
 sender, EventArgs e)
        {
            HikPlayer.Hik_PlayM4_Stop(PORT);
            HikPlayer.Hik_PlayM4_CloseFile(PORT);
            HikPlayer.Hik_PlayM4_RealeseDDraw();
            pVideo.Invalidate(
true
);
        }

               代码说明:

                    1.     关于变量PORT、m_strPlayFileName和方法OpenFile可以看文章的代码。

                    2.     注意Hik_PlayM4_Pause的第二个参数用法。

          1.2     快进/慢进

               VC++ Code:

//
//
Funtion: Fast
//
void
 CPlayerDlg::OnFastForward() 
{
    
//
 TODO: Add your control notification handler code here
    
//
Throw B-Frame ,improve the performance;
    
    
if
(Hik_PlayM4_Fast(PORT))
    {
        m_nSpeed
++
;
        
if
(m_nSpeed
>
0
)
            OnThrow2();
        SetFastForwardState();        
    }    
}
//
//
Funtion: Slow;
//
void
 CPlayerDlg::OnFastBackward() 
{
    
//
 TODO: Add your control notification handler code here
    
if
(Hik_PlayM4_Slow(PORT))
    {
        m_nSpeed
--
;
        
if
(m_nSpeed
<=
0
)
            OnThrow0();
        SetFastBackWardState();
    }
}

                C#     Code:

        
int
 m_nSpeed;
        
///
 
<summary>
        
///
 快进
        
///
 
</summary>
        
///
 
<param name="sender"></param>
        
///
 
<param name="e"></param>
        
private
 
void
 btnFastForward_Click(
object
 sender, EventArgs e)
        {
            
if
 (HikPlayer.Hik_PlayM4_Fast(PORT))
            {
                m_nSpeed
++
;
                
if
 (m_nSpeed 
>
 
0
)
                    OnThrow2();
            }
        }
        
///
 
<summary>
        
///
 慢放
        
///
 
</summary>
        
///
 
<param name="sender"></param>
        
///
 
<param name="e"></param>
        
private
 
void
 btnFastBackward_Click(
object
 sender, EventArgs e)
        {
            
//
慢速播放
            
if
 (HikPlayer.Hik_PlayM4_Slow(PORT))
            {
                
//
timer1.Interval
                m_nSpeed
--
;
                
if
 (m_nSpeed 
<=
 
0
)
                    OnThrow0();
            }
        }
        
public
 
void
 OnThrow0()
        {
            HikPlayer.Hik_PlayM4_ThrowBFrameNum(PORT, 
0
);
        }
        
public
 
void
 OnThrow2()
        {
            HikPlayer.Hik_PlayM4_ThrowBFrameNum(PORT, 
2
);
        }

               代码说明:

                    1.     注意关于这两个函数API的说明:

                         Hik_PlayM4_Fast:快速播放,每次调用将使当前播放速度加快一倍,最多调用4次;要恢复正常播放调用

 现在在做语音部分,受阻中...

 

Hik_PlayM4_Play(),从当前位置开始正常播放。

                         Hik_PlayM4_Slow:慢速播放,每次调用将使当前播放速度慢一倍;最多调用4次;要恢复正常播放调用Hik_PlayM4_Play。

          1.3     开始/末尾

               VC++ Code:

//
/
//
Funtion:Locate to the file head.
//
void
 CPlayerDlg::OnGotoStart() 
{
    
//
 TODO: Add your control notification handler code here
    
if
(m_bFileRefCreated)
        Hik_PlayM4_SetCurrentFrameNum(PORT,
0
);
    
else
        Hik_PlayM4_SetPlayPos(PORT,
0
);
}
//
/
//
Funtion:Locate to the end.
//
void
 CPlayerDlg::OnGotoEnd() 
{
    
//
 TODO: Add your control notification handler code here
    
if
(m_bFileRefCreated)
    {
        
//
Note: May create many WM_FILE_END message. The best way is to synchronize the option;
        
        
int
 nEndFrame
=
m_nTotalFrames;
        
while
(
!
Hik_PlayM4_SetCurrentFrameNum(PORT,nEndFrame
--
))
        {
            
//
TRACE("FrameNum is :%d\n",nEndFrame);
            
if
(nEndFrame
==
0
)
                
break
;
        }
    }
    
else
        Hik_PlayM4_SetPlayPos(PORT,
1
);
}

               C#     Code:

        
///
 
<summary>
        
///
 开始位置
        
///
 
</summary>
        
///
 
<param name="sender"></param>
        
///
 
<param name="e"></param>
        
private
 
void
 btnGotoStart_Click(
object
 sender, EventArgs e)
        {
            HikPlayer.Hik_PlayM4_SetPlayPos(PORT, 
0
);
        }
        
///
 
<summary>
        
///
 末尾位置
        
///
 
</summary>
        
///
 
<param name="sender"></param>
        
///
 
<param name="e"></param>
        
private
 
void
 btnGotoEnd_Click(
object
 sender, EventArgs e)
        {
            HikPlayer.Hik_PlayM4_SetPlayPos(PORT, 
1
);
        }

           代码说明:

               1.     注意Hik_PlayM4_SetPlayPos的第二个参数取值范围是0-1之间,即可以理解0是开始位置,1是结束位置;但是有一点比较奇怪,每次都会延迟3秒,即到末尾后还播放3秒钟!

     二、截图

               VC++ Code:

//
//
Function:The call back funtion for capture image!
///
//
void
 CALLBACK DisplayCBFun(
long
 nPort,\
                           
char
 
*
 pBuf,
long
 nSize,\
                           
long
 nWidth,
long
 nHeight,\
                           
long
 nStamp,
long
 nType,
long
 nReceaved)
{
    
if
(
!
g_bCapPic)
        
return
;
    CString csFile;
    csFile.Format(
"
capture%02d.bmp
"
,pic);
    
/*
    switch(nType)
    {
    case T_UYVY:
    csFile="uyvy.bmp";
    break;
    case T_YV12:
    csFile="yv12.bmp";
    break;
    case T_RGB32:
    csFile="rgb.bmp";
    break;
    default: 
    return ;
}
*/
    
//
Note:this funtion is slow,so if you want to save as a .bmp file,don't call! 
    
if
(
!
Hik_PLayM4_ConvertToBmpFile(pBuf,nSize,nWidth,nHeight,nType,csFile.GetBuffer(csFile.GetLength())))
    {
        CString csErr;
        csErr.Format(
"
Convert to bmp faild(%d).
"
,Hik_PlayM4_GetLastError(nPort));
        AfxMessageBox(csErr);
    }
    pic
++
;
    g_bCapPic
=
FALSE;
    
}

               C#     Code:

        DisplayCBFun DisCB;
        
///
 
<summary>
        
///
 截图
        
///
 
</summary>
        
///
 
<param name="sender"></param>
        
///
 
<param name="e"></param>
        
private
 
void
 btnCapImage_Click(
object
 sender, EventArgs e)
        {
            DisCB 
=
 
new
 DisplayCBFun(DisplayCBFun);
            HikPlayer.Hik_PlayM4_SetDisplayCallBack(PORT, DisCB);
        }
        
///
 
<summary>
        
///
 截图回调函数
        
///
 
</summary>
        
///
 
<param name="nPort"></param>
        
///
 
<param name="pBuf"></param>
        
///
 
<param name="nSize"></param>
        
///
 
<param name="nWidth"></param>
        
///
 
<param name="nHeight"></param>
        
///
 
<param name="nStamp"></param>
        
///
 
<param name="nType"></param>
        
///
 
<param name="nReceaved"></param>
        
public
 
void
 DisplayCBFun(
int
 nPort, IntPtr pBuf, 
int
 nSize, 
int
 nWidth, 
int
 nHeight, 
int
 nStamp, 
int
 nType, 
int
 nReceaved)
        {
            
if
 (HikPlayer.Hik_PLayM4_ConvertToBmpFile(pBuf, nSize, nWidth, nHeight, nType, 
string
.Format(
"
C:\\capture{0}.bmp
"
, nPort)))
            {
                MessageBox.Show(
"
转换bmp失败!
"
);
            }
            
//
停止回调
            HikPlayer.Hik_PlayM4_SetDisplayCallBack(PORT, 
null
);
        }

          代码说明:

               1.     这里和源代码有点出入,他用的是g_bCapPic变量来控制是否捕获图片,我用的是设置委托实例和null来达到。API说明:设置抓图回调函数;注意要尽快返回,如果要停止回调,可以把回调函数指针DisplayCBFun设为NULL。

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

你可能感兴趣的文章
XILINX_zynq_详解(6)
查看>>
计算机网络术语总结4
查看>>
新手小白 python之路 Day3 (string 常用方法)
查看>>
soapUI的简单使用(webservice接口功能测试)
查看>>
框架 Hibernate
查看>>
python-while循环
查看>>
手机端上传图片及java后台接收和ajaxForm提交
查看>>
【MSDN 目录】C#编程指南、C#教程、ASP.NET参考、ASP.NET 4、.NET Framework类库
查看>>
jquery 怎么触发select的change事件
查看>>
angularjs指令(二)
查看>>
(原創) 如何建立一个thread? (OS) (Linux) (C/C++) (C)
查看>>
<气场>读书笔记
查看>>
领域驱动设计,构建简单的新闻系统,20分钟够吗?
查看>>
web安全问题分析与防御总结
查看>>
React 组件通信之 React context
查看>>
ZooKeeper 可视化监控 zkui
查看>>
Linux下通过配置Crontab实现进程守护
查看>>
ios 打包上传Appstore 时报的错误 90101 90149
查看>>
Oracle推出轻量级Java微服务框架Helidon
查看>>
密码概述
查看>>