flvjs播放器事件动态监听并实现flvjs实例销毁(http-flv协议)

flvjs播放器事件动态监听(http-flv协议)

1.困扰我的问题

最近在使用flvjs播放器播放http-flv协议流的直播视频,业务需求要动态加载非固定数量的视频(不超过6个),使用flv创建flvjs实例简单,但销毁flvjs得想法子,下面是解决我曾经的困扰思路~

2.思路
我们要监听创建出来flvjs实例事件,然后设置变量去判断何时该销毁实例

3.代码说明

watch: {
	device(val) {
		if (val) {
			this.changeLampPost = true // 切换设备时销毁
		}
	}
},
data() {
	return {
		leaveRouter: false, 
      	changeLampPost: false,
    }
},
methods: {
	// 打开视频(方法体)
    openVideo() {
      let _this = this
      this.tableData.forEach((item, index) => { // 遍历接口返回的数据
        if (item) {
          _this.$nextTick(() => {
            setTimeout(()=>{
              // 【flvjs播放】
              if (_this.$flvjs.isSupported()) { // 引入flvjs时已声明全局变量 $flvjs
                let videoElement = document.getElementById('videoElement'+(index+1))
                // 创建flvjs实例
                let flvPlayer = _this.$flvjs.createPlayer({
                  type: 'flv',
                  url: item, // 直播地址(http://xxx.flv?port=1935&app=live&stream=xxx)
                })
                flvPlayer.attachMediaElement(videoElement)
                flvPlayer.load()
                flvPlayer.play()

                // 【flvjs播放器事件侦听】
                flvPlayer.on(_this.$flvjs.Events.LOADING_COMPLETE, (res) => {
                  console.log("加载完成")
                })
                flvPlayer.on(_this.$flvjs.Events.MEDIA_INFO, (res) => {
                  console.log("媒体信息")
                })
                flvPlayer.on(_this.$flvjs.Events.METADATA_ARRIVED, (res) => {
                  console.log("获取元数据")
                })
                flvPlayer.on(_this.$flvjs.Events.RECOVERED_EARLY_EOF, (res) => {
                  console.log("恢复早期EOF")
                })
                flvPlayer.on(_this.$flvjs.Events.SCRIPTDATA_ARRIVED, (res) => {
                  console.log("获取到脚本数据")
                })
                flvPlayer.on(_this.$flvjs.Events.ERROR, (errorType, errorDetail, errorInfo) => {
                  console.log("视频错误信息回调")
                  console.log("errorType:", errorType);
                  console.log("errorDetail:", errorDetail);
                  console.log("errorInfo:", errorInfo);
                })
                
                // 【重要事件监听】http请求建立好后,该事件会一直监听flvjs实例
                flvPlayer.on(_this.$flvjs.Events.STATISTICS_INFO, (res) => {
                  console.log("请求数据信息")
                  if (_this.leaveRouter || _this.changeLampPost) { // 离开路由或切换设备
                    console.log("销毁实例")
                    // 销毁实例
                    flvPlayer.pause();
                    flvPlayer.unload();
                    flvPlayer.detachMediaElement();
                    flvPlayer.destroy();
                    flvPlayer= null;
                  }
                })
              }
            })
          })
        } else this.setDrop(index) // 掉线设备
      })
      // 切换设备,完成旧flvjs实例销毁后重启flvjs播放器
      if (this.changeLampPost) {
        console.log("重启播放器")
        this.changeLampPost = false
        this.openVideo()
      }
   },
}// 路由销毁前
beforeDestroy() {
   this.leaveRouter = true
},

4.总结
要解决动态监听flvjs实例问题,解决方案在代码中已呈现,关键是$flvjs.Events.STATISTICS_INFO的监听事件。

感谢启发文章:
Flv.js文档使用随记
原作者(bilibili)flv.js API文档【推荐】

  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
A: 要使用nginx实现http-flv推流,需要按照以下步骤: 1.安装nginx和rtmp-module   首先需要安装nginx和rtmp-module。可以参考以下资料进行下载和安装。   nginx官网:http://nginx.org/   rtmp-module官网:https://github.com/arut/nginx-rtmp-module 2.配置nginx.conf文件   在nginx.conf文件中,需要添加以下配置信息。其中,flv、live和stream是自定义的,可以根据需要修改。 rtmp { server { listen 1935; #监听端口 chunk_size 4096; #设置chunk_size大小 application flv { live on; #启用直播模式 allow publish all; #允许推流 deny play all; #禁止播放 push_reconnect off; #关闭推流断开重连 hls off; #关闭hls flv_metadata on; #开启flv的metadata信息 wait_key on; #开启wait_key exec_pull ffmpeg -i rtmp://xxxx/$app/$name -vcodec libx264 -vprofile baseline -s 720x576 -acodec libfaac -ar 44100 -f flv rtmp://xxxx/flv/$name; #开启转码功能,实现兼容性 notify_method get; #推流成功后,请求指定地址 notify_update http://xxxx/stream/$app/$name; } } } http { server { listen 80; #监听端口 location /live { flv_live on; #开启http-flv推流 chunked_transfer_encoding on; #开启chunked传输 add_header 'Access-Control-Allow-Origin' '*'; #跨域 add_header 'Allow' 'GET, POST, OPTIONS'; #允许的http方法 add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; #允许跨域的方法 add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept'; #允许跨域的请求头 } } } 3.启动nginx   将修改后的nginx.conf文件保存,使用以下命令启动nginx。 sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 4.推流   使用推流软件(如OBS)等工具,将视频流推送到rtmp://localhost/flv/{stream_name}的地址,即可在http://localhost/live/{stream_name}.flv,通过http-flv协议播放推送的视频流。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值