Directshow 获取 设备信息(麦克风,扬声器,摄像头)

Directshow 获取 设备信息(麦克风,扬声器,摄像头),第1张

通过DirectShow Api获取系统麦克风、扬声器、摄像头信息

#include <windowsh>

#include <vector>

#include <dshowh>

#pragma comment(lib, "Strmiidslib")

#define MAX_FRIENDLY_NAME_LENGTH    128

#define MAX_MONIKER_NAME_LENGTH     256

typedef struct _TDeviceName

{

    WCHAR FriendlyName[MAX_FRIENDLY_NAME_LENGTH];   // 设备友好名

    WCHAR MonikerName[MAX_MONIKER_NAME_LENGTH];     // 设备Moniker名

} TDeviceName;

//WCHAR  转换为 Char

char WCharToChar(WCHAR s)

{

 int w_nlen = WideCharToMultiByte(CP_ACP, 0, s, -1, NULL, 0, NULL, false);

 char ret = new char[w_nlen];

 memset(ret, 0, w_nlen);

 WideCharToMultiByte(CP_ACP, 0, s, -1, ret, w_nlen, NULL, false);

return ret;

}

//REFGUID guidValue : CLSID_AudioInputDeviceCategory(麦克风);  CLSID_AudioRendererCategory(扬声器); //CLSID_VideoInputDeviceCategory(摄像头)

HRESULT GetAudioVideoInputDevices(std::vector<TDeviceName> &vectorDevices, REFGUID guidValue)

{

    TDeviceName name;

    HRESULT hr;

    // 初始化

    vectorDevicesclear();

   // 初始化COM

    hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

    if (FAILED(hr))

    {

        return hr;

    }

// 创建系统设备枚举器实例

    ICreateDevEnum pSysDevEnum = NULL;

    hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void )&pSysDevEnum);

    if (FAILED(hr))

    {

        CoUninitialize();

        return hr;

    }

    // 获取设备类枚举器

    IEnumMoniker pEnumCat = NULL;

    hr = pSysDevEnum->CreateClassEnumerator(guidValue, &pEnumCat, 0);

    if (hr == S_OK)

    {

        // 枚举设备名称

        IMoniker pMoniker = NULL;

        ULONG cFetched;

        while (pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)

        {

            IPropertyBag pPropBag;

            hr = pMoniker->BindToStorage(NULL, NULL, IID_IPropertyBag, (void )&pPropBag);

            if (SUCCEEDED(hr))

            {

                // 获取设备友好名

                VARIANT varName;

                VariantInit(&varName);

                hr = pPropBag->Read(L"FriendlyName", &varName, NULL);

                if (SUCCEEDED(hr))

                {

                    StringCchCopy(nameFriendlyName, MAX_FRIENDLY_NAME_LENGTH, varNamebstrVal);

                    // 获取设备Moniker名

                    LPOLESTR pOleDisplayName = reinterpret_cast<LPOLESTR>(CoTaskMemAlloc(MAX_MONIKER_NAME_LENGTH 2));

                    if (pOleDisplayName != NULL)

                    {

                        hr = pMoniker->GetDisplayName(NULL, NULL, &pOleDisplayName);

                        if (SUCCEEDED(hr))

                        {

                            StringCchCopy(nameMonikerName, MAX_MONIKER_NAME_LENGTH, pOleDisplayName);

                            vectorDevicespush_back(name);

                        }

                          CoTaskMemFree(pOleDisplayName);

                    }

                }

                VariantClear(&varName);

                pPropBag->Release();

            }

            pMoniker->Release();

        } // End for While

        pEnumCat->Release();

    }

    pSysDevEnum->Release();

    CoUninitialize();

    return hr;

}

int _tmain(int argc, _TCHAR argv[])

{

    std::vector<TDeviceName> vectorDevices;

    vectorDevicesclear();

//获取摄像头信息

    GetAudioVideoInputDevices(vectorDevices, CLSID_VideoInputDeviceCategory);

    for (auto itor = vectorDevicesbegin(); itor != vectorDevicesend(); ++itor)

    {

        printf("FriendlyName = %s, MonikerName = %s\n", WCharToChar(itor->FriendlyName), WCharToChar(itor->MonikerName));

    }

    vectorDevicesclear();

//获取麦克风设备信息

    GetAudioVideoInputDevices(vectorDevices, CLSID_AudioInputDeviceCategory);

    for (auto itor = vectorDevicesbegin(); itor != vectorDevicesend(); ++itor)

    {

        //wprintf(L"FriendlyName = %ws, MonikerName = %ws\n", itor->FriendlyName, itor->MonikerName);

        printf("FriendlyName = %s, MonikerName = %s\n", WCharToChar(itor->FriendlyName), WCharToChar(itor->MonikerName));

    }

    vectorDevicesclear();

//获取扬声器设备信息

    GetAudioVideoInputDevices(vectorDevices, CLSID_AudioRendererCategory);

    for (auto itor = vectorDevicesbegin(); itor != vectorDevicesend(); ++itor)

    {

        //wprintf(L"FriendlyName = %ws, MonikerName = %ws\n", itor->FriendlyName, itor->MonikerName);

        printf("FriendlyName = %s, MonikerName = %s\n", WCharToChar(itor->FriendlyName), WCharToChar(itor->MonikerName));

    }

    getchar();

    return 0;

}

TIA博途S7-1200学习笔记——数据类型 原创

2021-05-13 14:19:29

11点赞

驽马同学

码龄6年

关注

目录

一、 概述

二、 基本数据类型

1 二进制数

11 BOOL(位)

12 BYTE

13 WORD

14 DWORD

15 LWORD

2 整数

21 SINT

22 USINT

23 INT

24 UINT

25 DINT

26 UDINT

27 LINT

28 ULINT

3 浮点数

31 REAL

32 LREAL

4 字符串

41 字符

411 CHAR(字符)

412 WCHAR(宽字符)

42 字符串

421 STRING

三、复杂数据类型

1 Array(数组)

一、 概述

数据类型组的有效性

数据类型组中定义有数据的属性,例如:内容及有效存储区的表示。

在用户程序中,可使用预定义的数据类型,并将这些数据类型添加到用户自定义数据类型中。此时,可使用以下类别:

基本数据类型(二进制数、整数、浮点数、定时器、DATE、TOD、LTOD、CHAR、WCHAR)

复杂数据类型(DT、LDT、DTL、STRING、WSTRING、ARRAY、STRUCT)

用户自定义数据类型(PLC 数据类型 (UDT))

指针

参数类型

系统数据类型

硬件数据类型

数据类型 位数 字节数

Byte 8 1

Word 16 12

Dwod 32 4

Lwod 64 8

二、 基本数据类型

1 二进制数

11 BOOL(位)

长度: 1位

取值: FALSE 或 TRUE

输入值示例: FALSE、TRUE、BOOL#1、1、2#1、8#1、16#1、

12 BYTE

长度: 8位

取值: 0 ~ 255 或 -128 ~ +127

输入值示例: IB2、MB2、DB1DBB4

13 WORD

长度: 16位

取值: 0 ~ 65535 或 -32768 ~ +32767

输入值示例: MW10、DB1DBW2

14 DWORD

长度: 32位

取值: 0 ~ 4294967295 或 -2147483647 ~ +2147483647

输入值示例: MW10、DB1DBW2

15 LWORD

长度: 64位

取值: 略

输入值示例: 略

2 整数

21 SINT

长度: 8位

取值: -128 ~ +127

输入值示例: +55、SINT#+44

22 USINT

长度: 8位

取值: 0 ~ +255

输入值示例: 55、USINT#66

23 INT

长度: 16位

取值: -32768 ~ +32768

输入值示例: 555、INT#656

24 UINT

长度: 16位

取值: 0 ~ 65535

输入值示例: 6555、UINT#61156

25 DINT

长度: 32位

取值: -2147483648 ~ +3147483647

输入值示例: 126555、DINT#6111156

26 UDINT

长度: 32位

取值: 0 ~ +4294967295

输入值示例: 121216555、UDINT#61111156

27 LINT

长度: 64位

取值: 略

输入值示例: 略

28 ULINT

长度: 64位

取值: 略

输入值示例: 略

3 浮点数

31 REAL

长度: 32位 [31位:符号位;23-30位:指数位;0-22位:尾数位]

取值: 略

输入值示例: 略

处理 REAL 数据类型时会精确到 6 位数。

32 LREAL

长度: 64位 [63位:符号位;52-63位:指数位;0-51位:尾数位]

取值: 略

输入值示例: 略

处理 LREAL 数据类型时会精确到 15 位数。

4 字符串

41 字符

411 CHAR(字符)

长度: 8位

取值: ASCII 字符

输入值示例: ‘A’

412 WCHAR(宽字符)

长度: 16位

取值: ASCII 字符

输入值示例: WCHAR#‘A’

WCHAR 数据类型将扩展字符集中的单个字符保存为 UFT-16 编码形式。

42 字符串

421 STRING

长度:

取值: ASCII 字符串,包括特殊字符

输入值示例: “name”

三、复杂数据类型

1 Array(数组)

string

A type that describes a specialization of the template class basic_string with elements of type char as a string

wstring

A type that describes a specialization of the template class basic_string with elements of type wchar_t as a wstring

int main(){

wstring strTest ( L"中文" );

cout << "size:" << strTestsize() << endl; //输出 2

string strTest2 = "中文";

cout <<strTest2<< "size:" << strTest2size() << endl;//输出 4

return 0;

}

Returns the current number of elements in a string

size_type size( ) const;

std::stringsize() 返回 s 中字符的个数,不是字节数。返回值不包括最后的\0。

————————————————————

window如果使用微软C/C++编译器,则编译器默认打开开关/Zc:wchar_t,默认使用UTF-16编码,即所有Unicode字符都为2个字节,也就是上文中写了L的那种。

如果你改用UTF-8,那么值在0x0080到0x07FF之间的Unicode字符也会转换为2个字节。三个字节的是0X0800以上的Unicode字符。

如果你使用UTF-32,那么每个Unicode字符都是4个字节。

以上就是关于Directshow 获取 设备信息(麦克风,扬声器,摄像头)全部的内容,包括:Directshow 获取 设备信息(麦克风,扬声器,摄像头)、博途中hw开头的数据类型是什么、关于字符串编码,C++语言,计算“abc的”这个字符串的长度,Linux为6,Windows为5。如何让Windows长度也6等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9322388.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存