日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

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

發布時間:2025/3/18 C# 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 视频监控系列(13):H264播放器——控制播放和截图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C# 視頻監控系列(13):H264播放器——控制播放和截圖

?

前言

?????本該把這部分和上一篇合成一篇的,無奈掙扎半天,還是想對稱起來,客戶端3篇、服務器端3篇——所有播放器也勉強湊3篇吧(封裝API的文章不算) : )

?

注意

?????本系列文章限于學習交流,注重過程,由于涉及公司,所以不提供源代碼下載,非常抱歉!!但是請大家放心,核心、實現以及其他能夠貼出來的代碼我都會貼出來,并且爭取盡所能的回答留言里的每一個問題,感謝大家關注,歡迎交流 :)

?

系列

?????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播放器——播放錄像文件

?????13.?????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?%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。

?

結束

?????現在在做語音部分,受阻中...
轉載:http://www.cnblogs.com/over140/archive/2009/03/30/1421531.html

總結

以上是生活随笔為你收集整理的C# 视频监控系列(13):H264播放器——控制播放和截图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品人伦一区二区三区蜜桃网站 | 美女露出让男生揉的视频 | 精品久久久久久一区二区里番 | 三级视频在线观看 | 日本女人一区二区三区 | 日韩阿v| 天天操操 | 日本高清视频一区二区三区 | 欧美日韩在线视频免费观看 | 国产免费一区二区三区最新6 | 日韩高清在线播放 | 久久精品美女 | 一区二区成人在线观看 | 午夜免费看视频 | 国产黑丝在线视频 | 亚洲天堂成人av | 黄色国产免费 | 亚洲黄一区| 欧美日韩 一区二区三区 | 成人黄色片免费 | 中文字幕素人 | 大尺度做爰无遮挡露器官 | 男人天堂成人网 | 色综合999 | 丁香婷婷亚洲 | 91大神久久| 成人黄色免费观看 | av小说免费在线观看 | 欧美精品二区三区四区免费看视频 | 日本天天操| 超碰在线网 | 懂色av,蜜臀av粉嫩av | 一区二区免费播放 | 欧美特黄色片 | 国产在线视频导航 | 少妇淫片 | 依人99 | 亚洲丝袜在线视频 | 欢乐谷在线观看免费播放高清 | 国产aa视频 | 日本韩国欧美一区二区 | 图书馆的女友动漫在线观看 | 999久久 | 久久黄色视 | 午夜啪啪福利视频 | 国产成人免费视频网站 | 成人97| av在线亚洲天堂 | 久久久久网| 麻豆精品国产传媒mv男同 | 同性色老头性xxxx老头 | 人妻av一区二区 | 国产精品av在线播放 | 久久久久久久久综合 | 秋霞影院午夜 | 五月婷婷影院 | 第一毛片 | 久久一区二区三区四区 | 亚洲国产精品福利 | xx性欧美肥妇精品久久久久久 | 午夜精品福利在线 | 蜜桃传媒一区二区亚洲 | 亚洲精品xxxxx | 久久久久久久久久久国产 | 少妇人妻偷人精品一区二区 | 国产精品久久久久aaaa | 免费在线观看污网站 | 久久久久久久久久久久97 | 亚洲v日韩v综合v精品v | 午夜国产在线观看 | 爱爱的网站 | 欧美激情在线观看视频 | 国产一级视频 | 色综合久久88色综合天天 | 台湾黄色网址 | 女人张开腿让男人桶爽 | 天天干天天操av | 一级大片黄色 | 国产综合视频在线观看 | 韩国一区二区三区四区 | 久久久久久国产精品无码 | 欧美性猛交久久久久 | 三上悠亚人妻中文字幕在线 | 久久国产综合 | 九色蝌蚪9l视频蝌蚪9l视频 | 色大师av一区二区三区 | 成人免费毛片观看 | 国内老熟妇对白xxxxhd | 日本免费成人 | 91国在线啪 | 亚洲精品中文字幕成人片 | 捆绑少妇玩各种sm调教 | 国产欧美日韩在线视频 | 少妇特殊按摩高潮惨叫无码 | 日韩精品片 | 国产自产21区 | 国产图区 | 色综合久久久无码中文字幕波多 | 亚洲一级片 |