要挑战100毫秒级的p2s2p型直播,我们首先要了解延迟到底是怎么产生的?

1.推流端p采集原始画面,交给编码器编码,根据编码复杂度,编码器缓存,在这里就产生了延迟。(可控参数较多,影响较大)
2.推流端p编码后推送到s服务端,网络传输产生延迟。(以现在的网络环境,影响小)
3.服务端s接收地视频后进行协议转换,不同的服务实现可能会在这里造成一点延迟。(以现在的服务端性能,影响小)
4.播放端p播放,网络传输产生延迟。(以现在的网络环境,影响小)
5.播放端p解码渲染、缓冲队列产生延迟。(音视频同步、数据缓冲、延迟消除算法复杂,影响很大)

由此可以看出,要实现低延迟,重点优化推播两端是效果最明显的。

测试环境:
OBS设置x264软编码,CBR,2500kbps, veryfast,zerolatency,baseline,1s gop,0 buffer,视频尺寸1920×1080@30
推流到本机NMS-v3.7.3 (忽略网络对延迟的影响,测试极限条件)
NodePlayer.js-v0.5.56, bufferTime设置为0

实测,最低延迟79毫秒!

Supported

  • AudioDecoder can decode AAC, FLAC, MP3, Opus, and Vorbis.
  • VideoDecoder can decode VP8, VP9, H.264 and AV1 (AV1 not available on Android).
  • VideoEncoder can encode VP8 and VP9.
  • VideoTrackReader.
  • ImageDecoder can decode BMP, GIF, JPG, PNG, ICO, AVIF, and WebP.

Unsupported

  • AudioEncoder is not yet implemented.
  • VideoEncoder can encode H.264, but it is limited:
    • H.264 encoding is not available on all platforms.
    • The output format is Annex B. We expect the format to be AVC in the future.
  • new VideoFrame(pixelFormat, planes, frameInit) is not available.
  • ImageDecoder  can’t decode SVG. We don’t expect SVG to ever be supported.

Caveats

  • AudioDecoder and VideoDecoder call error(undefined) to report an error. We expect the value to be a DOMException in the future.
  • VideoDecoder, VideoEncoder, and EncodedVideoChunk are not available in Worker contexts. Worker support will be added in the future.
  • VideoEncoder does not emit VideoDecoderConfig objects to describe its output. We expect configs to be emitted in the future.
  • Constructing a VideoFrame from an ImageBitmap produces an I420 frame. We expect this to change to RGBA or an opaque format in the future.
  • In some cases a valid VideoFrame has format === null and planes === null. VideoFrame.createImageBitmap() is available. We expect to add explicit conversion APIs to address these cases in the future.
  • ImageFrame  does not provide YUV access. We expect that ImageDecoder will output VideoFrame objects in the future.
  • H.264 extradata and payload must be provided in AVC format.

Known Issues

AudioDecoder, VideoDecoder, and VideoEncoder may produce outputs or errors after calling reset().

有被爽到

最近实现了NMSv3接收GB28181设备注册,下发指令主动通知摄像头以RTP推流到NMS,转为RTMP, KMP, FLV播放。

NMSv3不是完整的GB28181实现,我将SIP信令与RTP流媒体服务器合二为一,仅作为实时视频取流的用途。

当我准备实现设备注册,密码验证时,找到一篇博文:https://blog.csdn.net/hiccupzhu/article/details/39696981

其中讲到的算法是:

HA1=MD5(username:realm:passwd) #username和realm在字段“Authorization”中可以找到,passwd这个是由客户端和服务器协商得到的,一般情况下UAC端存一个UAS也知道的密码就行了
HA2=MD5(Method:Uri) #Method一般有INVITE, ACK, OPTIONS, BYE, CANCEL, REGISTER;Uri可以在字段“Authorization”找到
response = MD5(HA1:nonce:HA2)

对比REGISTER中的response与计算的response,相同则验证通过。

但我却验证错误,仔细阅读了exosip这部分的代码后,终于找出差异:https://github.com/aurelihein/exosip/blob/master/src/jauth.c#L144

当设备第一次发送REGISTER,NMS回复401, 并附带

还有一种回复是

原来这个qop的设置与否,决定了验证算法的差异。

当不设置qop时,确实是使用上面的那种算法进行验证。而设置为”auth”后,则使用下面的这个算法:

HA1=MD5(username:realm:passwd) #username和realm在字段“Authorization”中可以找到,passwd这个是由客户端和服务器协商得到的,一般情况下UAC端存一个UAS也知道的密码就行了
HA2=MD5(Method:Uri) #Method一般有INVITE, ACK, OPTIONS, BYE, CANCEL, REGISTER;Uri可以在字段“Authorization”找到
response = MD5(HA1:nonce:nc:cnonce:qop:HA2)

可以看出,HA1、HA2是相同的,区别在于resopnse有差别。开发时需要注意这点,如果想使用简单的验证算法,回复401时,不要传qop=”auth”参数。

另外还有一种qop=”auth-int”的算法,这里由于决定权在服务端,所以不做详细研究。如果做向上级级联,则要根据上级401的参数来响应。

简介

实时视频+游戏操作是非常不错的娱乐体验方式,结合物联网设备可以开发诸如:远程抓娃娃、远程打气球、打野兔、射箭等项目。
NodePlayer.js-wasm版可以非常方便的集成到最新的白鹭引擎(v5.3以上)中使用,以下是我们总结的一个集成方法。

一、准备工作

1.NodePlayer.js wasm版

试用开发包请下载:https://cdn.nodemedia.cn/NodePlayer/0.5.39-wasm/NodePlayer_v0.5.39-wasm_trial.zip
授权用户请准备好wasm版

2.白鹭引擎 v5.3.8

3.Egret Compiler

4.Egret Wing 3

二、创建并打开工程

继续阅读

detectnet 可以直接打开rtsp网络摄像头作为输入源,进行实时视频分析,在监控领域有非常大的应用。

尝试了下打开rtmp流,没有成功,返回说不支持。

从日志输出来看是使用GStreamer。

如果是GStreamer,那当然应该支持rtmp才对。打开并修改源码
jetson-inference/utils/codec/gstDecoder.cpp

继续阅读

NVIDIA TensorRT™是一个高性能深度学习推理平台。它包括深度学习推理优化器和运行时,可为深度学习推理应用程序提供低延迟和高吞吐量。在推理期间,基于TensorRT的应用程序比仅CPU平台的执行速度快40倍。使用TensorRT,您可以优化在所有主要框架中培训的神经网络模型,以高精度校准低精度,最后部署到超大规模数据中心,嵌入式或汽车产品平台。

         TensorRT构建于NVIDIA的并行编程模型CUDA之上,使您能够利用CUDA-X AI中的库,开发工具和技术,为人工智能,自动机器,高性能计算和图形优化所有深度学习框架的推理。

         TensorRT为深度学习推理应用的生产部署提供INT8和FP16优化,例如视频流,语音识别,推荐和自然语言处理。降低精度推断可显着减少应用程序延迟,这是许多实时服务,自动和嵌入式应用程序的要求。

image.png

         您可以将训练有素的模型从每个深度学习框架导入TensorRT。应用优化后,TensorRT选择特定于平台的内核,以最大限度地提高数据中心,Jetson嵌入式平台和NVIDIA DRIVE自动驾驶平台中Tesla GPU的性能。

         为了在数据中心生产中使用AI模型,TensorRT推理服务器是一种容器化微服务,可最大化GPU利用率,并在节点上同时运行来自不同框架的多个模型。它利用Docker和Kubernetes无缝集成到DevOps架构中。

         使用TensorRT,开发人员可以专注于创建新颖的AI驱动的应用程序,而不是用于推理部署的性能调整。

继续阅读

最近得空,搞了一块Jetson Nano玩玩。

NVIDIA  在2019年NVIDIA GPU技术大会(GTC)上发布了Jetson Nano开发套件,这是一款售价99美元的计算机,现在可供嵌入式设计人员,研究人员和DIY制造商使用,在紧凑,易用的平台上提供现代AI的强大功能。完整的软件可编程性。Jetson Nano采用四核64位ARM CPU和128核集成NVIDIA GPU,可提供472 GFLOPS的计算性能。它还包括4GB LPDDR4存储器,采用高效,低功耗封装,具有5W / 10W功率模式和5V DC输入,如图1所示。

新发布的JetPack 4.2 SDK  为基于Ubuntu 18.04的Jetson Nano提供了完整的桌面Linux环境,具有加速图形,支持NVIDIA CUDA Toolkit 10.0,以及cuDNN 7.3和TensorRT等库。该SDK还包括本机安装流行的功能开源机器学习(ML)框架,如TensorFlow,PyTorch,Caffe,Keras和MXNet,以及计算机视觉和机器人开发的框架,如OpenCV和ROS。

完全兼容这些框架和NVIDIA领先的AI平台,可以比以往更轻松地将基于AI的推理工作负载部署到Jetson。Jetson Nano为各种复杂的深度神经网络(DNN)模型提供实时计算机视觉和推理。这些功能支持多传感器自主机器人,具有智能边缘分析的物联网设备和先进的AI系统。甚至转移学习也可以使用ML框架在Jetson Nano上本地重新训练网络。

话不多说直接开干。

继续阅读

clang在Windows下可以很方便的引用msys2的开发环境。

vscode在linux,mac下安装cmake tools插件也差不多能达到相同功能。

但该插件在windows下,想要引用msys2还是遇到问题了。

ctrl+p,>CMake:Edit User-Local CMake Kits 需要如下设置:

添加environmentVariables是关键

简述

NodePlayer.js设计之初只是为了播放http-flv协议,但经常有客户想要知道能否播放RTMP协议,甚至RTSP协议,以往我们的回答都是不能。web浏览器没有开放TCP/UDP协议,当然无法实现RTMP、RTSP播放了。

但从 NodePlayer.js-v0.7版本开始,我们已经实现RTMP协议的播放了!
当然,不是TCP协议的RTMP, 没有这个基础条件。我们实现的方式,是通过WebSocket协议来和一个 websocket 2 tcp 服务交换协议,最终和RTMP服务器建立连接。

本播放器无需flash插件,和video.js等播放RTMP的方式完全不同。

目的

如果您正在构建新的直播项目,其实无需使用本技术。如今的流媒体服务端或者云服务,基本上都支持HTTP-FLV甚至WebSocket-FLV。
本功能是为以往使用Flash-Media-Server, Adobe-Media-Server, Nginx-RTMP, Red5,Wowza等服务端构建项目的用户,在不改变现有架构的条件下,无痛迁移到HTML5播放器。

部署方法

实际上无需过多要求,只需要一个 websocket to tcp的桥接服务。
这里,我们以一个非常轻量级,且开放源代码的ws-tcp-relay项目为例。
项目地址:https://github.com/isobit/ws-tcp-relay

进入https://github.com/isobit/ws-tcp-relay/releases ,根据服务端系统选择并下载应用程序

下载后,linux系统下添加可执行权限,然后执行

参数说明:
-b 使用binary格式传输
-p 绑定本机8080端口监听websocket连接
192.168.0.3:1935 需要桥接的远端或者本地 rtmp服务,本机可以填 127.0.0.1:1935

播放方法

使用NodePlayer.js-v0.7版播放器,播放地址

即可

如果要去掉端口号, ws-tcp-relay改为监听80端口,但可能会和webserver冲突
这里不清楚nginx反向代理是否有能力转websocket to tcp,如果能的话那就更方便。

播放器演示地址

http://www.nodemedia.cn/uploads/nodeplayer_rtmp.html

使用前请先运行ws-tcp-relay服务

RTSP流?

理论上,也是可以的,敬请期待。