萤石开放平台接入摄像头

news/2025/2/21 10:51:34/

目录

场景

准备

代码


场景

获取摄像头资源。实时播放以及录制视频的功能需求。此段代码就是对接萤石云视频,并录制视频记录。

准备

  1. 注册萤石云账户,配置好摄像头协议
  2. 安装ffmpeg 工具
  3. 安装依赖包cv2
  4. 接口文档

代码

# -*- coding: UTF-8 -*-
# Desc   :萤石云视频流对接,并录制视频
import subprocess
import os
import time
import cv2
import requests# 视频配置
APP_KEY = "app_key"
APP_SECRET = "app_secret"
HEADERS = {'Host': 'open.ys7.com', 'Content-Type': 'application/x-www-form-urlencoded'}def get_camera_token():# 获取camera tokentoken_url = f'https://open.ys7.com/api/lapp/token/get?appKey={APP_KEY}&appSecret={APP_SECRET}'response = requests.post(token_url, headers=HEADERS)# result = response.json()# token = response.json()['data']['accessToken']token = 'at.7jrcjmna8qnqg8d3dgnzs87m4v2dme3l-32enpqgusd-1jvdfe4-uxo15ik0s'return tokendef get_video_stream_url(accessToken, deviceSerial, protocol):""":param accessToken: 访问token:param deviceSerial: 设备序列号:param protocol: 协议编号:return:"""# 获取视频流URLtry:url = f"https://open.ys7.com/api/lapp/v2/live/address/get?accessToken={accessToken}&deviceSerial={deviceSerial}&protocol={protocol}&supportH265=0"response = requests.post(url, headers=HEADERS, verify=False)msg = response.json()['msg']if "Operation succeeded" not in msg:return False, msgvideo_url = response.json()['data']['url']return True, video_urlexcept Exception as e:print(e)return False, ""def record_video(deviceSerial, save_path, fps=24, seconds=10):""":param deviceSerial: 设备序列号:param save_path: 录制视频保存路径:param fps: 视频帧数:param seconds: 视频录制时长:return:"""file_dir = os.path.join(save_path, deviceSerial)tmp_dir = os.path.join(save_path, 'tmp')if not os.path.exists(file_dir):os.makedirs(file_dir)if not os.path.exists(tmp_dir):os.makedirs(tmp_dir)accessToken = get_camera_token()status, stream_url = get_video_stream_url(accessToken, deviceSerial, "2")if not status:raise Exception("获取stream_url失败")# 初始化视频cap = cv2.VideoCapture(stream_url)# 经尝试,MP4其他的协议格式均不成功!fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'v')# 设置要保存视频的像素大小 原值是1920*1080,按照原值保存,视频文件很大,# 可设置视频帧数,以及时间长度,保存像素大小来改变保存的视频文件大小size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH) / 3),int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT) / 3))start_time = time.time()title = f'{int(start_time)}'video_tmp = os.path.join(tmp_dir, f'{title}.mp4')video_result = os.path.join(file_dir, f'{title}.mp4')video = cv2.VideoWriter(video_tmp, fourcc, fps, size)while cap.isOpened():# 采集一帧一帧的图像数据is_success, frame = cap.read()if is_success:img = cv2.resize(frame, size, interpolation=cv2.INTER_LINEAR)video.write(img)# 实现按下“q”键退出程序# if cv2.waitKey(1) & 0xFF == ord('q'):#     breakif time.time() - start_time >= seconds:break# 释放视频资源video.release()cap.release()cv2.destroyAllWindows()return video_tmp, video_result, titledef mp4_video_record(deviceSerial, save_path):video_tmp, video_path, title = record_video(deviceSerial=deviceSerial,save_path=save_path)# 还需要对录制下来的视频做处理,之后才能在前端显示,播放cmd = f'ffmpeg -i {video_tmp} -strict -2 {video_path}'res = subprocess.Popen(cmd, shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)result = str(res.stderr.readlines()[-1], encoding='utf-8')if 'No such file or directory' in result:print("录制视频失败")elif not os.path.exists(video_path):print("录制视频失败")else:print("保存视频路径到数据库")def back2():cap = cv2.VideoCapture(r['data']['url'])fps = cap.get(cv2.CAP_PROP_FPS)print(fps)# 获取cap视频流的每帧像素大小size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))# 定义编码格式mpge-4fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', '2')# 定义视频文件输入对象outVideo = cv2.VideoWriter('saveDir.avi', fourcc, fps, size) #size必须和视频流的帧大   小一致,否则无法执行# 获取视频流打开状态if cap.isOpened():rval, frame = cap.read()print('ture')else:rval = Falseprint('False')tot = 1c = 1# 循环使用cv2的read()方法读取视频帧while rval:rval, frame = cap.read()frame = cv2.resize(frame, (400, 300)) #调整画面大小cv2.imshow('test', frame)# 使用VideoWriter类中的write(frame)方法,将图像帧写入视频文件outVideo.write(frame)cv2.waitKey(25)cap.release()outVideo.release()cv2.destroyAllWindows()if __name__ == '__main__':# 对接萤石云摄像头mp4_video_record("123", "/")


http://www.ppmy.cn/news/742245.html

相关文章

EasyCVR添加萤石云SDK接入的设计与开发流程

我们在前期的文章中介绍过关于EasyCVR近期新增了多个功能,包括SDK接入方式的拓展。经过一段时间的设计、开发与测试,EasyCVR平台已经支持稳定接入华为SDK、宇视SDK、乐橙SDK、萤石SDK。感兴趣的用户可以戳这篇文章:AI视频融合平台EasyCVR现已…

萤石云视频预览、回放、自定义录制

result code <iframesrc""width"600"height"400"id"ysOpenDevice"allowfullscreen></iframe>mdoel为后台返回的实体对象 var appKey ${model.appKey};var appSecret ${model.appSecret};var deviceSerial ${model.de…

如何对萤石云视频解码

编者&#xff1a;李国帅 qq&#xff1a;9611153 微信lgs9611153 时间&#xff1a;2021-2-8 背景原因: 遇到了一个问题&#xff0c;需要把萤石云视频流作为自定义流嵌入到腾讯音视频trtc&#xff0c;不过从海康设备获取的流需要解码为yuv数据&#xff0c;但是萤石云开发包…

芯旺微chipon IDE KF32 IDE安装教程

芯旺微chipon的编辑环境IDE和编译环境安装教程 使用chipon的小伙伴们大家好&#xff0c;我是阿范&#xff0c;网上关于chipon的资料并不多&#xff0c;本人后续会做芯旺微的IDE使用&#xff0c;外设使用&#xff0c;以及相关的应用进行详细解说。由于时间有限&#xff0c;均以…

萤石摄像头实现web端监控预览以及录像回放

文章目录 前言一、在萤石云平台上注册账号并添加设备以及创建应用二、利用云平台的api获取到前端展示需要的相关信息三、前端页面展示内容总结 前言 前段时间对接了萤石摄像头&#xff0c;在此做一次总结&#xff0c;总体思路是&#xff1a;把萤石摄像头绑定到萤石云平台上&am…

使用esp32cam与stm32c8t6核心板开发的99A静改动

目录&#xff1a; 1.从零开始的静改动工程&#xff1a; 底盘设计&#xff1a; 目标功能&#xff1a; 1.车体基本功能 c8t6输出pwm波&#xff1a; 通过esp32cam向c8t6发送串口信息来进行控制&#xff1a; 1.从零开始的静改动工程&#xff1a; 现阶段完成到底盘部分&#x…

控制萤石云摄像头转头

一、准备 1. 设备序列号 2. 萤石云api连接 https://open.ys7.com/doc/zh/book/index/device_ptz.html 二、代码 html <button onclick"directionControl(0)">上</button><button onclick"directionControl(1)">下</button><b…

教你N种方法萤石云添加设备(转)

方法一&#xff1a;手机萤石云视频 手机下载萤石云视频&#xff0c;注册萤石云账号后登录。 点击左下角“萤石”进入图1&#xff0c;点中间的加号或者右上角的加号进入图2。 在图2中扫描机身标签上的二维码或者点击图2右上角编辑图标手动输入设备标签上的序列号搜索后进入图3。…