- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在使用 DirectShow 创建的视频聊天应用程序中使用罗技 C930e 网络摄像头。到目前为止,我能够在 YUY2 或 mJPEG 中使用原始流。不管怎样,我发现网络摄像头通过 UVC 接口(interface)支持硬件 H264 编码。
现在我使用标准方法获取可能的网络摄像头捕获引脚配置,但那里没有 H264 引脚。
void list_cameras {
ICreateDevEnum *pDevEnum = nullptr;
IEnumMoniker *pEnum = nullptr;
// Create the System Device Enumerator.
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, nullptr,
CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,
reinterpret_cast<void**>(&pDevEnum));
if (SUCCEEDED(hr)) {
// Create an enumerator for the video capture category.
hr = pDevEnum->CreateClassEnumerator(
CLSID_VideoInputDeviceCategory,
&pEnum, 0);
if (hr == S_FALSE) {
return;
}
}
IMoniker *pMoniker = nullptr; // IMoniker is the device
int index = 0;
// for each device
while (pEnum->Next(1, &pMoniker, nullptr) == S_OK) {
// bind camera to filter to be able to use it
if (cam.device->BindToObject(nullptr, nullptr, IID_IBaseFilter, reinterpret_cast<void**>(&_pCapture)) != S_OK) {
continue;
}
// fetch the configuration interface
IAMStreamConfig *pConfig = nullptr;
HRESULT hr = _capture->FindInterface(
&PIN_CATEGORY_CAPTURE, // Preview pin.
nullptr, // Any media type.
_pCapture, // Pointer to the capture filter.
IID_IAMStreamConfig, reinterpret_cast<void**>(&pConfig));
if (FAILED(hr)) {
continue;
}
// fetch possible configurations
int iCount = 0, iSize = 0;
if (pConfig->GetNumberOfCapabilities(&iCount, &iSize) != S_OK) {
continue;
}
// store each configuration
AM_MEDIA_TYPE *pmtConfig;
for (int iFormat = 0; iFormat < iCount; iFormat++) {
// get config
VIDEO_STREAM_CONFIG_CAPS scc;
if (pConfig->GetStreamCaps(iFormat, &pmtConfig, reinterpret_cast<BYTE*>(&scc)) != S_OK) {
continue;
}
// copy config data
VIDEOINFOHEADER *pVih = new VIDEOINFOHEADER(); // deleted afterwards
*pVih = *reinterpret_cast<VIDEOINFOHEADER *>(pmtConfig->pbFormat);
AM_MEDIA_TYPE mt;
mt = *pmtConfig;
mt.pbFormat = reinterpret_cast<BYTE *>(pVih);
auto fcc = FOURCCMap(pVih->bmiHeader.biCompression);
// wrap it
CameraConfig config = { mt, pVih->bmiHeader.biWidth, pVih->bmiHeader.biHeight, 1000 / (static_cast<float>(pVih->AvgTimePerFrame) / 10000), fcc };
// if resolution is bad (or unsupported), skip this configuration
if (config.width == 0 || config.height == 0 ) // bad
continue;
cam.configurations.push_back(config);
}
_cameras.push_back(cam);
pConfig->Release();
_pCapture->Release();
}
pEnum->Release();
pDevEnum->Release();
}
_cameras
是Camera的 vector ,定义如下:
typedef struct {
//! Pointer to DirectShow device.
DSDevice device;
//! Camera name
string name;
//! List of supported configurations.
vector<CameraConfig> configurations; // list of all available configurations
//! Index of selected configuration.
int selected;
} Camera;
_pCapture
是指向创建的捕获过滤器的指针。CameraConfig
定义如下:
typedef struct {
//! Media type.
AM_MEDIA_TYPE _mediaType;
//! Output width.
int width;
//! Outpus height.
int height;
//! Output framerate.
float fps;
//! Compression algoritm. YUY2 and mJPEG are supported for now.
FOURCCMap compression;
} CameraConfig;
如何实现对 UVC 设备的支持?硬件编码器的哪些参数可以控制?
谢谢。
最佳答案
我能够在 Windows 8.x 下获得该流的唯一方法是不使用 LOGITECH 驱动程序。这是一个 UVC 1.5 兼容相机,它将由操作系统自动配置。使用该驱动程序(来自 Microsoft),使用引脚 1(而不是 0),您将获得大量 H264 格式。
我认为在 Windows 7 下,Logitech 的一些驱动程序也提供了一些 H264 格式。
如果您使用的是 Windows 8.x,并且您已经安装了 Logitech 驱动程序,则必须将其删除。这很难。我通常通过编写这样的结构(以管理员身份运行)来做到这一点:
BOOL res;
res = SetupUninstallOEMInf(TEXT("oem131.inf"), SUOI_FORCEDELETE, nullptr );
至于要删除什么 inf,这很简单:转到 Windows\Inf 文件夹并搜索 Logitech。然后检查每个文件,看看到底是什么(您可能有鼠标或其他您想要保留的东西)。通常不止一个。
关于c++ - 如何通过 UVC 支持硬件编码 H264,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24675538/
我刚刚意识到二进制编译器会将源代码转换为目标平台的二进制文件。有点明显...但如果编译器以这种方式工作,那么同一个编译器如何用于不同的系统,如 x86、ARM、MIPS 等? 难道他们不应该“知道”硬
在我的 SDL 游戏中,出于游戏玩法和性能原因,我希望保留固定的游戏区域分辨率。 我想做的是有一个小分辨率(例如 320 * 240),并且在调整窗口大小时/切换到全屏模式时让 SDL/显卡缩放每个像
我正在使用这些方法来激活 SurFaceView 上的触摸焦点 private SurfaceView surfaceiew; private CameraSource camSource; priv
您好,当我从硬件菜单更改设备时,我遇到了这个奇怪的问题,但我想我可能遗漏了一些简单的东西。 我的 View Controller 中有这段代码: - (void)touchesBegan:(NSSet
编写一个名为 weird() 的函数,它将三个字符串作为参数并向后打印最长的一个。 (在平局的情况下,应该选择较早的参数字符串。 函数调用: weird("I", "Love", "Python")
您好,我正在尝试设置 hadoop 环境。简而言之,我要解决的问题涉及数十亿个大小为几 MB 的 XML 文件,使用 HIVE 从中提取相关信息,并对这些信息进行一些分析工作。我知道这在 hadoop
我知道 Phidgets,但是,我正在寻找可以与 C# 接口(interface)的一些其他类型的硬件。 谁有好东西? 最佳答案 查看 Netduino .它基于 Arduino,但使用 .Net
说一个函数(例如模乘法、正弦函数)是在硬件而不是软件中实现是什么意思? 最佳答案 在硬件中实现意味着电路(通过逻辑门等)可以执行操作。 例如,在 ALU 中,处理器在物理上能够将一个字节加到另一个字节
我需要编写一个程序,在可能状态的大空间中执行并行搜索,在此过程中发现了新区域(并开始了他们的探索),并且由于在其他地方获得的中间结果消除了可能性,因此提前终止了对某些区域的探索在其中发现新的有用结果。
我们需要通过带有硬件 token 的 EV 代码对 InstallShield 2013 Express 的安装进行签名,但是无法导出私钥证书文件,因此唯一的方法是使用 DigiCertUtil 工具
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 2 年前。 Improve this ques
我考虑从库中丢弃处理大端情况的代码,如果平台不是小端,则在初始化期间简单地抛出一个异常。如果我们限制为,我无法想象会有任何大端硬件 托管任何网站的典型服务器硬件 服务器根据开放计算项目规范 所有常见的
我知道这可以做到,但找不到交换目标调试设备的地方。我现在正在使用模拟器,但想切换到设备,反之亦然。谁能指出我正确的方向? 谢谢。 最佳答案 像这样.. 右键单击 PROJECT--->Run As--
我正在尝试创建一个监听音量键事件的服务。 每当按下音量键时,服务应向号码发送短信,但我无法检测到音量键事件。 最佳答案 您可以使用 OnKeyListener可以检测按键事件(包括音量键)。您可以找到
谁能解释一下中断如何从最低层(硬件)传递到应用程序。 所以在下图中我知道处理器之后发生了什么。 但是我想要从键盘按下到处理器的中断过程在硬件中发生了什么,例如它如何传递扫描代码,中断 Controll
我的任务是构建一个应用程序,其中业务用户将定义一些数据操作和处理规则(例如,取一个数值并将其平均分配给根据中指定的条件选择的多个记录)规则)。 每月必须运行一个批处理应用程序,以便根据定义的规则处理大
所以这是我的愚蠢问题: PGP/GPGP可以用来对文本进行签名,其他的使用公钥来验证。 比方说,非对称密码算法处理空间。 有没有什么算法可以处理时间? 例如在 2011-10-10 10:10:10
使用 nvcc 编译 CUDA 程序是否需要安装支持 CUDA 的显卡(在 Linux 中)?或者可以在任何地方编译程序并且只能在这样的系统上运行? 最佳答案 不,编译不需要显卡。 您甚至不需要一个来
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我有一个奇怪的问题,但我对这个话题很感兴趣。 是否有可能直接访问当前基于 x64 的计算机的硬件,而无需使用某种 HAL(硬件抽象层)或其他操作系统(udev、upower 等)的附属物?我不是在谈论
我是一名优秀的程序员,十分优秀!