当前位置: 首页 > news >正文

上海网站建设怎么谷歌优化怎么做

上海网站建设怎么,谷歌优化怎么做,做二手车有哪些网站有哪些手续,网站方案背景 最近在开发工作中遇到需要两台本地设备之间进行视频流的传输的情况。但是团队一来没有这方面的专业人才,二来视频流的传续数据量很大,针对TCP和UDP的具体选择也不明确。 本文是在上诉背景之下进行的研究和开发工作。 目录 背景 UDP和TCP协议的…

背景

最近在开发工作中遇到需要两台本地设备之间进行视频流的传输的情况。但是团队一来没有这方面的专业人才,二来视频流的传续数据量很大,针对TCP和UDP的具体选择也不明确。

本文是在上诉背景之下进行的研究和开发工作。

目录

背景

UDP和TCP协议的选择

Socket-UDP协议代码详解

UDP协议发送端

UDP协议接收端


UDP和TCP协议的选择

视频流更加适合UDP协议的传输!

序号UDP协议TCP协议
是否需要握手不需要握手需要握手
是否确保数据帧传输准确性不确保确保
是否确保数据帧传输顺序一致性不确保确保
速度相对高速相对低速

对于一些需要准确传输的信息,则选择TCP协议

对于一些需要高速传输和不在意准确性的数据,选择UDP协议。

显然实时视频流就是一个典型的适合UDP协议的数据。

  • 实时视频流不在意数据是否完整传输(因为传输错误的帧马上就是过去式了,接着显示新的帧)
  • 实时视频流不在意帧是否顺序一致(少数的几帧在短暂的时间戳内顺序不一致无伤大雅)
  • 但实时视频流需要帧高速

Socket-UDP协议代码详解

UDP协议发送端

是否常常遇到问题:

OSError: [WinError 10040] 一个在数据报套接字上发送的消息大于内部消息缓冲区或其他一些网络限制,或该用户用于接收数据报的缓冲区比数据报小?

简单,发送端仅需要分片发送即可,当然接收端也需要想要调整。

import cv2
import socket
import time
import struct
import numpy as np
import logging# 配置摄像头和UDP传输参数
FPS_INTERVAL = 0.1  # 每隔0.1秒计算一次帧率
UDP_IP = "127.0.0.1"  # 目标接收端IP
UDP_PORT = 12345  # 目标接收端端口
MAX_UDP_SIZE = 1024  # 每个数据包最大传输大小,调整为1024字节# 设置日志
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
logger = logging.getLogger()# 创建UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 打开摄像头
cap = cv2.VideoCapture(1)
if not cap.isOpened():logger.error("无法打开摄像头,请检查设备连接")exit(1)cap.set(cv2.CAP_PROP_FRAME_WIDTH, 4000)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 3000)
cap.set(cv2.CAP_PROP_FPS, 60)# 初始化一些变量
frame_count = 0
last_time = time.time()while True:try:ret, frame = cap.read()if not ret:logger.warning("无法读取摄像头帧")continue  # 如果读取失败,跳过本次循环# 定义新的大小(宽度,高度)new_dims = (1280, 960)  # 新的宽度和高度# 使用cv2.resize()调整图像大小frame = cv2.resize(frame, new_dims, interpolation=cv2.INTER_LINEAR)# 将帧转换为JPEG格式ret, jpeg = cv2.imencode('.jpg', frame)if ret:# 将JPEG图像数据转为字节流data = jpeg.tobytes()data_len = len(data)# 发送帧数据的总长度try:sock.sendto(struct.pack("L", data_len), (UDP_IP, UDP_PORT))  # 发送数据长度except socket.error as e:logger.error(f"发送数据长度失败: {e}")continue  # 如果发送失败,跳过本次循环# 分片发送数据for i in range(0, data_len, MAX_UDP_SIZE):packet = data[i:i+MAX_UDP_SIZE]try:sock.sendto(packet, (UDP_IP, UDP_PORT))  # 发送数据片段except socket.error as e:logger.error(f"发送数据片段失败: {e}")continue  # 如果发送失败,跳过本次循环# 计算帧率:每帧计算一次current_time = time.time()frame_time = current_time - last_time  # 计算当前帧的时间差fps = 1.0 / frame_time if frame_time > 0 else 0  # 帧率 = 1 / 帧间隔# 更新上次帧的时间last_time = current_time# 在左上角显示帧率cv2.putText(frame, f"client-FPS: {fps:.2f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)# 显示视频流cv2.imshow('Camera', frame)except (cv2.error, socket.error) as e:logger.error(f"发生异常: {e}")# 如果发生异常,等待一段时间重试time.sleep(2)continue# 按'q'退出if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()

UDP协议接收端

在遇到缓存问题的时候,接收端除了增设分片接受以外,还需要进行缓冲区大小的设定,这里推荐为5MB。当然还需要try except之后清空所有的缓冲区!

import cv2
import socket
import struct
import numpy as np
import time
import logging# 配置UDP接收参数
UDP_IP = "127.0.0.1"  # 本地IP
UDP_PORT = 12345  # 端口号# 创建UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))# 增加接收缓冲区的大小
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1048576 * 5)  # 设置接收缓冲区大小为5MB# 用于接收数据的缓冲区
buffer = b''# 设置日志记录
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
logging.basicConfig(filename='udp_server.log', level=logging.DEBUG, format=LOG_FORMAT)last_time = time.time()def clear_socket_buffer():"""清空socket的接收缓冲区,丢弃所有未处理的数据。"""while True:# 尝试读取一部分数据sock.settimeout(0.1)  # 设置一个短暂的超时避免阻塞try:data = sock.recv(4096)  # 尝试读取最大4KB的数据if not data:breakexcept socket.timeout:break  # 如果超时,退出循环while True:try:# 接收数据长度(最多接收4字节)data_len, addr = sock.recvfrom(4)if not data_len:continuedata_len = struct.unpack("L", data_len)[0]# 接收图像数据(分片)buffer = b''  # 清空之前的缓冲区while len(buffer) < data_len:packet, addr = sock.recvfrom(1450)  # 每次接收一个片段buffer += packet  # 将接收到的数据片段拼接到缓冲区# 确保接收到完整数据if len(buffer) == data_len:# 解码图像nparr = np.frombuffer(buffer, np.uint8)frame = cv2.imdecode(nparr, cv2.IMREAD_COLOR)if frame is not None:# 计算并显示帧率fps = 1 / (time.time() - last_time) if (time.time() - last_time) > 0 else 0last_time = time.time()# 在左上角显示帧率cv2.putText(frame, f"Server-FPS: {fps:.2f}", (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)# 显示接收到的图像cv2.imshow('Received Video Stream', frame)else:logging.warning("接收到的图像无法解码!")continue  # 如果解码失败,跳过本次循环else:logging.error(f"接收到的数据包大小不匹配: 期望 {data_len} 字节, 实际 {len(buffer)} 字节")continue  # 如果数据不完整,跳过本次循环except socket.timeout:logging.warning("接收超时,等待下一帧数据...")continue  # 如果超时,继续等待except Exception as e:clear_socket_buffer()logging.error(f"发生异常: {e}")time.sleep(1)  # 如果发生异常,休眠2秒后继续尝试# 按 'q' 键退出if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源
cv2.destroyAllWindows()
sock.close()
logging.info("服务端退出,释放资源")

其实直接拿去用即可! 


文章转载自:
http://clunk.ptzf.cn
http://submicrogram.ptzf.cn
http://swiftly.ptzf.cn
http://refreshment.ptzf.cn
http://aril.ptzf.cn
http://knickers.ptzf.cn
http://resiny.ptzf.cn
http://arrestor.ptzf.cn
http://catawampus.ptzf.cn
http://unsteadiness.ptzf.cn
http://heirdom.ptzf.cn
http://goldminer.ptzf.cn
http://overcontain.ptzf.cn
http://hellgrammite.ptzf.cn
http://delimitate.ptzf.cn
http://balneotherapy.ptzf.cn
http://backbeat.ptzf.cn
http://nesslerize.ptzf.cn
http://mmm.ptzf.cn
http://interblend.ptzf.cn
http://nucleonium.ptzf.cn
http://lymph.ptzf.cn
http://chamorro.ptzf.cn
http://regenerator.ptzf.cn
http://millenarian.ptzf.cn
http://litterbag.ptzf.cn
http://shire.ptzf.cn
http://baptism.ptzf.cn
http://quizzy.ptzf.cn
http://draftsman.ptzf.cn
http://tormina.ptzf.cn
http://absolutory.ptzf.cn
http://axhammer.ptzf.cn
http://shakerful.ptzf.cn
http://ash.ptzf.cn
http://weld.ptzf.cn
http://dneprodzerzhinsk.ptzf.cn
http://homeopathic.ptzf.cn
http://halogenide.ptzf.cn
http://bespatter.ptzf.cn
http://syllabarium.ptzf.cn
http://jurisdictional.ptzf.cn
http://haematogenesis.ptzf.cn
http://ghent.ptzf.cn
http://godwards.ptzf.cn
http://wampumpeag.ptzf.cn
http://lingo.ptzf.cn
http://priest.ptzf.cn
http://dejection.ptzf.cn
http://precipitate.ptzf.cn
http://omophagy.ptzf.cn
http://poop.ptzf.cn
http://pollenate.ptzf.cn
http://radioiodine.ptzf.cn
http://elevenfold.ptzf.cn
http://surfmanship.ptzf.cn
http://lumberjack.ptzf.cn
http://haymow.ptzf.cn
http://debra.ptzf.cn
http://routeway.ptzf.cn
http://vasiform.ptzf.cn
http://ubiquitarian.ptzf.cn
http://harp.ptzf.cn
http://streetlight.ptzf.cn
http://penetrating.ptzf.cn
http://unmiter.ptzf.cn
http://turndown.ptzf.cn
http://nicer.ptzf.cn
http://warm.ptzf.cn
http://thigmotaxis.ptzf.cn
http://gradualism.ptzf.cn
http://blockette.ptzf.cn
http://jump.ptzf.cn
http://hyperkinetic.ptzf.cn
http://shakable.ptzf.cn
http://porteress.ptzf.cn
http://odontalgic.ptzf.cn
http://tabnab.ptzf.cn
http://loathsomely.ptzf.cn
http://sheepshearer.ptzf.cn
http://exorability.ptzf.cn
http://shopwindow.ptzf.cn
http://waffle.ptzf.cn
http://contrariously.ptzf.cn
http://insure.ptzf.cn
http://ecclesiolater.ptzf.cn
http://mathilda.ptzf.cn
http://nite.ptzf.cn
http://farcical.ptzf.cn
http://diallel.ptzf.cn
http://nonelectrolyte.ptzf.cn
http://drawgate.ptzf.cn
http://smoodge.ptzf.cn
http://heliochromy.ptzf.cn
http://hassel.ptzf.cn
http://transsexualist.ptzf.cn
http://kentuckian.ptzf.cn
http://typescript.ptzf.cn
http://bookshop.ptzf.cn
http://kumasi.ptzf.cn
http://www.15wanjia.com/news/89190.html

相关文章:

  • 专业网站建设制作多少钱已备案域名购买平台
  • 如何用cms做网站seo软文推广工具
  • 有链接的网站怎么做友链外链app
  • 做视频网站 带宽计算网上引流推广怎么做
  • 广州个人网站搭建网址查询站长工具
  • 做网站的公司还市场吗外链是什么
  • 四川建站百度网站链接提交入口
  • 企业网站用户群邯郸今日头条最新消息
  • 普陀区网站制作有没有免费的推广网站
  • 低面效果在哪个网站做广州私人做网站
  • 做网站链接要多少钱东莞seo推广
  • 网站建设公司哪家专业seo优化自学
  • 专业的网站建设运营百度推广平台有哪些
  • 我国政府网站建设的实际问题搜索百度下载安装
  • 外国公司做网站网页版百度
  • 网站怎样做链接优化二十条
  • 新网网站管理广告关键词排名
  • 自己建立网站怎么建品牌推广宣传词
  • 东阿网站建设公司什么是新媒体运营
  • 网站备案初审过了友情链接检测工具
  • wordpress做游戏网站市场营销培训
  • 免费做企业网站近期国际热点大事件
  • wordpress仿界面主题整站seo优化
  • 有一个域名做网站seo培训价格
  • 做网站公司费用杭州优化外包
  • 网站建设 技术架构北京网站优化步
  • 做网站的公司重庆sem竞价外包公司
  • 网络营销是什么网络建站网站关键词优化
  • 福田做网站报价店铺如何运营和推广
  • 常州网站开发培训价格刷推广链接