渴望wlb的仰泳鲈鱼很郁闷 level
获赞
0
粉丝
2
关注
18
看过 TA
13
华南理工大学
2025
golang
IP属地:广东
111
私信
关注
global/database/mysql/mysql.go下定义了全局数据库连接对象global.DB:var Db *gorm.DBfunc ReturnsInstance() *gorm.DB {   var mysqlConfig = config.Config.SqlConfig   //sql日志记录   myLogger := logger.New(      //设置Logger      //NewMyWriter(),      //输出在控制台,方便debug      log.New(os.Stdout, "\r\n", log.LstdFlags),      logger.Config{         LogLevel:                  logger.Silent, //仅仅在控制台输出指定Debug的语句         IgnoreRecordNotFoundError: true,          // 忽略ErrRecordNotFound(记录未找到)错误         Colorful:                  true,          // 禁用彩色打印      },   )   b := retry.NewFibonacci(10 * time.Second)   ctx := context.Background()   if err := retry.Do(ctx, retry.WithMaxRetries(5, b), func(ctx context.Context) error {      // 创建链接      var err error      dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?parseTime=true&loc=Local", mysqlConfig.User, mysqlConfig.Password, mysqlConfig.IP, mysqlConfig.Port, mysqlConfig.Database)      Db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{         Logger: myLogger,      })      if err != nil {         return err      }      if Db.Error != nil {         return err      }      return nil   }); err != nil {      // handle error      log.Fatalf("重连5次后依旧数据库链接错误,请检查mysql服务是否正常- %v \n", err)   }   return Db}global/global.go下定义init函数,项目启动时执行init函数,初始化各个示例,包括数据库连接和消费者:func init() {   Logger = log.ReturnsInstance()   RedisDb = RedisDbFun.ReturnsInstance()   Db = mysql.ReturnsInstance()   Config = config.ReturnsInstance()   //普通队列的生产者   NormalProducer = msgQueue.ReturnsNormalInstance()   //延迟队列的生产者   DelayProducer = msgQueue.ReturnsDelayInstance()   //启动延时队列的消费者和普通队列的消费者   msgQueue.StartDelayConsumer()   msgQueue.StartNormalConsumer()}var (   Logger         *logrus.Logger   Config         *config.Info   Db             *gorm.DB   RedisDb        *redis.Client   NormalProducer *kafka.Conn   DelayProducer  *kafka.Conn)然后调用global.Db即可进行数据库操作。同时在global/msgQueue/consumer.go中定义了消费者,监听定时发布视频的消息,并调用setVideoIsVisible将对应视频的is_visible字段置为1:// StartNormalConsumer 启动普通队列(即时处理)的消费者func StartNormalConsumer() {   normalReader := kafka.NewReader(kafka.ReaderConfig{      Brokers:     []string{consts.KafkaServerAddr},      Topic:       consts.KafkaTopic,      StartOffset: kafka.LastOffset,      GroupID:     "normal-consumer",   })   go func() {      for {         message, err := normalReader.ReadMessage(context.Background())         if err != nil {            log.Printf("读取普通队列的消息错误:%v", err)            continue         }messsageBody := string(message.Value)//处理定时发布视频的消息,此类消息形如:publishVideo_1234if strings.HasPrefix(messsageBody, "publishVideo") {         //从message中提取视频的id            idStr := strings.Split(messsageBody, "_")[1]            videoId, err := strconv.ParseUint(idStr, 10, 0)            if err != nil {               log.Printf("提取视频id出错:%v", err)            }            if err = setVideoIsVisible(uint(videoId)); err != nil {               log.Printf("定时发布视频%d出错:%v", videoId, err)            }         }         //提交偏移量         if err := normalReader.CommitMessages(context.Background(), message); err != nil {            log.Printf("普通队列提交偏移量失败:%v", err)         }      }   }()}func setVideoIsVisible(id uint) error {   return global.Db.Model(&video.VideosContribution{}).Where("id = ?", id).Update("is_visible", 1).Error}消费者中调用了全局数据库连接对象,会报循环依赖错误,不知道如何解决,求解。
0 点赞 评论 收藏
分享
想在dplayer播放器中实现弹幕不遮挡人物的功能点。1.在vue文件中,div标签引入dplayer:<div ref="videoRef" :class="{ 'player': true, 'dplayer-comment-show': !userStore.userInfoData.token }"               id="dplay"/>2.在ts文件中,初始化dplayer对象://初始化播放器        const dp = new DPlayer({            container: videoRef.value,            loop: true, // 循环播放            lang: "zh-cn", // 语言            logo: "",            autoplay: false,//todo:开发阶段先关闭自动播放            danmaku: {                id: videoID.value.toString(),//弹幕池id,需要唯一                api: danmakuApi,                token: userStore.userInfoData.token,//弹幕后端验证 token                unlimited: true,            },            mutex: false, // 互斥,阻止多个播放器同时播放            video: {                quality: quality,                defaultQuality: 0,                url: "不填",                 pic: videoInfo.videoInfo.cover,            },        });        dp.video.crossOrigin='anonymous'  //解决canvas跨域错误3.加载tf开源人物分割模型:const model=bodySegmentation.SupportedModels.MediaPipeSelfieSegmentation        const segmenterConfig:MediaPipeSelfieSegmentationMediaPipeModelConfig={            runtime: 'mediapipe', // or 'tfjs'            solutionPath: 'https://cdn.jsdelivr.net/npm/@mediapipe/selfie_segmentation',            modelType: 'general'        }        const segmenter=await bodySegmentation.createSegmenter(model,segmenterConfig)4.检测每一帧,绘制出二进制mask文件:dp.on("timeupdate",async ()=>{            //初始化canvas,设置width和height            const canvas=document.createElement('canvas')            canvas.width=dp.video.videoWidth            canvas.height=dp.video.videoHeight                        //1.绘制视频帧到canvas画布            const ctx=canvas.getContext('2d')            ctx.drawImage(dp.video,0,0,canvas.width,canvas.height)            const imageData=ctx.getImageData(0,0,canvas.width,canvas.height)            //2.人物分割            const segmentation =await segmenter.segmentPeople(imageData)            //3.生成二进制掩码            const foregroundColor = { r: 0, g: 0, b: 0, a: 0 }            const backgroundColor = { r: 0, g: 0, b: 0, a: 255 }            const mask=await toBinaryMask(segmentation,foregroundColor,backgroundColor)            //4.清除画布并绘制掩码            ctx.clearRect(0,0,canvas.width,canvas.height)            ctx.drawImage(await segmentation[0].mask.toCanvasImageSource(),0,0,canvas.width,canvas.height)            //5.设置混合模式            ctx.globalCompositeOperation="source-out";            //6.反向填充黑色            ctx.fillRect(0,0,canvas.width,canvas.height)            //7.保存mask图片            const dataUrl=canvas.toDataURL('image/png',0)            //8.可以选择下载这些png图片            const link=document.createElement('a')            link.href=dataUrl            link.download='mask_image.png'            document.body.appendChild(link)            link.click()            document.body.removeChild(link)})不知道如何选中dplayer.danmaku的弹幕对象,然后对弹幕进行蒙版处理,求指点!附一张处理得到的mask图片:
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务