前一段時間寫的“實時語音通信”,朋友們給了我很大鼓勵,甚感欣慰!但是就那個程序,現在讓我困苦不堪。在這裡懇請高手幫助解決這些問題:
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打頭的函數們。
本文配套源碼