爱智EdgerOS之深入解析如何应用爱智的视频流模块完成拉流

2023-12-09 03:44

本文主要是介绍爱智EdgerOS之深入解析如何应用爱智的视频流模块完成拉流,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、ONVIF 规范和常见视频流传输协议

① ONVIF 规范

  • 随着视频监控产业链的成熟,市面上陆陆续续出现了各式各样的网络摄像设备,这些设备都需要通讯协议才能进行数据传输。早期厂商都采用私有协议,但是现在厂商分工明确,有的负责生产制造摄像头,有的负责开发视频服务器,有的负责方案集成并销售,私有协议存在严重的兼容问题。类似于 HTTP 协议对浏览器和服务器之间通信的规范,网络摄像头的接口也出现了标准化,其中 ONVIF 支持厂商的数目、厂商的知名度和市场占有率遥遥领先。
  • ONVIF 规范描述了网络视频的模型、接口、数据类型以及数据交互的模式,并复用了一些现有的标准,如 WS 系列标准等,目标是实现一个网络视频框架协议,使不同厂商所生产的网络视频产品(包括摄录前端、录像设备等)完全互通。ONVIF 规范中设备管理和控制部分所定义的接口均以 Web Services 的形式提供。ONVIF 规范涵盖了完全的 XML 及 WSDL 的定义。每一个支持 ONVIF 规范的终端设备均须提供与功能相应的 Web Service。服务端与客户端的简单数据交互采用 SOAP 协议,音视频流则通过 RTP / RTSP 进行。

在这里插入图片描述

② 视频流传输协议

在这里插入图片描述

  • http-flv / ws-flv
    • HTTP 协议中有个 Content-Length 字段,代表 HTTP 的 body 部分的长度。服务器回复 HTTP 请求的时候如果有这个字段,客户端就接收这个长度的数据然后就认为数据传输完成了,如果服务器回复 HTTP 请求中没有这个字段,客户端就一直接收数据,直到服务器跟客户端的 socket 连接断开。要流式传输 flv 文件,服务器是不可能预先知道内容大小的,这时就可以使用 Transfer-Encoding: chunked 模式来连续分块传输数据。
    • http-flv 能够较好的穿透防火墙,它是基于 HTTP / 80 传输,有效避免被防火墙拦截。除此之外,它可以通过 HTTP 302 跳转灵活调度/负载均衡,同时支持使用 HTTPS 加密传输。ws-flv 和 http-flv 类似,区别就是 http-flv 基于 HTTP ,只能单向传输数据,而 ws-flv 基于 WS 可以双向传输数据。
  • RTMP
    • RTMP 是 Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。由 Macromedia 开发的一套视频直播协议,现在属于 Adobe。因为 RTMP 是通过互联网在 Flash 播放器与一个服务器之间传输流媒体音频、视频和数据而开发的一个专有协议,早期的网页想要直播需要 Flash 播放器,所以 RTMP 协议是最好的选择,互联网公司也在此协议上有了不少的技术积累,国内的 CDN 对 RTMP 做过优化。
    • 随着 HTML5 的普及和 Flash 的停止更新,理论上会被其他协议取代,但是由于类似 flv.js 库的出现,使得在 HTML5 网页同样可以播放 flv 格式的视频,所以 RTMP 依然是当前视频直播的主流协议。
  • HLS
    • HLS 是 HTTP Live Streaming 的首字母缩写,是由苹果公司提出基于HTTP 的流媒体网络传输协议,可实现流媒体的直播和点播,主要应用在 iOS 系统,为 iOS 设备(如 iPhone、iPad)提供音视频直播和点播方案。HLS 协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件( MPEG-TS 格式),而客户端则不断的下载并播放这些小文件, 因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。
    • iOS 和 Android 都天然支持这种协议,配置简单,直接使用 video 标签即可。这是一种以点播的方式实现的直播,且分段文件的时长很短,因为客户端可以比较快速的切换码率,用于适应不同的宽带条件。但是由于这种技术特性,导致它的延迟会高于普通的流媒体直播协议。磁盘存储和处理 HLS 协议产生的大量小文件,会影响服务端的响应速度,且损耗磁盘的正常寿命。
  • RTSP
    • RTSP(Real Time Streaming Protocol)是由 Real Network 和 Netscape 共同提出的如何有效地在 IP 网络上传输流媒体数据的应用层协议。和基于 HTTP 协议的流媒体网络传输协议不同,RTSP 是双向通信的,客户端和服务端都可以主动发起请求。
    • RTSP 对流媒体提供了诸如暂停,快进等控制,而它本身并不传输数据,RTSP 的作用相当于流媒体服务器的远程控制。服务器端可以自行选择使用 TCP 或 UDP 来传送串流内容,它的语法和运作跟 HTTP 1.1 类似,但并不特别强调时间同步,所以比较能容忍网络延迟。而且允许同时多个串流需求控制(Multicast),除了可以降低服务器端的网络用量,还可以支持多方视频会议(Video Conference)。

在这里插入图片描述

  • DASH
    • DASH(Dynamic Adaptive Streaming over HTTP)全称为“基于 HTTP 的动态自适应流”,是一种自适应比特率流技术,使高质量流媒体可以通过传统的 HTTP 网络服务器以互联网传递。
    • 类似苹果公司的 HTTP Live Streaming(HLS)方案,DASH 会将内容分解成一系列小型的基于 HTTP 的文件片段,每个片段包含很短长度的可播放内容,而内容总长度可能长达数小时(例如电影或体育赛事直播)。内容将被制成多种比特率的备选片段,以提供多种比特率的版本供选用。当内容被客户端回放时,客户端将根据当前网络条件自动选择下载和播放哪一个备选方案。客户端将选择可及时下载的最高比特率片段进行播放,从而避免播放卡顿或重新缓冲事件。也因如此,客户端可以无缝适应不断变化的网络条件并提供高质量的播放体验,拥有更少的卡顿与重新缓冲发生率。

二、EdgerOS 对流媒体的支持

  • 在日常生活场景中,如刷脸的门禁、无人的车库和物品识别等,都会用到视频流,EdgerOS 也能开发者提供了 MediaDecoder,WebMedia 两个模块,使得在开发的过程中可以简单方便的将视频流推送给前端。MediaDecoder 负责将设备推过来的实时音视频流解码并转为指定格式(视频宽高、帧率、像素)的目标视频。
  • 同时使用 WebMedia 可以创建一个流媒体的服务,这个服务支持双传输通道,stream 通道支持 http-flv 和 ws-flv 协议,用于传输视频流;data 通道支持 WS 协议,这样客户端和服务端直接可以相互发送简单的控制指令。客户端通过 stream 通道接收视频流,使用 flv.js 等开源库在网页上实现实时直播的功能。

在这里插入图片描述

  • EdgerOS 通过几个模块用于可以处理 MediaDecoder 解码生成的目标视频流,以适应于不同的场景,如人脸识别,大致流程如下:

在这里插入图片描述

三、推流和拉流

  • 推流:将直播的内容推送至服务器的过程,其实就是将现场的视频信号传到网络的过程。“推流”对网络要求比较高,如果网络不稳定,直播效果就会很差,观众观看直播时就会发生卡顿等现象,观看体验很是糟糕。要想用于推流还必须把音视频数据使用传输协议进行封装,变成流数据。常用的流传输协议有 RTSP、RTMP、HLS 等,使用 RTMP 传输的延时通常在 1–3 秒,对于手机直播这种实时性要求非常高的场景,RTMP 也成为手机直播中最常用的流传输协议。最后通过一定的 QoS 算法将音视频流数据推送到网络端,通过 CDN 进行分发。
  • 拉流:指服务器已有直播内容,用指定地址进行拉取的过程。即是指服务器里面有流媒体视频文件,这些视频文件根据不同的网络协议类型(如 RTMP、RTSP、HTTP 等)被读取的过程,称之为拉流,日常观看视频和直播就是一个拉流的过程。

在这里插入图片描述

四、如何应用爱智的视频流模块完成拉流?

① 引入模块

  • 在拉取视频流的过程中,需要用到 WebMedia 模块和 MediaDecoder 模块,同时需要建立一个 WebApp 来与前端进行通讯并将其绑定在 WebMedia 上:
var WebApp = require('webapp');
var MediaDecoder = require('mediadecoder');
var WebMedia = require('webmedia');

② 选择流媒体协议并绑定

  • WebMedia 支持 http-flv 和 ws-flv 两种协议来传输视频流,可以根据自己的实际需求选择流媒体协议。将流媒体协议写入配置并在 WebMedia 启动时绑定到 WebMedia 上。
  • http-flv:
var opts = {mode: 1,path: '/live.flv',mediaSource: {source: 'flv',},streamChannel: {protocol: 'xhr',},
}
var server = WebMedia.createServer(opts, app);
  • ws-flv:

var opts = {mode: 1,path: '/live.flv',mediaSource: {source: 'flv',},streamChannel: {protocol: 'ws',server: wsSer},
}
var server = WebMedia.createServer(opts, app);

③ 在移动端查看拉流URL

  • 当 WebMedia 服务器启动成功后,需要启动媒体解码模块 MediaDecoder 并绑定拉流的 URL,可以在手机推流应用的设置中查看 URL:

在这里插入图片描述

④ 创建视频流解码模块

  • 使用 MediaDecoder 的接口来配置拉取视频流并解码的配置,配置完成后监听 remux 事件和 header 事件,将监听到的数据推入向前端发送视频流的通道中,完成视频流的拉取,解析和推送过程:

server.on('start', () => {var netcam = new MediaDecoder().open('rtsp://192.168.128.102:8554/live.sdp', {proto: 'tcp'}, 5000);netcam.destVideoFormat({width: 640, height: 360, fps: 1, pixelFormat: MediaDecoder.PIX_FMT_RGB24, noDrop: false, disable: false});netcam.destAudioFormat({disable: false});netcam.remuxFormat({enable: true, enableAudio: true, audioFormat:'aac', format: 'flv'});netcam.on('remux', (frame) => {var buf = Buffer.from(frame.arrayBuffer);server.pushStream(buf);});netcam.on('header', (frame) => {var buf = Buffer.from(frame.arrayBuffer);server.pushStream(buf);});netcam.start();
});

⑤ MediaDecoder 的配置接口详解

  • mediadecoder.destVideoFormat(fmt) 设置媒体解码器的目标视频格式:
    • fmt {Object} 目标视频格式;
    • return {Boolean} 成功则返回 true,否则返回 false。
  • 目标视频格式对象包含以下成员:
    • disable {Boolean} 是否禁用视频
    • width {Integer} 视频宽度
    • height {Integer} 视频高度
    • pixelFormat {Integer} 视频像素格式
    • fps {Integer} 视频帧率
  • mediadecoder.destAudioFormat(fmt) 设置媒体解码器的目标音频格式:
    • fmt {Object} 目标音频格式
    • return {Boolean} 成功则返回 true,否则返回 false
  • 目标音频格式对象包含以下成员:
    • disable {Boolean} 是否禁用音频
    • channelLayout{String} 音频通道布局
    • channels{Integer} 音频通道数
    • sampleRate {Integer} 音频采样率
    • sampleFormat {Integer} 音频帧格式
  • mediadecoder.remuxFormat(fmt) 设置媒体解码器的 remux 格式。remux 数据主要用于直播服务器和视频录制:
    • fmt{Object} remux 格式
    • return {Boolean} 成功则返回 true,否则返回 false
  • 目标音频格式对象包含以下成员:
    • enable{Boolean} 是否启用 remux
    • enableAudio{Boolean} 是否启用音频
    • audioFormat {String} 音频压缩格式
    • format {String} 目标媒体格式,默认为 flv 格式。
  • 需要注意的一点是,当需要拉取视频的同时还要拉取音频信息,那么就要将 MediaDecoder.remuxFormat(),接口中的 audioFormat 参数设置为 AAC(‘aac’),目前只支持这种格式的压缩。

⑥ 测试视频流传输

  • 编写简单的前端测试视频流是否推送成功,前端使用到 NodePlayer 工具处理显示 flv 文件。
  • NodePlayer 是一款能够播放 http-flv/websocket 协议直播流的工具,其特点是能够在 PC \ Android \ iOS 的浏览器 Webview 内实现毫秒级低延迟直播播放。并能够软解码 H.264 / H.265+AAC 流,WebGL 视频渲染,WebAudio 音频播放。支持在微信公众号、朋友圈分享中打开。
  • NodePlayer 下载地址:https://www.nodemedia.cn/doc/web/#/1?page_id=1
  • 前端测试代码:
<html>
<div><canvas id="video1" style="width:640px;height:480px;background-color: black;"></canvas>
</div>
<body>
<script type="text/javascript" src="./NodePlayer.min.js"></script>
<script>
var player;NodePlayer.load(()=>{player = new NodePlayer();});
player.setView("video1");player.on("start", () => {
// 当连接成功并收到数据
});
player.on("stop", () => {
// 当本地stop或远端断开连接
});
player.on("error", (e) => {
// 当连接错误或播放中发生错误
});
player.on("videoInfo", (w, h) => {//当解析出视频信息时回调console.log("player on video info width=" + w + " height=" + h);
})
player.on("audioInfo", (r, c) => {//当解析出音频信息时回调console.log("player on audio info samplerate=" + r + " channels=" + c);
})
player.on("stats", (stats) => {
// 每秒回调一次流统计信息console.log("player on stats=", stats);
})player.setVolume(1000)
player.start("http://192.168.128.1:10002/live.flv"); 
</script>
</body>
</html>

这篇关于爱智EdgerOS之深入解析如何应用爱智的视频流模块完成拉流的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/472349

相关文章

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

java中的HashSet与 == 和 equals的区别示例解析

《java中的HashSet与==和equals的区别示例解析》HashSet是Java中基于哈希表实现的集合类,特点包括:元素唯一、无序和可包含null,本文给大家介绍java中的HashSe... 目录什么是HashSetHashSet 的主要特点是HashSet 的常用方法hasSet存储为啥是无序的

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用