#include "stdafx.h"
#include "testdirectshow.h"
TestDirectShow::TestDirectShow(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
char sName[256] = { 0 };
//GetAVDeviceByQt();
for (int i = 0;; i++)
{
if (GetVideoDeviceName(i, sName, 256))
{
ui.comboBoxVideo->addItem(sName);
}
else
{
break;
}
}
for (std::map<int ,StuCameraInfo>::iterator it = m_mapCameraInfo.begin();
it != m_mapCameraInfo.end(); it++)
{
if (it->second.listResolution.size() > 1)
{
it->second.listResolution.sort();
}
}
ui.comboBoxVideo->setCurrentIndex(-1);
for (int i = 0;; i++)
{
if (GetAudioDeviceName(i, sName, 256))
{
ui.comboBoxAudio->addItem(QString::fromLocal8Bit(sName));
}
else
{
break;
}
}
}
TestDirectShow::~TestDirectShow()
{
}
void TestDirectShow::on_pushButtonPreview_clicked()
{
}
void TestDirectShow::on_pushButtonCapture_clicked()
{
}
void TestDirectShow::on_pushButtonRecord_clicked()
{
}
void TestDirectShow::GetAVDeviceByQt()
{
QList<QCameraInfo> listVideo = QCameraInfo::availableCameras();
foreach(QCameraInfo camera, listVideo)
{
ui.comboBoxVideo->addItem(camera.description());
}
QList<QAudioDeviceInfo> listAudio = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
foreach(QAudioDeviceInfo audio, listAudio)
{
ui.comboBoxAudio->addItem(audio.deviceName());
}
}
bool TestDirectShow::GetVideoDeviceName(int nCamId, char* sName, int nBufferSize)
{
int count = 0;
bool bRet = false;
::CoInitialize(NULL);
ICreateDevEnum* pCreateDevEnum;//enumrate all video capture devices
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum,
(void**)&pCreateDevEnum);
IEnumMoniker* pEm;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);
if (hr != NOERROR)
{
::CoUninitialize();
return bRet;
}
pEm->Reset();
ULONG cFetched;
IMoniker *pM;
while (hr = pEm->Next(1, &pM, &cFetched), hr == S_OK)
{
if (count == nCamId)
{
IPropertyBag* pBag = NULL;
hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void**)&pBag);
if (SUCCEEDED(hr))
{
VARIANT var;
var.vt = VT_BSTR;
hr = pBag->Read(L"FriendlyName", &var, NULL);//还有其他属性,像描述信息等等
if (hr == NOERROR)
{
//获取设备名称
WideCharToMultiByte(CP_ACP, 0, var.bstrVal, -1, sName, nBufferSize, "", NULL);
StuCameraInfo cameraInfo;
cameraInfo.id = nCamId;
cameraInfo.name = QString::fromLocal8Bit(sName);
m_mapCameraInfo[cameraInfo.id] = cameraInfo;
bRet = true;
GetResolution(nCamId, pM);
SysFreeString(var.bstrVal);
}
pBag->Release();
}
pM->Release();
break;
}
count++;
}
pCreateDevEnum = NULL;
pEm = NULL;
::CoUninitialize();
return bRet;
}
bool TestDirectShow::GetAudioDeviceName(int nCamId, char* sName, int nBufferSize)
{
int count = 0;
bool bRet = false;
::CoInitialize(NULL);
ICreateDevEnum* pCreateDevEnum;//enumrate all video capture devices
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum,
(void**)&pCreateDevEnum);
IEnumMoniker* pEm;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_AudioInputDeviceCategory, &pEm, 0);
if (hr != NOERROR)
{
::CoUninitialize();
return bRet;
}
pEm->Reset();
ULONG cFetched;
IMoniker *pM;
while (hr = pEm->Next(1, &pM, &cFetched), hr == S_OK)
{
if (count == nCamId)
{
IPropertyBag* pBag = NULL;
hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void**)&pBag);
if (SUCCEEDED(hr))
{
VARIANT var;
var.vt = VT_BSTR;
hr = pBag->Read(L"FriendlyName", &var, NULL);//还有其他属性,像描述信息等等
if (hr == NOERROR)
{
//获取设备名称
WideCharToMultiByte(CP_ACP, 0, var.bstrVal, -1, sName, nBufferSize, "", NULL);
SysFreeString(var.bstrVal);
}
pBag->Release();
}
pM->Release();
bRet = true;
break;
}
count++;
}
pCreateDevEnum = NULL;
pEm = NULL;
::CoUninitialize();
return bRet;
}
void TestDirectShow::GetResolution(int cameraId, IMoniker* pMoniker)
{
USES_CONVERSION;
HRESULT hr = NULL;
IBaseFilter *pFilter;
hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter);
if (!pFilter)
{
return ;
}
IEnumPins * pinEnum = NULL;
IPin * pin = NULL;
if (FAILED(pFilter->EnumPins(&pinEnum)))
{
pinEnum->Release();
return ;
}
pinEnum->Reset();
ULONG pinFetched = 0;
while (SUCCEEDED(pinEnum->Next(1, &pin, &pinFetched)) && pinFetched)
{
if (!pin)
{
continue;
}
PIN_INFO pinInfo;
if (FAILED(pin->QueryPinInfo(&pinInfo)))
{
continue;
}
if (pinInfo.dir != PINDIR_OUTPUT)
{
continue;
}
IEnumMediaTypes *mtEnum = NULL;
AM_MEDIA_TYPE *mt = NULL;
if (FAILED(pin->EnumMediaTypes(&mtEnum)))
{
break;
}
mtEnum->Reset();
ULONG mtFetched = 0;
while (SUCCEEDED(mtEnum->Next(1, &mt, &mtFetched)) && mtFetched)
{
BITMAPINFOHEADER* bmi = NULL;
int avgTime;
if (mt->formattype == FORMAT_VideoInfo)
{
if (mt->cbFormat >= sizeof(VIDEOINFOHEADER))
{
VIDEOINFOHEADER *pVih = reinterpret_cast<VIDEOINFOHEADER*>(mt->pbFormat);
bmi = &(pVih->bmiHeader);
avgTime = pVih->AvgTimePerFrame;
}
}
else if (mt->formattype == FORMAT_VideoInfo2)
{
if (mt->cbFormat >= sizeof(VIDEOINFOHEADER2))
{
VIDEOINFOHEADER2* pVih = reinterpret_cast<VIDEOINFOHEADER2*>(mt->pbFormat);
bmi = &(pVih->bmiHeader);
avgTime = pVih->AvgTimePerFrame;
}
}
if (bmi)
{
if (m_mapCameraInfo.find(cameraId) != m_mapCameraInfo.end())
{
bool bAdd = true;
StuResolution stuResolution;
stuResolution.width = bmi->biWidth;
stuResolution.height = bmi->biHeight;
for (std::list<StuResolution>::iterator it = m_mapCameraInfo[cameraId].listResolution.begin();
it != m_mapCameraInfo[cameraId].listResolution.end(); it++)
{
if (it->width == stuResolution.width && it->height == stuResolution.height)
{
bAdd = false;
break;
}
没有合适的资源?快使用搜索试试~ 我知道了~
QT+vs+directshow获取摄像头名称及其支持的分辨率
共15个文件
cpp:3个
lib:2个
suo:2个
3星 · 超过75%的资源 需积分: 32 155 下载量 18 浏览量
2018-06-20
15:55:40
上传
评论 1
收藏 1.05MB RAR 举报
温馨提示
QT5.7.0 + visual studio 2013 + directshow9 获取摄像头名称及其支持的分辨率
资源推荐
资源详情
资源评论
收起资源包目录
testDerectShow.rar (15个子文件)
testDerectShow
testDerectShow
testdirectshow.h 2KB
Resources
stdafx.h 22B
testDerectShow.vcxproj.filters 3KB
stdafx.cpp 21B
testderectshow.qrc 74B
testdirectshow.ui 5KB
main.cpp 220B
testDerectShow.vcxproj.user 813B
testdirectshow.cpp 9KB
testDerectShow.vcxproj 11KB
testDirectShow.sln 988B
lib
directshow
strmbasd.lib 4.88MB
strmbase.lib 3.44MB
testDirectShow.v12.suo 30KB
testDirectShow.suo 11KB
共 15 条
- 1
资源评论
- 画世界的毕加索2019-07-17还不错,谢谢楼主分享
- hezhenguofei2019-04-15好好学习一下
- 冷木言2019-02-28这里面也没有用到dshow啊coder-HRQ2019-02-28void TestDirectShow::GetResolution(int cameraId, IMoniker* pMoniker)这个函数是使用dshow获取对应摄像头分辨率,自己认真看看吧
- AmazingBean2018-12-10哪里有获取分辨率的代码.........coder-HRQ2019-02-28void TestDirectShow::GetResolution(int cameraId, IMoniker* pMoniker)这个函数是使用dshow获取对应摄像头分辨率,自己认真看看吧
coder-HRQ
- 粉丝: 28
- 资源: 18
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功