程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 視頻采集

視頻采集

編輯:關於VC++

前一段時間寫的“實時語音通信”,朋友們給了我很大鼓勵,甚感欣慰!但是就那個程序,現在讓我困苦不堪。在這裡懇請高手幫助解決這些問題:

1、回放問題,仍然沒有實現的雙緩沖播放。播放兩個聲音塊的效果就像火車經過兩節鐵軌的接點,不連續,有雜音。這簡直讓人無法忍受!為了弱化這個問題,不得不增大INP_BUFFER_SIZE值,以減少“接點”個數。於是第二個問題就來了。

2、延時問題,那個程序的延時達到秒級,當時考慮了網絡壅塞以及節省內存的情況多次使用了內存申請、釋放、內存拷貝函數再加那個巨大的緩沖區,難怪有這麼大的延時。在網絡品質很好的局域網裡,這更讓人不可接受!

許多朋友希望我能介紹一下視頻的編程,時下視頻聊天幾乎成了網吧老板們制勝的法寶,自己的軟件嵌入視頻通信方式又顯得那麼酷,而一個攝像頭只需要百來塊錢。本軟件功能上可以實現視頻采集、預覽,選擇壓縮器(視頻文件可是大得驚人!)進行壓縮、解壓,回放。抓取單幀圖片保存等。

簡單介紹一下程序吧,在 OnInitDialog() 裡面:

InitCaptureFormat()初始化BITMAP m_InInfo,設置視頻采集數據的格式。

接著,觸發OnDisplay().裝載動態鏈接庫VideoDll.dll,如果成功則初始化COMPVARS m_CV這個變量,設置壓縮器,可以手動設置也可以調用系統對話框。

在 VideoDll.dll 中根據壓縮器初始化解壓器COMPVARS m_2CV,InitVideoCard()調用了系列cap...()函數,

詳情請參考MSDN或與我聯系([email protected][email protected])索取更進一步代碼。

void CVideoPlayBackDlg::InitVideoCard()
{
  if(!capDriverConnect(m_hWndCapture,0))//連接設備驅動程序
    AfxMessageBox("Driver Connect Failure");
  //set the video format
  if(!capSetVideoFormat(m_hWndCapture,&m_InInfo,sizeof(BITMAPINFO)))
    AfxMessageBox("Fail to set the video format");//如果驅動不支持此格式將返回0
  capPreviewRate(m_hWndCapture,24);//預覽桢速
  capPreview(this->m_hWndCapture,TRUE);//可以預覽
  if(!capSetCallbackOnFrame(this->m_hWndCapture,FrameCallBack))//設置單桢的回調函數
    AfxMessageBox("fail to setCallbackOnFrame function");
}

值得一提的是那個回調函數 FrameCallBack(),它對采集到的數據(單幅圖片)進行處理。為了方便理解,我把壓縮ICSeqCompressFrame()、解壓ICDecompress()、窗口刷新InvalidateRect()三個函數全寫在這裡而省略了網絡發送部分,實際運用當中通過Socket把Buf裡面的數據發送出去即可,讀者可以輕松完成,您當然也可以參考我在“實時語音通信”中介紹的網絡傳送機制。當然如果您很厲害,還可以運用各種算法對數據進行運算,實現一些號稱“智能”的效果。運行結束後別忘了釋放資源,就OK了

結束語

如果想實現實時的語音、視頻通信,而且語音視頻要同步;如果想保存成avi動畫,還得啃那些cap打頭的函數們。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved