在提出疑惑之前,先阐述一下需求,
目前在将一个摄像头的 SDK ( C++库)适配自己的一个视频流解码服务,这个摄像头的 SDK 是这样的工作原理:
在初始化 Env->调用实时预览接口->注册回调函数的方式来将摄像头的视频码流数据传送给 SDK 使用者。
此处一个 Env 代表一个摄像头设备。
我在使用 CGO 中可以将 Go 函数 export 给 C 代码来调用的 feature 的过程中,在注册回调函数这个阶段里调用我在 Go 中 export 的 Go 函数(函数名为 publishPackage ),将获取到的视频码流数据包装之后放入一个全局的 channel 里(这里的做法似乎不太合适,但由于经验有限,目前只能想到这样的方法),那么在并发的情况下,单独一个全局的 Channel 肯定是满足不了并发的场景的,于是愚钝的我使用了一个全局的 sync.Map 来存放不同 Env 的 Channel,Key 为 Env 的唯一 ID,在 publishPackage 这个函数中,通过 sync.Map.Load 方法拿到当前 Env 所属的 Channel 并将包装好的视频流数据写进 Channel 中。
我又另外提供了一个 RegistryReceiver 的函数,参数为一个 Channel,这个函数中会启动一个 Goroutine 通过 select 来检测当前 Env 所属的 Channel 中是否有视频码流数据,如果有则将视频码流数据写入参数传进来的 Channel 中,提供视频流解码服务来拿到视频码流数据,拿到数据之后再进行接下来的解码操作。
在以上的流程中,目前遇到的问题是在拿到 N 个 Package 之后程序将会无法响应掉,查不出来是哪里的问题(由于只是一个没有认真学习过 Golang 的彩笔)希望各位大佬可以帮忙分析一下。万分感谢!
PS:各位大佬如果看了代码之后请轻喷,代码风格有点一言难尽。