浏览器播放H265/HEVC视频的可行性分析

还记得我刚入行时,那时候3G还没普及,做视频只能做172×144,清晰点的320×240。取监控画面大多还是352×288,或者很高清的D1了。
在视频领域现如今,短短几年时间,网络带宽飞速提升,图像传感器的像素越来越大,人们对画质的追求也越来越高。1080只是起步,2K, 4K的应用也不在少数。

传统的H264算法在这时候捉襟见肘,更高级的编码规范应运而生。HEVC也就是H265,VP9,AV1,还有我国的视频标准AVS2就是它的继任者。谁能在这场较量中胜出呢。

高效率视频编码(High Efficiency Video Coding,简称HEVC),又称为H.265和MPEG-H第2部分,是一种视频压缩标准,被视为是ITU-T H.264/MPEG-4 AVC标准的继任者。

我接触到的业务很多和视频监控领域相关,近一两年来,越来越多的监控厂家新出厂的设备,默认采用H265视频编码了。当我们要部署这类视频应用时,客户端解码是个大问题。pc应用可以采用厂商提供的SDK,通用一点的办法是使用ffmpeg的HEVC解码器。而更多的企业应用更愿意部署在web平台,在浏览器中播放。

我们通过这个链接(1)可以查到,只有ie11,edge12-18具有硬件解码能力的才能支持。Apple系macOS在10.13 High Sierra,iOS在11以后可以原生支持。所有chrome系不支持。windows不提供软解解码h265的能力,只有显卡硬件支持才能支持,而且edge马上要更换到chrome平台了。毕竟H265授权费是很高的,像微软这种用户量级,那肯定是天价,干脆交给显卡厂商来处理。苹果本身是这个标准组织的成员,有大量这方面的专利,因此它很乐意推广这个标准。在WWDC17上,苹果就宣布HLS格式支持HEVC编码,需要使用fMP4进行切片。(2)

那么要实现通用的跨平台,跨浏览器支持的解码器方案,现如今只有1个方法,WASM,NodePlayer.js便支持这种方式。我也曾在一款海康NVR上发现它的web控制器也采用了这种方式,数据通过websocket传输,但不是一种通用的标准。当然这种方式解码性能不足,面对高清画面解码时要求本地机器有很强的单核处理性能。海康便要求一次只能播放一个高清主码流。而NodePlayer.js v0.6版,采用webworker方式,将多路解码分散到多个进程中,提升了多路视频打开时的处理能力。并且传输协议也是目前最常见的http-flv,websocket-flv,支持包括nms,阿里云直播服务。也兼容阿里云H265 over http-flv。

后记:其实我们还是有很多其它选择,google系开放的VP9,和VP9的继任者AV1,至少在Apple系以外可以得到广泛的支持。国家的视频标准AVS2,目前很少有接触到软硬件的应用。后期我会在AV1和AVS2上做一些研究,风云变幻谁又能说的定呢。

NMS v3系列教程之 八、relay规则鉴权模板

模板说明

创建relay中继任务,实际上就是rtmp的play或publish操作。
当我们连接远端服务器时,对方可能开启了鉴权规则,那么我们的链接也必须要附带鉴权参数。
由于目前常用的鉴权方式是附带过期时间戳的,因此每次请求时都应该是不同的签名。
当然您也可以预生成一个过期时间特别久的比如1年以后过期。
使用nms的relay规则,可以在创建时填入签名参数的模板,在nms进行relay中继任务创建时根据模板生成新的签名参数。

模板例子

nms模板

讲解:
前面我们的鉴权算法中有说明到,生成签名前的字符串需要流信息+过期时间+密码后md5
上面的模板字符串可以分为3个部分

继续阅读“NMS v3系列教程之 八、relay规则鉴权模板”

NMS v3系列教程之 七、从NVR\IPC拉取监控画面

需求简介

目前使用监控摄像头可以做非常多的行业应用,我们的客户案例中,涵盖了幼儿园监控手机直播,远程课堂直播,重点监控单位中心监控与手机监控,抓娃娃机,宠物监控远程喂食,甚至还有远程投币祈福等等等等,没有做不到只有想不到。
而传统监控摄像头统一的协议标准是RTSP,而直播行业目前统一的标准是RTMP。要将两者结合起来最简单的方式,是通过ffmpeg命令输入rtsp,输出rtmp。将视频流分发到自建服务端或者直播云服务,再由各个客户端根据需求播放rtmp或在http-flv。
这种方式需要解决如下问题

  1. rtsp流地址生成与通道管理,各个厂商之间的流地址格式是不同的
  2. 进程调用的维护,错误处理与断线重连问题
  3. 原生rtmp协议不支持监控行业日益流行的H265视频
  4. 部分云服务和web客户端不支持监控设备常见的G.711音频

解决方案

  • NMS内置了一个Relay中继模块,可以通过web后台简单添加rtsp拉取任务,无需编写配置文件,无需重启服务。
  • 目前支持海康,大华,宇视直接配置参数创建拉取任务,后续会增加其他厂商的规则,如果您是监控厂商,想要在NMS中增加品牌RTSP规则,请直接与我们的商务服务联系。
  • 也支持自定义模式手动输入rtsp地址和rtmp地址。
  • 任务创建后,服务会立刻去执行,并且在web后台反馈状态信息。relay任务也会在输入或输出中一项断开后自动重连,并将relay任务写入本地数据库,在nms服务程序重启后继续执行,直到任务被删除。
  • relay模块支持H265编码推拉流,NMS也支持h265编码的RTMP协议

使用方法

继续阅读“NMS v3系列教程之 七、从NVR\IPC拉取监控画面”

NMS v3系列教程之 六、直播鉴权

NMS内建支持简单且非常安全的,基于密码和过期时间的鉴权模式。
与阿里云的直播鉴权模式比较类似。

开启方法

打开config.ini

鉴权密码

播放鉴权开关

0-关闭,1-打开

推流鉴权开关

0-关闭,1-打开

使用方法

继续阅读“NMS v3系列教程之 六、直播鉴权”

NMS v3系列教程之 五、事件通知

功能简介

NMS支持在服务端收到流开始播放,结束播放,开始推流,结束推流时回调一个web服务接口。
可作为后台管理程序进行自定义鉴权,统计推流播放信息包括ip,开始结束时间,url参数,使用流量等。

开启方法

打开config.ini文件,取消notify_url前的注释,填上接收回调的web api地址。
如:

简单用例

我们使用nodejs创建一个简单的web api接口,并打印接收到的信息

继续阅读“NMS v3系列教程之 五、事件通知”

NMS v3系列教程之 三、基本使用

nms直接运行后,可以看到控制台输出打印

可以看到 rtmp服务绑定1935端口,http和https端口分别是8000和8443

1935作为rtmp的默认端口,可以在使用时不填写,比如

8000端口作为http-flv和websocket-flv端口,需要跟上端口号和.flv后缀

API接口和管理后台复用8000和8443端口,浏览器直接访问web后台

http://server_ip:8000/

NMS v3系列教程之 二、下载安装

Windows版

https://nodemedia.oss-cn-hangzhou.aliyuncs.com/nms/3.1.15/nms-windows-amd64-20191211.zip

  • 解压缩后双击运行nms.exe
  • 双击service.bat 安装为服务并自动运行
  • 在当前目录打开控制台输出 service.bat uninstall 停止并卸载服务

Linux x86_64 版

https://nodemedia.oss-cn-hangzhou.aliyuncs.com/nms/3.1.15/nms-linux-amd64-20191211.tar.gz

  • 解压缩后进入目录,在控制台输入 ./nms 运行
  • 在当前程序目录下执行 sudo ./service.sh install 安装服务并自动运行
  • 在当前程序目录下执行 sudo ./service.sh uninstall 停止并卸载服务

Linux arm64 版

https://nodemedia.oss-cn-hangzhou.aliyuncs.com/nms/3.1.15/nms-linux-arm64-20191211.tar.gz

Mac版

https://nodemedia.oss-cn-hangzhou.aliyuncs.com/nms/3.1.15/nms-darwin-amd64-20191211.tar.gz

  • 解压缩后进入目录,在控制台输入 ./nms 运行

Docker版

docker run -it —name nms -p 1935:1935 -p 8000:8000 -p 8443:8443 illuspas/nms

NMS v3系列教程之 一、简介

Node Media Server 以下简称nms,最初是以node.js实现的RTMP协议流媒体服务端。
最新v3版使用go语言重写了整个项目,获得了更好的并发性能,也拥有了更强的功能。

特性

  • 支持多核,万级并发
  • 支持Windows/MacOS/Linux
  • 支持X86_64/ARM64架构
  • 支持Rtmp/Http-FLV/Websocket-FLV/JT-T1078协议接入
  • 支持Https/Wss加密协议接入
  • 支持H.264,H.265视频编码
  • 支持AAC,Speex,NellyMoser,G711音频编码
  • 支持非AAC编码推流时,零延迟转码AAC
  • 支持web后台快捷添加海康、大华、宇视RTSP拉流转发
  • 支持配置自定义RTSP、RTMP地址拉取转发
  • 支持拉流转发任务持久化存储
  • 支持拉流转发任务断线自动重连
  • 支持创建转推拉规则时基于go模板方式的自定义鉴权参数(可支持nms,阿里云,腾讯云等鉴权规则)
  • 支持详细数据统计
  • 支持Gop_Cache
  • 支持管理型后台程序
  • 支持流状态http回调
  • 支持规则转推,多路push
  • 支持规则转拉

计划

  • 支持低延迟HLS – v3.2
  • 支持WebRTC协议 – v3.2
  • 支持GB28181协议 – v3.3
  • 支持kcp-flv超低延迟,弱网满速传输 – v3.4
  • 支持MIPS64EL,armv7架构
  • 替换Nodelayer.js作后台视频预览播放器,以支持H.265视频

文档

http://www.nodemedia.cn/doc/web/#/5

XCGO:CGO的跨平台编译器

上一篇《用Go语言开发的新版NodeMediaServer》说到使用了CGO实现的内置音频实时转码器。开发中遇到一个很严重的问题:无法直接生成跨平台可执行程序了。

首选我们了解到,Go语言是可以在开发平台直接生成多个目标架构和系统的可执行程序。只需要在编译前指定GOOS和GOARCH,便可以直接生成目标文件。

但当使用了CGO,便失去了这种能力。在本机平台以外,需要设置CGO_ENABLED,并且指定CC. linux和macos还好,windows也是需要gcc工具链,这个就需要部署MinGW等很复杂的操作。

在多次尝试后,受到这个项目的启发,编写了一个更简单的xcgo docker image.

继续阅读“XCGO:CGO的跨平台编译器”