gin中间件[gin中间件获取函数返回值]

以下提供两种方案: (1)Gin+WebSocket+FFMPEG实现rtsp转码,参考: 通过FFMPEG把rstp转成http,ginrtsp作为转发服务器,但需要自己写相应接口,需要了解go语言

作为虚拟币行业人士而言,我们经常都会说到gin中间件时有很多细节是需要注意的。你知道gin中间件获取函数返回值?今天就让小编跟你们说说吧!

Engine 是 gin 框架的一个实例,它包含了多路复用器、中间件和配置中心。

gin 通过 Engine.Run(addr …string) 来启动服务,最终调用的是 http.ListenAndServe(address, engine) ,其中第二个参数应当是一个 Handler 接口的实现,即 engine 实现了此接口:

Engine.ServeHTTP() 会先初始化一个空的上下文,然后挂上请求 c.Reuqest = req ,随后执行 engine.handlerHTTPRequest(c) (包含主要处理逻辑的函数)。

以上就是正常处理一个请求的主要逻辑,其他的就现阶段来说先忽略了。

Engine 组合了 RouterGroup。

RouterGroup 实现了 IRouter 接口,IRouter 接口是 IRoutes 接口和 Group 函数组合而成。

RouterGroup 的结构体只有四个属性:

当新建 Engine 时,会初始化一个 RouterGroup 结构,RouterGroup 是组合在 Engine 中的(所以 Engine 可以调用 RouterGroup 的所有方法),同时 Engine 的引用也记录在了 RouterGroup 上。

如上,RouterGroup 实现了 IRouter 接口,下面是一些方法的实现。

gin 通过上方 RouterGroup 暴露的几个方法添加路由,底层使用的方法是 Engine.addRoute(method, path string, handlers HandlerChain) 。

Engine.trees 属性是存储所有路由信息的总入口。它是一个切片,其中每个元素对应一种 method 并且是一个多叉树的根节点。

当 addRoute 时,先根据 method 找到对应的 tree (Engine.trees[i])。然后会比较 加入者 的 path 和 node 中的 path 相似的部分, 相似的部分 作为 父结点,不同的部分作为 子结点。以 多叉树 的方式存储下来。

这里会把 URL 中的路由变量也当作字符串存入树中,因为相同 URL 他们的变量也是一样的。

当请求进来时,因为 Engine 实现了 Handler 接口,所以最后会调用到 Engine.ServeHTTP 内。

找路径在

root.getValue() 比较复杂,这里就不多解释了。

gin@v1.7.7 context.go

Context 中定义了一些属性和方法,用于扩展一些功能。

可以看到,这些方法主要用来获取 gin 自身 Context 的一些信息。

Context 中保存了所有 handlers 列表,存在 Context.handlers 数组中,并用下标 Context.index 标记当前执行的位置。

当主动取消调用链时,会将 index 设置成一个最大值 63( math.MaxInt8 / 2 ),也即调用链最大支持 64 个函数。

Context 中还提供了其他一些函数,当取消调用链的时候,可以设置请求返回的状态码和返回数据信息等。

Context 中的 httpWriter 整理一下。

gin 在 Context 中定义了错误信息字段 Context.Errors 切片,可以链式存储错误信息。

Go 原生的 Context 是通过 ValueContext 来存储元数据信息的,每个 ValueContext 只能存储一对信息,存储多个信息对需要将许多 ValueContext 组成链条,读写很不高效。

gin 的 Context 中存的元数据数据是存在 Context.Keys map[string]interface{} 属性中的,比起原生的 Context 使用起来会更高效。

是指用在 URL 路径中设置的参数,如 /user/:id 的 id 参数。

存储在 Context.Params 属性中,其本质是一个切片,每一个元素是一个 K/V 元组。

因此,在 URL 中是可以使用重复的变量名的(如 /test/:id/case/:id ),但获取值就需要自己从属性中获取了(如: c.Params[0] )。

Query 类是用在 URL 后的参数部分(如: ?id=1 )。

gin 通过 Context.queryCache 属性存储 query 参数,在调用获取 Query 参数时以懒加载的方式初始化: c.queryCache = c.Request.URL.Query() 。

需要注意的是它也支持传入 map 和 array,map 的传入需要像这样 ?m[k1]=v1m[k2]=v2 ,array 的传入像这样 ?a=1a=2 。

包含 PostForm、FormFile、MultipartForm 等。

先略

gin 为方便使用,通过绑定引擎设置了自动绑定用户输入和结构数据的方法。

这里包含设置状态码、设置响应头以及等信息。

只说一些值得注意的

这些方法除了 .Value() 方法外,其他都是返回的默认空值,略。

第一个:Beego框架

Beego框架是astaxie的GOWeb开发的开源框架。Beego框架最大的特点是由八个大的基础模块组成,八大基础模块的特点是可以根据自己的需要进行引入,模块相互独立,模块之间耦合性低。

相应的Beego的缺点就是全部使用时比较臃肿,通过bee工具来构建项目时,直接生成项目目录和耦合关系,从而会导致在项目开发过程中受制性较大。

第二个:Gin框架

Gin是一个GOlang的微框架,封装比较优雅,API友好,源码注释比较明确,已经发布了1.0版本;具有快速灵活、容错方便等特点,其实对于golang而言,web框架的依赖远比Python、Java更小。

目前在很多使用golang的中小型公司中进行业务开发,使用Gin框架的很多,大家如果想使用golang进行熟练Web开发,可以多关注一下这个框架。

第三个:Iris框架

Iris框架在其官方网站上被描述为GO开发中最快的Web框架,并给出了多框架和多语言之前的性能对比。目前在github上,Iris框架已经收获了14433个star和1493个fork,可见是非常受欢迎的。

在实际开发中,Iris框架与Gin框架的学习曲线几乎相同,所以掌握了Gin就可以轻松掌握Iris框架。

第四个:Echo框架

也是golang的微型Web框架,其具备快速HTTP路由器、支持扩展中间件,同时还支持静态文件服务、Websocket以及支持制定绑定函数,制定相应渲染函数,并允许使用任意的HTML模版引擎。

rtsp流在主流浏览器并不支持直接播放。比如大华的视频流:rtsp://admin:123456@

192.168.10.129/cam/realmonitor?channel=1subtype=0,用vlc可以直接播放。但在浏览器会报ERR_UNKNOWN_URL_SCHEME。那如何在浏览器中播放呢。

以下列出几种方案。

1、安装插件(chrome最新版基本都不支持)

类如:kurento,vlc插件(谷歌浏览器版本41以下),vgx插件(不支持高版本,chrome72.0版本可用)等。

2、安装软件(中间件,基本都付费)

类如:Appemit(调用vlc插件播放rtsp),可以免安装的,目前只能windows,免费版会有提示。

猿大师中间件(底层调用VLC的ActiveX控件,实现在主流浏览器网页中内嵌播放多路RTSP的实时视频流),中间件收费的。

PluginOK(牛插)中间件。底层调用ActiveX控件VlcOcx.dll。(商业用途需付费使用)

3、服务器拉流转发及协议转换

示意图如下所示:

推流————–服务器转发————–拉流

方法一览:

a,vlc软件串流到http协议 ,网页显示几个视频需启动几个vlc,只适合应急场景。

b,html5 + websocket_rtsp_proxy 实现视频流直播 ,基于MSE(Media Source Extensions,W3C),扩展H5的功能。

步骤:服务器安装streamedian服务器,客户端通过video标签播放。

原型图:

价格:

c.基于nginx的rsmp转发

基于nginx实现rtmp转化,用flash实现播放。由于flash目前大多浏览器默认禁用,不推荐此方式。

步骤:安装ffmpeg工具,安装nginx。

另外nginx-rtmp-module也支持HLS协议,可以搭建基于hls的直播服务器。

d.rtsp转hls播放,通过ffmpeg转码

步骤:安装ffmpeg工具,ffmpeg转码。

形如:

ffmpeg -i “rtsp://admin:123456@192.168.10.129/cam/realmonitor?channel=1subtype=0” -c copy -f hls -hls_time 2.0 -hls_list_size 0 -hls_wrap 15 “D:/hls/test.m3u8”

缺点是直播流延时很大,对实时要求比较高的不满足要求。

案例:基于EasyDarwin拾建转码服务器。参考地址:

通过存储的m3u8去读取。

e.websocket代理推送,FFMPEG转码

此方法与a,b类似。但更实用。

以下提供两种方案:

(1)Gin+WebSocket+FFMPEG实现rtsp转码,参考:

通过FFMPEG把rstp转成http,ginrtsp作为转发服务器,但需要自己写相应接口,需要了解go语言。

(2)node + ffmpeg + websocket + flv.js,参考:

步骤:在node服务中建立websocket;通过fluent-ffmpeg转码,将RTSP 流转为flv格式;通过flv.js连接websocket,并对获取的flv格式视频数据进行渲染播放。

import WebSocket from ‘ws’import webSocketStream from ‘websocket-stream/stream’import ffmpeg from ‘fluent-ffmpeg’// 建立WebSocket服务const wss = new WebSocket.Server({ port: 8888, perMessageDeflate: false })// 监听连接wss.on(‘connection’, handleConnection)// 连接时触发事件function handleConnection (ws, req) {? // 获取前端请求的流地址(前端websocket连接时后面带上流地址)? const url = req.url.slice(1)? // 传入连接的ws客户端 实例化一个流? const stream = webSocketStream(ws, { binary: true })? // 通过ffmpeg命令 对实时流进行格式转换 输出flv格式? const ffmpegCommand = ffmpeg(url)? ? .addInputOption(‘-analyzeduration’, ‘100000’, ‘-max_delay’, ‘1000000’)? ? .on(‘start’, function () { console.log(‘Stream started.’) })? ? .on(‘codecData’, function () { console.log(‘Stream codecData.’) })? ? .on(‘error’, function (err) {? ? ? console.log(‘An error occured: ‘, err.message)? ? ? stream.end()? ? })? ? .on(‘end’, function () {? ? ? console.log(‘Stream end!’)? ? ? stream.end()? ? })? ? .outputFormat(‘flv’).videoCodec(‘copy’).noAudio()? stream.on(‘close’, function () {? ? ffmpegCommand.kill(‘SIGKILL’)? })? try {? ? // 执行命令 传输到实例流中返回给客户端? ? ffmpegCommand.pipe(stream)? } catch (error) {? ? console.log(error)? }}

优点全部基于js。前端即可搞定。

参考:

第一个:Beego框架

Beego框架是astaxie的GOWeb开发的开源框架。Beego框架最大的特点是由八个大的基础模块组成,八大基础模块的特点是可以根据自己的需要进行引入,模块相互独立,模块之间耦合性低。

相应的Beego的缺点就是全部使用时比较臃肿,通过bee工具来构建项目时,直接生成项目目录和耦合关系,从而会导致在项目开发过程中受制性较大。

第二个:Gin框架

Gin是一个GOlang的微框架,封装比较优雅,API友好,源码注释比较明确,已经发布了1.0版本;具有快速灵活、容错方便等特点,其实对于golang而言,web框架的依赖远比Python、Java更小。

目前在很多使用golang的中小型公司中进行业务开发,使用Gin框架的很多,大家如果想使用golang进行熟练Web开发,可以多关注一下这个框架。

第三个:Iris框架

Iris框架在其官方网站上被描述为GO开发中最快的Web框架,并给出了多框架和多语言之前的性能对比。目前在github上,Iris框架已经收获了14433个star和1493个fork,可见是非常受欢迎的。

在实际开发中,Iris框架与Gin框架的学习曲线几乎相同,所以掌握了Gin就可以轻松掌握Iris框架。

第四个:Echo框架

也是golang的微型Web框架,其具备快速HTTP路由器、支持扩展中间件,同时还支持静态文件服务、Websocket以及支持制定绑定函数,制定相应渲染函数,并允许使用任意的HTML模版引擎。

感谢您阅读本篇对gin中间件的详细介绍,如果你对gin中间件获取函数返回值还不够了解,想进一步学习关于gin中间件的知识,可以在本站首页搜索你想知道的!

关键词: 框架 gin ffmpeg
本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 931614094@qq.com 举报,一经查实,本站将立刻删除。
gin中间件[gin中间件获取函数返回值]文档下载: PDF DOC TXT