- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 XBMC 盒子连接到我的电视上。此外,我还有 2 台 Foscam IP 摄像机,用于监控我的两个小女儿。
前阵子我觉得写几个脚本会很酷,这样当 Foscam 的一个警报触发时,我会在 XBMC 上收到一条通知以及来自相关 Foscam 相机的实时图像。有了这个,我可以一边看电视,一边密切关注 children 。
因此,我在 XBMC 盒子上运行了一个 shell 脚本,它每秒检查一次 Foscam 警报状态。如果触发警报,它会向 XBMC 发送命令以触发 XBMC 脚本,暂停检查 30 秒,然后恢复检查警报状态。 XBMC 脚本显示了一个 30 秒的通知,其中包含我的一个女儿的名字(取决于触发的相机)和一张可爱的照片,以及来自相关 Foscam 的实时快照,每半秒更新一次。
这一切都工作得很好,而且非常棒 :) 但是,上周我升级了 Foscam 的固件。新固件的唯一变化(在固件说明中提到)是将相机的HTTP
授权方法从basic
更改为digest
。从那时起,我的 XBMC 脚本就一直有问题。
首先,这是脚本的当前版本:
# Import the XBMC/XBMCGUI modules.
from requests.auth import HTTPDigestAuth
import xbmc, xbmcgui, xbmcvfs, xbmcaddon
import sys, os, requests, time
# Class to manage the notification image
class CamView(xbmcgui.WindowDialog):
urlpath = "/snapshot.cgi?resolution=16"
imagename = "snapshot.jpg"
def __init__(self, camname,camport,idx,username,password):
# Construct correct URL
self.baseurl = 'http://' + camname + 'cam:' + camport
# Cams use digest authentication
self.auth = HTTPDigestAuth(username, password)
# Set
path = xbmc.translatePath('special://profile/addon_data/%s' % xbmcaddon.Addon().getAddonInfo('id'))
if not xbmcvfs.exists(path):
xbmcvfs.mkdir(path)
self.imagefile = os.path.join(path, self.imagename)
# Message
self.msg = {
"1": camname.capitalize() + ' moved',
"3": camname.capitalize() + ' made a sound',
}.get(idx, camname.capitalize() + 'cam fired alarm')
# set the initial image before the window is shown
self.image = xbmcgui.ControlImage(870, 383, 380, 253, "")
self.addControl(self.image)
def update_image(self):
f = requests.get(self.baseurl+self.urlpath, auth=self.auth)
with open(self.imagefile, "wb") as local_file:
local_file.write(f.content)
self.image.setImage("")
self.image.setImage(self.imagefile)
def __enter__(self):
return self
def __exit__(self,type,value,traceback):
os.remove(self.imagefile)
def main():
for i in range(1,len(sys.argv)):
str,dummy,val = sys.argv[i].partition("=")
if str == "alarm_id": idx = val
if str == "cam_id" : camname = val
if str == "cam_port": camport = val
if str == "username": username = val
if str == "password": password = val
with CamView(camname,camport,idx,username,password) as viewer:
viewer.show()
start_time = time.time()
firstimage = True
while(time.time() - start_time <= 30):
viewer.update_image()
curr_time = round(time.time()-start_time, 0)
if firstimage:
firstimage = False
nowtime = time.strftime("%I:%M %p")
viewer.image.setAnimations([('conditional', 'effect=fade start=0 end=100 time=750 delay=125 condition=true'),
('conditional', 'effect=slide start=400,0 end=0,0 time=750 condition=true')])
xoptions = ("Notification(\"" + viewer.msg + "\", " + nowtime + ", 29500, special://masterprofile/addon_data/" +
xbmcaddon.Addon().getAddonInfo('id') + "/" + camname + ".png)")
xbmc.executebuiltin(xoptions)
elif curr_time == 30:
viewer.image.setAnimations([('conditional', 'effect=fade start=100 end=0 time=750 condition=true'),
('conditional', 'effect=slide start=0,0 end=400,0 time=750 condition=true')])
else:
viewer.image.setAnimations([('conditional', 'effect=fade start=100 end=100 time=0 condition=true')])
xbmc.sleep(500)
if __name__ == "__main__":
if xbmc.getInfoLabel("Window(10000).Property(foscamScriptRunning)") == "True":
xbmc.log('Script already running', level=xbmc.LOGERROR)
else:
xbmc.log('Foscam alarm triggered', level=xbmc.LOGNOTICE)
xbmcgui.Window(10000).setProperty("foscamScriptRunning", "True")
main()
xbmcgui.Window(10000).setProperty("foscamScriptRunning", "False")
原始脚本使用了 urllib
,我发现它不以任何方便的方式支持 digest
身份验证。所以我改成了urllib2
。这没有用,因为我的 XBMC 弹出窗口中的图像在第一张图像之后从未更新过。有时,甚至根本没有图像。
所以我做了一些挖掘,我很快发现使用 urllib2
和 Digest
身份验证获取快照花了 7 秒多一点! (使用旧固件,这花费了不到 0.1 秒)。考虑到这可能是图像未更新的原因,我将所有内容都更改为 requests
模块。分析表明,从相机获取一张快照现在大约需要 0.25 秒;恕我直言,仍然相当慢,但也许可以接受。但是,同样使用此方法,通知图像不会更新。
我通过远程 SSH 触发脚本,所以我可以检查 XBMC 日志等。我还检查了 snapshot.jpg
文件创建时的时间戳,它们似乎同意脚本触发时间和 requests
的 0.25 秒延迟。在 XBMC 脚本中,我将清除图像并将其设置为新快照的顺序更改为您能想到的所有可能的顺序,但没有成功。如果我在清除和重新设置图像之间设置延迟,我会看到闪烁的图像,表明一切正常。但是,它总是重新设置为完全相同的快照。
所以,我真的被困住了。我在这里忽略了什么?
最佳答案
它的值(value):
我最终“解决”了这个问题,方法是将每个单独的快照保存在一个唯一的名称下(根据时间生成的名称,带有微秒),然后删除所有这些单独的文件。
这暗示了 xbmcgui.ControlImage.setImage()
存在一些缓存问题,但我一直无法找到任何提及缓存的文档...
我在使用这种方法时遇到的一个问题是,如果您在显示通知时按 Esc
(因为在这种情况下所有 XBMC 控制都会丢失),图像不会总是清理得当。相对较小的问题,但它清楚地表明这是一个臭解决方案:)
关于python - XBMC 通知图像(来自网络摄像头)未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24238453/
避免必须自己创建整个相机应用程序,我调用: Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); this.startActivit
我使用这种方法从前置摄像头录制视频: Recording video via Mediarecorder 它在我的 Nexus 4 上运行良好,但有人说有很多手机的前置摄像头无法录制视频,只能拍照。我
我正在使用 Android 手机的摄像头作为输入来测试成像算法,并且需要一种方法来始终如一地测试算法。理想情况下,我想获取预先录制的视频源并让手机“假装”视频源是来自相机的实时视频。 我理想的解决方案
我想在 android 上通过 v4l 访问外部 USB 摄像头。 我试过了 SimpleWebCam .在对原始源代码进行一些细微修改后,我实现了使其在 Root过的 android 设备上运行。然
我正在尝试连接两个连接到单个 USB 端口的 USB 网络摄像头。问题是当时只有一个摄像头工作...我在 python 中使用 OpenCV。这可能吗?我的目标是将多台相机连接到一台计算机以进行机器视
我想知道如何在 virtualbox 中使用笔记本电脑的内置网络摄像头和 android x86。 我已经尝试启动默认的“相机”应用程序,它告诉我必须配置 SDCard,我在本教程中所做的:SD ca
我在 64 位华硕的 Ubuntu 12.10 上安装了 ARToolKit。安装没有错误,所以我觉得我没问题。但是当我想尝试一个例子时,它找不到相机。如果我在 char *vconf = ""; 没
我想以编程方式移动 webvr 场景中 View 的位置。为此,我使用了position.add 方法。 以下是我如何以编程方式移动相机: 摄像机移至此处: var obj3d = docume
我正在使用 Camera 2 API 将 JPEG 图像保存在磁盘上。我的 Nexus 5X 目前有 3-4 fps,我想将其提高到 20-30。可能吗? 将图像格式更改为 YUV 我设法生成 30
Baby Monitor (http://www.babymonitor3g.com/) 等应用程序可让两台 iOS 设备相互连接。连接后,一台设备可以激活另一台设备上的摄像头、灯光和麦克风,即使该应
我有一个论坛帖子表单,允许发帖人附加录音和/或网络摄像头快照。这两个都是使用 navigator.getUserMedia() 实现的应用程序接口(interface)。对于音频,我建立了 varia
我对 Opencv 和 Python 有疑问。当我尝试从相机中查看帧时,它无法识别 USB 相机,我使用了带有两个 USB 相机的书籍中的标准代码,问题是只有一个相机工作,我不知道。我在 window
我编写了一个程序,基本上使用步进电机 + a4988 驱动程序将托盘放在连接到 Raspberry Pi 的相机下方。代码将托盘带到起始位置,迈出一步,拍照并重复 10 次。然后托盘返回到起始位置。我
我的 uEye 相机遇到了一个问题。使用我的笔记本电脑摄像头(id 0)或 usb 上的网络摄像头(id 1)这条线完美运行: TheVideoCapturer.open(1); (TheVideoC
我是 Android 版 openCV 的新手,我需要一个在后台运行的图像处理应用(检测图像的线条)。 我已经制作了一个应用程序来完成我需要的所有图像处理(使用 jni),但它不能在后台运行并且它使用
我正在尝试使用 OpenCV 从 USB 摄像头捕获视频。 #include #include using namespace std; using namespace cv; int main(
我正在寻找启用和禁用默认 iPhone 相机的方法,例如在特定时间或纬度/经度。有些地方是禁止摄像头的,所以我们可以在到达这样的地方时关闭它,这里只是举个例子。好吧,我认为在 iPhone 中禁用和启
有人有这种“东西”的工作样本吗? 在理论上,以这种方式实现它是个好主意,但我没有看到任何相关的代码 fragment 来说明如何实现它。 我不要花哨的东西,越简单越好。我只想在单独的线程上实现与相机控
我正在开发一个新网站。您可以加入房间通话并进行语音通话,因此可以使用您的网络摄像头,但您也可以共享您的屏幕。 问题是当我将轨道添加到流中时,对等点不再工作......我不知道如何解决这个问题。我还尝试
我需要在 Flutter 中创建一个考试应用程序,我们需要每隔一段时间拍摄用户的照片和视频,而在执行此操作时我们不想显示相机屏幕。 我尝试使用 Flutter 的 Camera 插件,但我无法找到任何
我是一名优秀的程序员,十分优秀!