我被一个相当糟糕的网络摄像头困在家里。我正在考虑升级,但后来让我震惊:现在的手机内置了非常好的摄像头。那么为什么不将其用作网络摄像头呢?
然而,当我进一步研究这个时,我对可用的应用程序感到非常失望。据我所知,我们有大致如下工作的 Android 应用程序:
将手机摄像头作为网络连接摄像头呈现。然后您可以使用本地软件将该提要用作网络摄像头。参见例如IP 网络摄像头。这可能就足够了,但这是一个复杂的设置,而且网络延迟使其远非理想。
Android 应用程序将摄像头馈送发送到自定义主机应用程序,该应用程序又会创建一个虚拟网络摄像头。参见例如DroidCam。这基本上解决了延迟问题,但还是比较复杂,而且需要我们安装特定的第三方应用程序,在用户隐私方面很麻烦。特别是因为应用程序是闭源的。
所以,我采用了工程方法,并试图看看是否有可能改善这种情况。据我所知,Android 支持用作自定义 USB配件。查看 USB 视频类文档,我觉得应该可以创建一个 Android 应用程序,将手机显示为通用 UVC 网络摄像头,这样我们就不必求助于上述技巧。
理想情况下,除了调试模式、文件传输等之外,我希望 Android 添加另一个 USB 设备选项(“使用 USB 连接作为网络摄像头”)。然而,这在短期内似乎不太可能发生。
所以,我的问题是:是否已经存在具有上述功能的应用程序?到目前为止,我的搜索没有产生任何结果,但我可能会遗漏一些东西,因为谷歌搜索结果比我预期的要难一些。
或者,我上面的假设是否错误,以至于存在一些基本问题,为什么不能使 Android 应用程序以这种方式工作?
我正在开发一个程序来处理Ubuntu上USB摄像机的帧。目前,我在python中使用OpenCV。当我尝试使用cv2.VideoCapture
对象读取框架时,只会得到部分框架。
我使用的相机是Kayeton GS1M2812 USB相机,据称它符合UVC。大多数应用程序(例如奶酪)在可用的网络摄像头中列出了相机,但不显示任何帧。另一方面,Google Hangouts可以毫无问题地显示来自摄像机的实时帧。
我还可以使用成功捕获图像和视频streamer
。例如:
streamer -c /dev/video1 -o capture.jpg
Run Code Online (Sandbox Code Playgroud)
最初,当我尝试使用时cv.VideoCapture
,我选择了超时并且没有图像。经过一番研究,我发现重新启动uvcvideo模块可以nodrop=1
使我至少从opencv获得部分帧(如上面链接的部分)。
我试图将uvcvideo超时参数设置为一个荒谬的大值,并弄乱了所有其他参数和各种怪癖,但无济于事。
我确实发现,在每次调用之前将分辨率(cv.CAP_PROP_FRAME_WIDTH
和cv.CAP_PROP_FRAME_HEIGHT
)更改为320x240或更小会read()
导致捕获整个帧,但是任何更大的分辨率都不会。
我也尝试过使用更改各种参数v4l2-ctl
,但这也不起作用。
我该怎么做才能解决此问题?
这是我的python代码:
streamer -c /dev/video1 -o capture.jpg
Run Code Online (Sandbox Code Playgroud)
当我使用笔记本电脑的内置网络摄像头(通常是/dev/video0
)时,此代码可以正常工作,但在使用USB摄像头时,该代码会显示局部帧。
我在Ubuntu 16.04上使用python 2.7.12和opencv 3.3.1
我想使用 USB 摄像头 (uvc) 和 Android Studio (Windows)。我在使用 USB 摄像头库“libuvcamera”时遇到问题。我想知道如何解决问题或任何其他方式在我的应用程序中获取 USB 摄像头的视图。让我更好地解释一下\xc2\xb4s 发生了什么:
\n\n我使用 CameraFi 应用程序测试了 USB 摄像头(https://www.camerafi.com/apps/)测试了 USB 摄像头,USB 摄像头被 Android 系统识别(并且工作正常)。
\n\n在 Android Studio 中搜索使用 uvc (usb) 摄像头后,我发现我可以使用这个库: https: //github.com/saki4510t/UVCCamera。
\n\n下载此库+示例后,我尝试使用 Android Studio 打开(只需打开 builg.gradle),代码看起来不错,但当我尝试运行 usbCameraTest0 (或任何其他示例)时,构建失败(我附加构建输出) :
\n\n失败:构建失败并出现异常。
\n\n出了什么问题:\n任务 \':libuvcamera:ndkBuild\' 执行失败。
\n\n\n启动进程\'命令\'null/ndk-build.cmd\'\'时出现问题
\n
尝试:\n使用 --stacktrace 选项运行以获取堆栈跟踪。使用 --info 或 --debug 选项运行以获得更多日志输出。使用 --scan 运行以获得完整的见解。
\n\n在https://help.gradle.org获取更多帮助
2 秒内构建失败\n14 个可操作任务:7 个已执行,7 个是最新的
\n\n=> …
使 Linux 设备 (Raspberry Pi) 表现得像另一台计算机的 UVC 设备需要什么?本质上,我想使用 ffmpeg 的输出来表现得像另一台计算机的网络摄像头输入。
我正在编写一个Media Foundation应用程序,以从60Hz的UVC摄像机获取并显示1920x1080 YUV2图像。
我的问题是ReadSample()回调仅以非常低的速率(大约1 FPS)被不稳定地调用,只有几帧的突发。
这发生在两台笔记本电脑上,但是到目前为止我还没有尝试过使用台式机。我正在运行Windows 10,并且我在其上进行测试的所有计算机都是最新的。
但是,我注意到,如果我让CPU忙于我的应用程序,则回调将按预期以60Hz进行调用。
编辑
注意:当CPU由于反病毒启动而繁忙时,回调率也会提高。虽然没有达到完整的60Hz。
因此,如果我将消息循环从以下位置更改:
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Run Code Online (Sandbox Code Playgroud)
至:
while (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
Run Code Online (Sandbox Code Playgroud)
然后FPS回到60Hz;但当然CPU使用率接近100%...
同上,使用第一个消息循环将鼠标移到窗口上方会使FPS增加一点(〜10FPS)。
将摄像机的帧速率降低到30Hz会导致ReadSample()回调以应有的30Hz发生。
我已经从Microsoft提供的示例(“ Windows经典示例”)中复制了MFCaptureD3D示例的相同问题。
注意,我对示例进行了一些修改,以测量ReadSample()回调中的帧速率。
在我的笔记本电脑上,该示例的大小约为25FPS(因此丢掉了很多帧)。这是因为色彩空间转换是基于CPU的并且效率很低(一个内核的75%)。但是,它仍然管理25PFS!
注释掉转换(没有其他代码更改),导致帧速率下降到几乎为零!... CPU使用率为0%。因此,回调不会发生。
在两个应用程序中,COM库都在应用程序的主线程中初始化(运行窗口的消息循环),如下所示:
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
Run Code Online (Sandbox Code Playgroud)
为了方便起见,我从Microsoft的示例复制了ReadSample()回调:
HRESULT CPreview::OnReadSample(HRESULT hrStatus, DWORD /* dwStreamIndex */, DWORD /* dwStreamFlags */, LONGLONG /* llTimestamp */, IMFSample *pSample)
{
HRESULT hr = S_OK;
IMFMediaBuffer *pBuffer = NULL;
EnterCriticalSection(&m_critsec);
if (FAILED(hrStatus))
hr = hrStatus; …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将 raspberry pi 板设置为管道设备,它可以从相机或任何其他来源接收视频并将其通过管道传输到主机。我正在关注这里提到的教程
https://gist.github.com/justinschuldt/36469e2a89d95ef158a8c4df091e9cb4
我能够成功地将网络摄像头视频流式传输到主机 PC。我想要做的是使用视频文件而不是来自网络摄像头的流。为了做到这一点,我做了如下
我的设置看起来像这样
现在,当我尝试将视频文件流式传输到 /dev/video2 时,我只在主机 pc 上看到彩色条纹,错误没有找到 jpeg 数据
在主机 PC 上
错误
如果我使用 g_webcam 而不是 configFS 创建小工具,我会得到几乎相似的行为。
将不胜感激任何帮助。我假设编码存在一些问题。
几天来,我一直在努力在 Windows 上编译一个修改过的 libuvc 版本,现在我终于完成了,我似乎无法在 Python 上加载它。我已经在 Linux 机器上使用相同版本的 Python 编译并成功导入的这个库根本不喜欢 w10。
系统
问题
当尝试
import ctypes
import ctypes.util
name = ctypes.util.find_library('libuvc')
lib = ctypes.cdll.LoadLibrary(name)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Could not find module 'C:\Program Files (x86)\libuvc\lib\libuvc.dll'.
Try using the full path with constructor syntax.
Error: could not find libuvc!
Run Code Online (Sandbox Code Playgroud)
问题是该文件自 util.find_library 找到以来就存在,但 python 认为它不在它所在的位置,或者输出可能只是默认值。我在这里缺少什么?不仅无法加载模块,而且无法找到它,这可能是什么原因?对不起,我没有比这更多的输出。
PS:我尝试以不同的方式重新格式化字符串,但消息没有改变。
我正在尝试在设备模式下为单个 USB 设备控制器端口添加 uvc 和大容量存储。我正在使用 configfs 来完成工作。
任何人都可以告诉如何做到这一点。
问候, GBiradar