用directshow寫了一個采集本地音視頻數據的庫AVCap. 獲取音視頻采集設備, 指定設備並開始采集后, 給上層應用返回采集的音視頻數據.
接下來的工作有兩個:
1. 添加一個預覽采集到的視頻的接口, AVCap是不涉及界面的東西的, 所以不需要MFC的支持, 也不需要用到windows界面相關的API, windows消息機制等, 暫時的想法是上層給它一個句柄就能預覽視頻了.
2. 對音視頻進行網絡傳輸前的編碼工作, 暫時還沒有定下格式.
下面簡單說一下dshow采集音視頻的步驟.大部分內容在dshow SDK幫助文檔中Audio Capture, Video Capture兩大章節中都有, 只是我按幫助文檔中的步驟最后使用ISampleGrabber時沒能成功. 只能再次求助SDK中的例子拉. 我的核心代碼大部分來自於samples中editing下stillcap這個示例, 實際上你也完全可以通過學習stillcap示例了解采集過程而跳過下面的內容.
1. 初始化(或者說建立對象? COM的知識懂的不多)IGraphBuilder, ICaptureGraphBuilder2
2. 獲取音視頻采集設備
3. 獲取音視頻采集filter
4. 初始化ISampleGrabber, 由於stillcap只采集視頻, 這里說下音頻的格式.
AM_MEDIA_TYPE mt; mt.majortype = MEDIATYPE_Audio;//MEDIATYPE_Video mt.subtype = MEDIASUBTYPE_PCM;//MEDIASUBTYPE_RGB24 mt.formattype = FORMAT_WaveFormatEx;//視頻采集時沒設置這一項 hr = pGrabber->SetMediaType(&mt);
5. 使用PIN_CATEGORY_PREVIEW鏈接capture filter -> grab filter -> null filter.
6. 設置ISampleGrabber的回調
7. IMediaControl run().
PS:封裝完AVCap后, 如果暫時不考慮觀看視頻, dshow應該就告一段落了, oyeah!