qt+directshow usb摄像头及音频设备录制视频

最近来了个项目,有一块功能是usb摄像头录制视频并且录音的实现,网上的东西七七八八什么技术都有,先用opencv打了半天环境不能录音频,后来用ffmpeg,原谅我太菜,视频编码和格式让人头疼,不懂怎么移植到自己的程序中,后来用的directshow,希望大家少走些弯路。


#include "PreviewController.h"


std::string TCHAR2STRING(const TCHAR *STR)
{
int iLen = WideCharToMultiByte(CP_ACP, 0,STR, -1, NULL, 0, NULL, NULL);
char* chRtn =new char[iLen*sizeof(char)];
WideCharToMultiByte(CP_ACP, 0, STR, -1, chRtn, iLen, NULL, NULL);
std::string str(chRtn);
return str;
}


PreviewController::~PreviewController()
{
IVideoWindowPtr pVW = m_pSourceGraph;
if (pVW != NULL)
{
pVW->put_Visible(OAFALSE);
pVW->put_Owner(NULL);
}
StopCapture();
m_pCaptureGraph = NULL;
IMediaControlPtr pMC = m_pSourceGraph;
if (pMC != NULL)
{
pMC->Stop();
pMC = NULL;
}
m_pSourceGraph = NULL;
}


HRESULT 
PreviewController::SelectDevice(const TCHAR* pVideo, const TCHAR* pAudio, HWND hwnd, RECT* prc)
{
// create a new device
m_pSourceGraph = NULL;
m_pBridge = NULL;
m_pCapOutput = NULL;


HRESULT hr = m_pBridge.CreateInstance(__uuidof(GMFBridgeController));


if (FAILED(hr))
{
return hr;
}


// init to video-only, in discard mode (ie when source graph
// is running but not connected, buffers are discarded at the bridge)
hr = m_pBridge->AddStream(true, eMuxInputs, true);


m_bAudio = false;
_bstr_t strAudio = pAudio;
IBaseFilterPtr pfAudio;
if (SUCCEEDED(hr) && (strAudio.length() > 0))
{
m_bAudio = true;
hr = m_pBridge->AddStream(false, eMuxInputs, true);
if (SUCCEEDED(hr))
{
hr = LocateFilter(pAudio, CLSID_AudioInputDeviceCategory, &pfAudio);
}
}


if (FAILED(hr))
{
return hr;
}


// locate the requested filter
IBaseFilterPtr pfDevice;
hr = LocateFilter(pVideo, CLSID_VideoInputDeviceCategory, &pfDevice);
if (FAILED(hr))
{
return hr;
}


// create source graph and add sink filter
hr = m_pSourceGraph.CreateInstance(CLSID_FilterGraph);
if (FAILED(hr))
{
return hr;
}
_bstr_t strName = pVideo;
m_pSourceGraph->AddFilter(pfDevice, strName);


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值