最近要实现一个项目,就是使用Jetson nano,进行人体识别,同时推流视频到公网。

最初的版本是,在Nano跑YOLOV5,再将处理后的图片经过ffmpeg推送到自己搭建的nginx直播服务器,服务器转成hls流,可在网页端实时观看直播。但问题很多:视频帧数低,直播延迟大,大到20秒~40秒,体验效果极差。

针对视频帧数低的问题,解决方案是使用一台GPU服务器专门进行视频处理。

针对直播延迟的问题,解决方案是使用UDP直接传输经过压缩的视频帧,同时使用ws协议对连进来的网页进行转发,达到0.5s以内的延迟。

Nano沦为了一个图片采集、转发的工具。

效果图:

客户端、服务端、网页端的视频几乎同步。

服务端代码(GPU服务)

import socket
import asyncio
import numpy as np
import cv2 as cv
import binascii
import threading
import copy
import websockets
from queue import Queue
import time
import sys
import os
import random
# 连接断开标志位
conn = Falseq = Queue(50)
USERS = []
# UDP
socketserver = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
localhost = "服务器本地IP" # 改成服务器本地IP,不能是回环地址
ws_port = 5766
tcp_port = 9092
socketserver.bind((localhost, tcp_port))def restart_program():python = sys.executableos.execl(python, python, * sys.argv)def S():print('打开了UDP服务~但不知道有没有连接,看情况咯')print('1、UDP阻塞式读取')print('2、异步WS协议视频帧转发')print('3、MQTT消息交互')while True:try:data, _ = socketserver.recvfrom(921600)if len(USERS) > 0:q.put(data)receive_data = np.frombuffer(data, dtype='uint8')# 在这进行图片处理r_img = cv.imdecode(receive_data, 1)cv.imshow('server', r_img)if cv.waitKey(1) & 0xFF == ord('q'):breakexcept ConnectionResetError as e:print(e.args)print("重新打开ING。。")threading.Thread(target=S).start()breakfinally:passt1 = threading.Thread(target=S)t1.start()async def recv_msg(websocket):USERS.append(websocket)print('连了一条东西进来', USERS, len(USERS))while True:try:if q.qsize() > 0:await websocket.send(q.get())finally:passasync def main_logic(websocket, path):await recv_msg(websocket)start_server = websockets.serve(main_logic, localhost,ws_port)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

客户端(Nano)代码

import asyncio
import socket
import websockets
import cv2 as cv
import threading
import timecap = cv.VideoCapture(0)
print(cap)
cap.set(3,480)
cap.set(4,640)def putDate(frame):font = cv.FONT_HERSHEY_SIMPLEXdatet = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())cv.rectangle(frame, (0,0), (320, 22), (0, 0, 0), -1)frame = cv.putText(frame, datet, (0, 20), cv.FONT_HERSHEY_COMPLEX_SMALL, 1.3,(255, 255, 255), 2, cv.LINE_4)return framedef getJPG():try:ret, frame = cap.read()if not ret:print("Fking无法抓帧")return cv.imencode('.jpg', frame)[1].tobytes()  # cv2转Bytesexcept Exception as e:print(e.args)def MAIN():try:client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)host = "localhost"  #改成服务器公网IPport = 9092         #服务器开放的对应的端口print('正在连接。。。')client.connect((host, port))print("连接成功,WORKING~")while True:time.sleep(0.1)# img = getJPG()_, img = cap.read()# img = cv.flip(img, 1)img = putDate(img)cv.imshow('JNano', img)if cv.waitKey(1) & 0xFF == ord('q'):break# 压缩图片_, send_data = cv.imencode('.jpg', img, [cv.IMWRITE_JPEG_QUALITY, 50]) # jpg编码压缩client.sendto(send_data, (host, port))except Exception as e:print("寄掉了")print(e.args)print("即将重试")time.sleep(3)threading.Thread(target=MAIN).start()client.close()threading.Thread(target=MAIN).start()

其中网页端代码比较多,放个链接。
点此跳转

敬告:以上代码不能直接使用,需要根据自身情况修改IP地址

Jetson nano 树莓派 传输视频帧直播 极低延迟相关推荐

  1. Deepson在Jetson Nano上进行视频分析的入门

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮 ...

  2. 实时音视频聊天中超低延迟架构的思考与技术实践

    1.前言 从直播在线上抓娃娃,不断变化的是玩法的创新,始终不变的是对超低延迟的苛求.实时架构是超低延迟的基石,如何在信源编码.信道编码和实时传输整个链条来构建实时架构?在实时架构的基础之上,如果通过优 ...

  3. 腾讯云快直播——超低延迟直播技术方案及应用

    正文字数:4361  阅读时长:7分钟 随着直播业务的发展,在线教育,连麦直播.赛事直播等高实时性直播场景的出现,用户对于直播流畅度.低延迟等性能的要求愈加严苛.腾讯云直播技术高级工程师陈华成 从5G ...

  4. 抖音世界杯直播的低延迟是怎么做到的?

    动手点关注 干货不迷路 世界杯已经结束了,梅西带领阿根廷时隔三十六年之后终于如愿捧杯.抖音直播提供的 4K 超高清超低延迟看播能力给亿万观众留下了深刻的印象,决赛的 PCU 达到 3700w+,在这样 ...

  5. 【线上分享】快直播—超低延迟直播技术方案及应用

    随着直播业务的发展,在线教育,连麦直播.赛事直播等高实时性直播场景的出现,用户对于直播流畅度.低延迟等性能的要求愈加严苛. 10月15日 19:30,我们邀请到了腾讯 视频直播组高级工程师 陈华成 从 ...

  6. CV5200远距离WiFi图传输方案,远距离传输和低延迟传输特点

    随着无人机.VR等技术的普及,对低延时远距离传输的需求日益提升.一般根据调制方式的不同,无线图传分为模拟图传和数字图传. 模拟图传就是把最早期电视基带信号调制到射频载波上,其系统实现简单,传输延时低, ...

  7. ipc java_java – Thrift有IPC传输实现吗?或低延迟SOA解决方案

    您可以使用Thrift来序列化您的对象,然后使用您喜欢的IPC方法(命名管道,消息队列等). 以下是使用管道的简单示例 >我们有一个Message类型的对象,其中包含一些信息 > Php进 ...

  8. 什么是延迟?如何在直播中实现低延迟

    什么是延迟? 简单来说: 延迟或滞后就是延迟. 当你进行流媒体直播时,你正在捕捉视频并通过互联网广播给你的观众. 延迟是指在下列情况下的时间量: 你的相机记录你的视频 和你的观众能够看到你刚刚录制的内 ...

  9. jetson nano 用 tensorrt 运行 nanodet(kitti数据集)

    题目是目标,我们先一步一步来做,第一步是训练神经网络, 我用的是 kitti 数据集,训练顺序为,第一步,拿到kitti数据集,第二步,把kitti数据集修改为voc数据集格式,第三步,修改配置文件进 ...

最新文章

  1. 用hosting.json配置ASP.NET Core站点的Hosting环境
  2. GPUImage API 文档之GPUImagePicture类
  3. 40个Java多线程问题详解复习
  4. java 线程转储_获取Java线程转储的常用方法(推荐)
  5. 使用Jquery EasyUi常见问题解决方案
  6. 3140: [Hnoi2013]消毒
  7. 低价营销网站建设是陷阱,中小企业要谨记!
  8. webrtc 渲染_WebRTC 开发(六)摄像头采集与视频渲染分析
  9. a1277以太网适配器驱动_福禄克DSX系列工业以太网连接器集锦
  10. 向量交点坐标公式_高中数学必修1-5常用公式(定理)
  11. Learun敏捷框架甘特图——摆脱项目管理的泥沼
  12. keras之分类问题和回归问题
  13. built a JNCIS LAB系列:Chapter 1 Communities v1.0
  14. Bzoj2037 [Sdoi2008]Sue的小球
  15. 微信小程序文本超出自动换行解决方案
  16. 按键--找色找图基础
  17. 如何获取一个基因家族的所有小麦基因
  18. 模型推荐丨新闻传播大数据项目案例模型分享
  19. CreateProcessAsUser的用法
  20. 如何写一个自动重复发消息的脚本,聪哥手把手教你(适配任何可发消息的app),亲测有效

热门文章

  1. 电影按分级分类(USA、HK)
  2. DP——2008 APAC local onsites C Millionaire
  3. 想知道路的尽头是什么与站在路的尽头回望
  4. AV1 码流分析器的搭建
  5. 喜时不诺,怒时不争,哀时不语,倦时有终
  6. 阴历表 Lunar calendar table 1900--2099
  7. 【ECMAScript】发展史、ECMA、编程语言、变量、JS值
  8. 闲话人事:我如何进行简历的筛选与人员的选择
  9. Matlab中waitfor函数用法
  10. 只是因为在人群中多看了HoloSens下一代摄像机一“眼”