一、【rtmp视频流】

要点:主要是使用vue-video-player进行播放。要注意,这种播放方式需要flash播放器,遗憾的是很多浏览器已经不再支持flash播放器,如果是这样建议直接看下边第二种【flv视频流】。

1、安装vue-video-player

npm i -S vue-video-player

2、编写my-video.vue 组件

<template><div class="video-js"><div v-if="!videoSrc" class="no-video">暂未播放视频</div><video-player v-else class="video-player vjs-custom-skin"ref="videoPlayer":playsinline="true":options="playerOptions"></video-player></div>
</template>

script - 引入依赖文件

//  引入以下文件import videojs from 'video.js'
import 'video.js/dist/video-js.css'
import 'vue-video-player/src/custom-theme.css'
import {videoPlayer} from 'vue-video-player'
import 'videojs-flash'
import SWF_URL from 'videojs-swf/dist/video-js.swf'videojs.options.flash.swf = SWF_URL // 设置flash路径,Video.js会在不支持html5的浏览中使用flash播放视频文件

配置video相关属性

export default {name: 'videojs',components: {videoPlayer},data () {return {videoSrc: '',playerOptions: {live: true,autoplay: true, // 如果true,浏览器准备好时开始播放muted: false, // 默认情况下将会消除任何音频loop: false, // 是否视频一结束就重新开始preload: 'auto', // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)aspectRatio: '16:9', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。controlBar: {timeDivider: false,durationDisplay: false,remainingTimeDisplay: false,currentTimeDisplay: false, // 当前时间volumeControl: false, // 声音控制键playToggle: false, // 暂停和播放键progressControl: false, // 进度条fullscreenToggle: true // 全屏按钮},techOrder: ['flash', 'html5'], // 兼容顺序flash: {hls: {withCredentials: false},swf: SWF_URL},sources: [{type: 'rtmp/flv',src: '' // 视频地址-改变它的值播放的视频会改变}],notSupportedMessage: '此视频暂无法播放,请稍后再试' // 允许覆盖Video.js无法播放媒体源时显示的默认信息。}}}
}

注意样式:

<style scoped lang="scss">.video-js{width:100%;height:100%;.no-video{display:flex;height:100%;font-size:14px;text-align:center;justify-content: center;align-items:center;}}
</style>

3、封装 video.vue,引入上边封装好的my-video.vue

<template><div class="about"><MyVideo ref="playerObj"></MyVideo><!-- <a @click="playVideo">播放视频</a> --></div>
</template>
<script>import MyVideo from './my-video';import {getVideoStream,getCameraInfo,putCameraHeart} from '@/apis/equipmentApis'export default {name: 'about',props: {row: {type: Object,default () {return {}}}},components: {MyVideo},data() {return {}},methods: {// 播放视频playVideo (url) {// 可以测试一下 下边是湖南卫视直播视频流 看看能不能播放 //  this.$refs['playerObj'].videoSrc = 'rtmp://192.168.6.101:1935/live/7d7f8e6632dc0cb60292e5c519ef6981'//  this.$refs['playerObj'].playerOptions.sources[0].src = 'rtmp://192.168.6.101:1935/live/7d7f8e6632dc0cb60292e5c519ef6981'this.$refs['playerObj'].videoSrc = url;this.$refs['playerObj'].playerOptions.sources[0].src = url;},// 动态获取视频流async getVideoSrc (params) {try {let res = await getVideoStream(params);console.log('动态获取视频流 - res', res);if (res.data.code == 0 && res.data.data) {let {url,token} = res.data.data;window.sessionStorage.setItem('videoToken', String(token));url!= '' && (this.playVideo(url));token && (await putCameraHeart(token));}} catch (error) {console.log('动态获取视频流 - 失败', error);}},// 获取摄像头的信息 比如 ip password等等async getVideoInfo () {try {let res = await getCameraInfo(this.row.devId);console.log('相机的信息---', res);if (res.data.code == 0 && res.data.data) {let {ip,username,password,} = res.data.data;// 获取视频流的参数  let params = {channel: '1',factory: 'hikvision',ip,username,password,stream: 'main',};this.getVideoSrc(params);}} catch (error) {console.log('获取摄像头的信息 - 失败', error);}}},created () {this.getVideoInfo();},mounted () {//  setTimeout(() => {//    this.playVideo();//  }, 1500);}}
</script>
<style lang="scss">.about {width: 500px;height: 300px;
}</style>

4、在需要直播室视频的地方引入video.vue

......<my-video :row="rowinfo"></my-video>......<script>export default {name: 'camera',}</script>

注意:

页面关闭之后,实际上引入的视频控件(创建的video的dom)并没有销毁。这就会导致一直报错,this.xxxx is not a function 这样的错误。所以要在你关闭这个有视频的页面或者是弹窗的时候,手动清除这个控件。

因为我的视频控件在一个对话框内,所有我在关闭对话框的时候,停止了这个视频流。

// dialog关闭弹窗的回调closeDialog () {this.stopVideoStream();},// 停止视频流async stopVideoStream () {try {let token = window.sessionStorage.getItem('videoToken');let res = await stopCameraHeart(token);console.log('停止视频流', res);} catch (error) {console.log('停止视频流', error);}},

也有人在beforeDestory中直接通过ref操作dom清除的。

二、【flv视频流】

要点:这种视频流只要是利用flv.js和html5的video进行播放,解决了很多浏览器不支持flash问题。

1、安装

npm i -S flv.js

2、直接在对应的vue组件中直接引入使用

<template><div id="flv-app"><video controlsmutedid="videoElement"></video></div>
</template><script>// 引入flvjs
import flvjs from 'flv.js'export default {name: 'flv-app',data() {return {flvPlayer: null,urlHttpFlv: null}},
methods: {/*** @description 新建flv实例*/createFlvPlayer(url) {if (flvjs.isSupported()) {const videoElement = document.getElementById('videoElement')this.flvPlayer = flvjs.createPlayer({type: 'flv',isLive: true,url})this.flvPlayer.attachMediaElement(videoElement)this.flvPlayer.load()this.flvPlayer.play()}},// 切换历史视频源头switchHistoryVideo (url) {this.pausemix();this.createFlvPlayer(url);},// 转换到实时视频switchLiveVideo () {this.pausemix();this.getVideoInfo();},/*** @description 停止混流播放并移除直播流抓取* (注:离开并重新进入当前路由,观察Network,可知该操作的必要性)*/pausemix() {this.flvPlayer.pause()this.flvPlayer.unload()this.flvPlayer.detachMediaElement()this.flvPlayer.destroy()this.flvPlayer = null},// 动态获取视频流// 参数// {// "channel": "1",  暂时写死// "factory": "hikvision", 暂时写死// "ip": "192.168.10.59",// "password": "tsl123456",// "stream": "main", -> main/sub 用于切换全屏和小屏播放// "username": "admin"// }async getVideoSrc (params) {try {let res = await getVideoStream(params);console.log('动态获取视频流 - res', res);if (res.data.code == 0 && res.data.data) {let {urlHttpFlv,token} = res.data.data;window.sessionStorage.setItem('videoToken', String(token));urlHttpFlv!= '' && (this.createFlvPlayer(urlHttpFlv));token && (await putCameraHeart(token));}} catch (error) {console.log('动态获取视频流 - 失败', error);}},// 获取摄像头的信息 比如 ip password等等async getVideoInfo () {try {let res = await getCameraInfo(this.row.devId);console.log('相机的信息---', res);if (res.data.code == 0 && res.data.data) {let {ip,username,password,nvrId} = res.data.data;// 传递相机的基本信息this.$emit('getcamerainfo', res.data.data);let params = {channel: '1',factory: 'hikvision',ip,username,password,stream: 'main',};// let params = {//   "channel": "1",//   "factory": "hikvision",//   "ip": "192.168.10.44",//   "password": "tsl123456",//   "stream": "main",//   "username": "admin"// }this.getVideoSrc(params);this.getNvrVideoInfo(nvrId);}} catch (error) {console.log('获取摄像头的信息 - 失败', error);}},// 获取nvr相关信息 用于获取历史视频参数 getNvrCaremaInfoasync getNvrVideoInfo (nvrId) {try {let res = await getNvrCaremaInfo(nvrId);console.log('获取nvr相关信息---', res);if (res.data.code == 0 && res.data.data) {// description: "超脑"// installLocationId: null// ip: "192.168.10.80"// mcn: null// name: "NVR-10.80"// nvrId: "1605578253-192.168.10.80"// password: "tsl123456"// productKey: "a4f3f1dc1744823b8369eba387ebf6a9"// projectId: 1605578224// status: "online"// statusInfo: "telnet ok"// statusTime: 1614068464// username: "admin"  this.$emit('getcamerainfonvrid', res.data.data)} else {this.$message({type: 'error',message: `${res.data.msg}`})}} catch (error) {console.log('获取nvr相关信息 - 失败', error);}},  },mounted() {this.getVideoInfo();},beforeDestroy() {this.pausemix()},}</script>

这种方案更加快捷。

【视频直播流】vue flv视频直播流 flv rtmp vue 直播视频流相关推荐

  1. 视频流媒体播放器EasyPlayer.js如何实现在FLV直播流断流恢复后自动重连?

    背景分析 EasyPlayer-Android播放器是一款可针对RTSP.RTMP.RTSP&RTMP协议进行过优化的流媒体播放器,其中我们引以为傲的两个技术优势就是起播速度快和播放延迟低.最 ...

  2. LiveGBS国标视频平台如何获取接入视频通道的直播流地址HLS/HTTP-FLV/WS-FLV/WebRTC/RTMP/RTSP

    1.背景说明 LiveGBS国标GB/T28181流媒体服务器软件,支持设备|平台GB28181注册接入.向上级联第三方国标平台, 可视化的WEB页面管理(页面源码开源):支持云台控制.设备录像检索. ...

  3. 视频技术详解:RTMP H5 直播流技术解析

    本文聚焦 RTMP 协议的最精华的内容,接进行实际操作 Buffer 的练习和协议的学习. RTMP 是什么 RTMP 全称即是 Real-Time Messaging Protocol.顾名思义就是 ...

  4. 搭建rtmp直播流服务之4:videojs和ckPlayer开源播放器二次开发(播放rtmp、hls直播流及普通视频)...

    前面几章讲解了使用 nginx-rtmp搭建直播流媒体服务器; ffmpeg推流到nginx-rtmp服务器; java通过命令行调用ffmpeg实现推流服务; 从数据源获取,到使用ffmpeg推流, ...

  5. 基于微信平台做视频直播时,如何裂变引流吸粉

    一个背景:微信也许是国内使用率最高,覆盖面最广的APP,在2017年微信公开课中,张小龙发布的<2016微信数据报告>显示,微信平均日活达到7.68亿.足以说微信平台的重要性,那么来说说, ...

  6. 微信串流服务器,微信视频号无人直播推流教程分享(无人直播技术非常的火怎么操作方法)...

    去年抖音无人直播技术非常的火,很多团队批量操作无人直播卡广场流量,赚得盆满钵满,市面上一度炒作到3000元的抖音无人直播技术,收割了不少小白玩家,如今随着视频号直播推流正式开放,预计一大波视频号无人直 ...

  7. 视频直播点播EasyDSS互联网视频云平台虚拟直播Avfilter流阻塞情况的优化

    EasyDSS互联网视频云平台可供一站式的视频转码.点播.直播.推拉流.时移回放等服务,也能支持4K视频的直播.点播等功能.我们在去年对EasyDSS进行了内核升级,新内核版本的服务性能更加流畅和稳定 ...

  8. java做flv直播服务器,EasyDSS流媒体服务器软件(支持RTMP/HLS/HTTP-FLV/视频点播/视频直播)-正式环境安装部署攻略...

    EasyDSS流媒体服务器软件,提供一站式的转码.点播.直播.时移回放服务,极大地简化了开发和集成的工作. 其中,点播功能主要包含:上传.转码.分发.直播功能,主要包含:直播.录像, 直播支持RTMP ...

  9. iOS RTMP 视频直播开发笔记(6)- 封包 FLV

    iOS RTMP 视频直播开发笔记(6)- 封包 FLV 讲讲FLV文件格式.以及数据如何放置的. FLV里面是由多个Tag构成的:[[tag1][tag2][tag3][tag4]-] 而Tag多种 ...

最新文章

  1. python gamma矫正
  2. 使用java生产二维码
  3. im2col原理小结
  4. echart 数据点可以加链接吗_地理可视化就这么简单、酷炫,蚂蚁金服AntV 空间数据可视化引擎 L72.0发布...
  5. centos sokit_手把手教你在centos上配置Django项目(超详细步骤)
  6. Socket通信学习(二):序列化与反序列化
  7. python系统学习_【Python系统学习】基础篇
  8. oracle11g rman实例,oracle11g rman备份与恢复详细实例
  9. bat脚本注释多行_bat批处理的注释语句
  10. 买服务器做网站 镜像选什么,云服务器做网站镜像类型选啥
  11. 【git学习】fatal: unable to access XXX: Failed to connect to github.com port 443: Timed out怎么解决
  12. kvm windows 驱动安装
  13. mysql一条sql是一个事物么_mysql 事物浅析
  14. ASP是什么?ASP初识
  15. 什么是横向扩展和纵向扩展?
  16. rust如何在木板上上传图片_腐蚀rust游戏玩法方式详解
  17. 站群网站批量文章翻译发布插件
  18. PHP毕业设计项目作品源码选题(8)电影院售票系统毕业设计毕设作品开题报告
  19. 金融脱媒(Financial Disintermediation),又称金融非中介化
  20. linux下伪终端的使用,Linux运维培训 Linux伪终端详解

热门文章

  1. 先转行从零基础入门学编程可以吗?
  2. 计算机影响因子2.0什么水平,好中的计算机中文核心期刊影响因子高,大学保研发表...
  3. python语言好不好_《python编程基础》这本书怎么样
  4. 华为终端的野心:欲做第二个高通?
  5. 计算机企业社会实践活动鉴定范文,计算机专业社会实践自我鉴定范文
  6. 百度飞桨EasyDL桌面版正式上线,没网也能训练AI
  7. H5自动播放背景音乐(IOS和安卓)
  8. 如何在 Qt Creater 中添加资源文件
  9. Centos无网环境下安装mysql步骤
  10. 打造个人股票监控系统 实时跟踪股票价格走势