如何用PowerShell从IP摄像头JPEG流中定时捕获图像
利用PowerShell从IP摄像头JPEG流定时捕获图像(无第三方工具)
由于你的摄像头仅提供JPEG流而非单张图像端点,我们可以通过PowerShell调用.NET类直接读取流数据,提取第一帧完整的JPEG图像并保存,再配合Windows任务计划实现每十分钟自动执行。
步骤1:编写捕获图像的PowerShell脚本
创建一个.ps1脚本文件,内容如下:
# 配置参数 $cameraStreamUrl = "http://你的摄像头IP/流路径" # 替换为实际流地址 $saveFolder = "C:\CameraCaptures" # 替换为目标保存文件夹 # 创建保存目录(不存在则自动生成) if (-not (Test-Path $saveFolder)) { New-Item -ItemType Directory -Path $saveFolder | Out-Null } # 生成带时间戳的文件名,避免覆盖 $timestamp = Get-Date -Format "yyyyMMdd-HHmmss" $savePath = Join-Path $saveFolder "Capture_$timestamp.jpg" try { # 建立摄像头流请求 $request = [System.Net.HttpWebRequest]::Create($cameraStreamUrl) # 若摄像头需认证,取消下方注释并填入凭据 # $request.Credentials = New-Object System.Net.NetworkCredential("用户名", "密码") $response = $request.GetResponse() $stream = $response.GetResponseStream() # 读取流数据,直到捕获完整JPEG帧(JPEG结束标记为0xFF 0xD9) $buffer = New-Object byte[] 4096 $jpegBuffer = [System.Collections.Generic.List[byte]]::new() $endMarkerFound = $false while (-not $endMarkerFound) { $bytesRead = $stream.Read($buffer, 0, $buffer.Length) if ($bytesRead -eq 0) { break } $jpegBuffer.AddRange($buffer[0..($bytesRead-1)]) # 检查是否到达JPEG帧末尾 if ($jpegBuffer.Count -ge 2) { $lastTwo = $jpegBuffer[$jpegBuffer.Count-2..$jpegBuffer.Count-1] if ($lastTwo[0] -eq 0xFF -and $lastTwo[1] -eq 0xD9) { $endMarkerFound = $true } } } # 保存捕获到的JPEG图像 if ($endMarkerFound) { [System.IO.File]::WriteAllBytes($savePath, $jpegBuffer.ToArray()) Write-Host "图像已保存至: $savePath" } else { Write-Warning "未从流中捕获到完整的JPEG帧" } # 清理资源 $stream.Close() $response.Close() } catch { Write-Error "捕获失败: $_" }
脚本说明
- 替换
$cameraStreamUrl和$saveFolder为你的实际配置 - 若摄像头需要HTTP认证,取消注释并填写正确的用户名和密码
- 脚本会自动创建保存目录,并用时间戳命名文件,防止文件覆盖
步骤2:配置定时任务(每十分钟执行一次)
通过Windows任务计划程序实现定时执行:
- 打开任务计划程序,点击「创建基本任务」
- 任务名称设为「摄像头定时抓图」,点击下一步
- 触发器选择「每天」,下一步后设置「重复任务间隔」为10分钟,「持续时间」选择「无限期」,点击下一步
- 操作选择「启动程序」,在「程序/脚本」中填入
powershell.exe,「添加参数」中填入:
(注意脚本路径需用引号包裹)-ExecutionPolicy Bypass -File "C:\脚本的完整路径\CaptureCamera.ps1" - 确认设置后,勾选「当单击完成时,打开此任务属性的对话框」,点击完成
- 在属性对话框中,切换到「常规」标签,勾选「不管用户是否登录都要运行」,确保任务能后台执行
注意事项
- 确保执行任务的用户账号有访问摄像头网络和保存文件夹的权限
- 手动运行脚本测试一次,确认能正常生成图像后再配置定时任务
- 若摄像头流存在额外头部信息,脚本仍能通过JPEG结束标记正确提取第一帧
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

