点播直播弹幕实现2

直播弹幕实现

简要说明

之前实现了点播弹幕实现,在之前基础上利用WebSocket长连接实现了直播弹幕,具体采用websocket+stomp,而SpringBoot对着两者有着非常好的支持。

使用技术

前端:…(之前的),sockjs(尝试建立websocket连接,如果客户端不支持退化为轮询或长连接),webstomp-client(建立基于stomp协议的连接)。

后端: SpringBoot.

后端使用了SpringBoot一套实现,另外的话还想用底层基于Netty的一套异步实现,不过不是裸Netty,应该又要简单学一套异步框架,或许有空的话学习Go实现一下,感受一下协程。

前端实现

只需要在读弹幕库时建立websocket+stomp连接,订阅相关房间消息,send操作时发送stomp消息即可。

  const dp = new DPlayer({
    container: document.getElementById("live-player"),
    live: true,
    video: {
      url: liveInfo.url,
      type: "customFlv",
      customType: {
        customFlv: function (video: HTMLMediaElement, player: any) {
          const flvPlayer = flvjs.createPlayer({
            type: 'flv',
            url: video.src,
            isLive: true
          },{
            autoCleanupSourceBuffer: true
          });
          flvPlayer.attachMediaElement(video);
          flvPlayer.load();
        },
      },
    },
    danmaku: {
      id: String(liveInfo.id),
      api: "live",
      user: "xzz"
    },
    apiBackend: {
      read: (options) => {
        stompClient.connect({}, () => {
          stompClient.subscribe("/topic/live/" + liveInfo.id, (frame) => {
            const barrage: Barrage = JSON.parse(frame.body);
            if(barrage.sign == sign) return;
            const dan = {
              type: barrage.barrageType,
              color: barrage.color,
              text: barrage.content,
              time: barrage.time,
              author: barrage.author
            }
            dp.danmaku.draw((dan as any) as DPlayerDanmakuItem);
          });
        })
        options.success();
      },
      send: (options) => {
        const danmu = options.data;
        const barrage: Barrage = {
          barrageType: danmu.type,
          content: danmu.text,
          time: dp.video.currentTime,
          color: danmu.color,
          author: "xzz",
          videoId: liveInfo.id,
          sign: sign
        }
        stompClient.send("/live/send/"+liveInfo.id,JSON.stringify(barrage),{sign: sign});
        options.success();
      }
    }
  });

关于其中的 nanoid,Dplayer的设置发送弹幕时只要发送成功就会渲染已发送的弹幕,但由于订阅了相关房间的消息,所以也会接受到自己的消息,这时就需要识别自己发的消息不进行渲染,于是就有了生成nanoid作sign属性,识别自己。

后端实现

SpringBoot对WebSocket和Stomp协议提供了非常好的开箱即用支持,具体可以参照官方文档学习。

WebSocket+Stomp设置:

实际上SpringBoot使用Stomp是利用内存实现了一个简易消息队列,当然也提供了相应接口使用外部消息队列,这里使用内存消息队列,下面的配置还配置了一些监视器,文档中有具体解释。

@Configuration
@EnableWebSocketMessageBroker
public class WebsocketConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/connect").setAllowedOriginPatterns("*").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/live");
        registry.enableSimpleBroker("/topic","/queue");

    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(new SubListener());
    }

    @Override
    public void configureClientOutboundChannel(ChannelRegistration registration) {
        registration.interceptors(new SubListener());
        registration.taskExecutor(new ThreadPoolTaskExecutor());
    }
}

Controller方法

非常简单,只需要对客户端发来的消息即弹幕进行忠实的转发给所有订阅了该房间的客户端就行了。

    @MessageMapping("/send/{id}")
    @SendTo("/topic/live/{id}")
    public Barrage liveBarrage(Message<Barrage> message, @DestinationVariable("id") Integer id) {
        return message.getPayload();
    }
}

Ok,这样实际上就已经简单完成了直播弹幕功能了,之后计划编写一个底层基于Netty并且外接消息队列的实现做练习。

杂项

直播过程中浏览器报错(关键字:append buffer)

虽然上面没有提及,但我在我的服务器上部署了直播服务器并实现了直播,过程中出现了上述错误,解决方案,利用flv.js创建player时config中加入autoCleanupSourceBuffer: true,还可以设置其相关时间参数,详情参考github中api文档。

关于Sockjs导入

直接导入import SockJS from 'sockjs-client';这个是需要node环境才能正常运行的,在浏览器中会报错。改为import SockJS from 'sockjs-client';即可。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Springboot和Vue开发的弹幕视频网站是一种在线视频播放系统,它采用了前后端分离的开发模式。该系统名为爱奇艺影视平台系统,它提供了电影点播和短视频分享功能。前端系统用户功能模块和后台系统用户功能模块分别负责不同的任务。 这个弹幕视频网站通过使用JWT(JSON Web Token)实现了token验证,确保用户安全性。若对JWT不熟悉的话,可以参考相关文档来了解更多细节。 弹幕视频网站的出现主要是为了提供丰富的信息源和丰富人们的精神文明。传统的视频播放手段,如电视播放和影院播放,存在一定的局限性。因此,弹幕视频网站应运而生,它能够实时播放网络视频资源,汇聚了大量的网络视频资源,并以方便快捷的方式吸引了广大用户。 这种在线视频播放系统的初衷是满足人们对于广播电视观看需求的增加,并提供更灵活的播放方式。随着网络信息技术的更新迭代,越来越多的在线视频播放系统应运而生。这些系统可以满足用户对于视频播放的需求,使用户拥有更多的选择权和主动权。为了进一步满足广大观众对于电视节目的需求,提供更多的选择,这个在线视频播放系统旨在设计一个能够满足广大观众多元化需求的系统。用户可以根据自身需求搜索想看的视频,并通过口碑赢得用户的好评和扩大用户基数,从而开拓市场。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [短视频社交|电影点播平台Springboot+vue+ElementUI前后端分离](https://blog.csdn.net/whirlwind526/article/details/127894340)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Springboot+Vue前后端分离实现博客系统(后端SpringBoot篇)](https://blog.csdn.net/qq_33371766/article/details/106868441)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值