• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
工作日志
工作日志
博客园    首页    新随笔    联系   管理    订阅  订阅
C# 视频监控系列(13):H264播放器——控制播放和截图

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

豆豆网   技术应用频道   2009年04月08日  【字号:小 中 大】 收藏本文

被过滤广告
关键字: NetBIOS 向导程序 ActiveX DataReader Lambda表达式

C# 视频监控系列(13):H264播放器——控制播放和截图。

  一、控制播放

  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 %dn",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;    

       //C# 视频监控系列(13):H264播放器——控制播放和截图
    }
}
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(),从当前位置开始正常播放。

posted on 2009-05-11 11:08  滴水藏海映太阳  阅读(847)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3