VUE - 视频流直播
推流:将直播的内容推送至服务器的过程。
拉流:指服务器已有直播内容,用指定地址进行拉取的过程。
本文主要说的是拉流。也就是客户端播放视频流。
视频流测试软件:VLC 播放器,可自行百度下载安装
网络直播中常见的三种协议:RMTP 、HTTP-FLV 、HLS
RTMP 协议
推流一般使用RTMP协议。
但在客户端就不适用了。因为 RTMP 必须需要 flash 插件 ,主流浏览器默认不支持flash,需单独安装。
经测试:
需单独下载 安装flash,(adobe flash player ppapi)
flash 下载地址:https://www.flash.cn/download-wins
chrome 不可用
360浏览器 可用(有提示)
qq浏览器 可用
VUE 使用方法 :
cnpm install video-js -S
cnpm install videojs-flash -S
<template>
<div>
<div id="video-container">
<!-- https://blog.csdn.net/qq_45062261/article/details/113887381 -->
<video id="myvideo" width="800" height="600" class="video-js vjs-default-skin" controls>
<!-- RTMP直播源地址-->
<!-- <source :src="`rtmp://58.200.131.2:1935/livetv/cctv2`" /> -->
<source :src="`rtmp://ns8.indexforce.com/home/mystream`" />
</video>
<button @click="handlePlay">点击播放</button>
<button @click="handleClear">关闭销毁</button>
<button @click="again">再次初始化</button>
</div>
</div>
</template>
<script>
import videojs from "video.js";
import "video.js/dist/video-js.css";
import "videojs-flash";
export default {
data() {
return {
videoPlayer: null,
};
},
methods: {
//播放
handlePlay() {
this.videoPlayer = videojs("myvideo", {}, function () {
console.log("videojs播放器初始化成功");
});
this.videoPlayer.play();
},
//销毁
handleClear() {
this.videoPlayer.dispose(); //销毁
this.videoPlayer = null; //置空
},
//重新初始化
again() {
var myVideoDiv = document.getElementById("video-container");
myVideoDiv.innerHTML = `
<video id='myvideo' width="800" height="600" class="video-js vjs-default-skin" controls>
<!-- RTMP直播源地址-->
<source src="rtmp://xxxxxx.cn:1111/oopl/${this.xxxx}">
</video>
`;
},
},
};
</script>
<style lang="scss" scoped>
</style>
HLS 协议
使用H5播放
基于nginx的rtmp直播服务器 (参考:)
安装加载nginx-rtmp-module模块的nginx
首先下载nginx
到 https://github.com/arut/nginx-rtmp-module 下载rtmp模块(git clone https://github.com/arut/nginx-rtmp-module.git)
分别解压nginx和rtmp模块,使他们在同一目录下。
编译nginx
./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module.1.1.4 --with-http_ssl_module
make && make install 安装
配置rtmp模块
rtmp {
server {
listen 9999;
application myapp {
live on;
}
application live {
live on; #开启实时
hls on; #开启hls
hls_path /usr/local/etc/nginx/html/multimedia/hls; #hls的ts切片存放路径
hls_fragment 2s; #本地切片长度
hls_playlist_length 6s; #HLS播放列表长度
}
}
}
使用rtmp协议并且监听了9999端口,如果我们的推流地址填写的是rtmp://ip:9999/myapp,那么就是纯粹的rmtp协议的流,如果推流地址填写的是rmtp://ip:9999/live,那么推流之后会在/usr/local/etc/nginx/html/multimedia/hls目录下生成很多ts格式的视频切片和一个m3u8格式的文件,我们想要用http协议访问这个m3u8文件就需要再配置http模块。
配置http模块
location /live {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias /usr/local/etc/nginx/html/multimedia/hls/;
add_header Cache-Control no-cache;
}
当我们的推流地址填写的是rtmp://ip:9999/live/room1时,使用http://ip:80/live/room1.m3u8就能把rtmp转成hls访问这个直播流了。
- 新建文件夹
mkdir -p /usr/local/etc/nginx/html/multimedia/hls/
- 重启nginx
nginx -s reload
以上就完成了直播服务器的搭建。
VUE 使用方法:
npm install hls.js
<!-- https://blog.csdn.net/a15297701931/article/details/115478652 -->
<template>
<div class="playVideo-layout">
<!-- 播放器 -->
<div id="app-container" class="video-box">
<video
ref="videoElement"
:src="videoUrl"
id="videoElement"
controls
muted
style="width: 100%; height: 100%; object-fit: fill"
></video>
</div>
</div>
</template>
<script>
import hlsjs from "hls.js";
export default {
components: {},
data() {
return {
videoUrl: "http://playertest.longtailvideo.com/adaptive/bipbop/gear4/prog_index.m3u8",//这里书写路径,例
};
},
mounted() {
this.show();
},
methods: {
//播放
show() {
this.video = this.$refs.videoElement; //定义挂载点
console.log(this.video);
if (hlsjs.isSupported()) {
this.hlsjs = new hlsjs();
this.hlsjs.loadSource(this.videoUrl);//设置播放路径
this.hlsjs.attachMedia(this.video);//解析到video标签上
console.log(this.hlsjs);
this.hlsjs.on(hlsjs.Events.MANIFEST_PARSED, () => {
this.video.play();
console.log("加载成功");
});
this.hlsjs.on(hlsjs.Events.ERROR, (event, data) => {
console.log(event, data);
// 监听出错事件
console.log("加载失败");
});
} else {
this.$message.error("不支持的格式");
return;
}
},
//停止播放
closeVideo() {
if (this.hlsjs) {
this.$refs.videoElement.pause();
this.video.pause();
this.hlsjs.destroy();
this.hlsjs = null;
this.$emit("closeVideo");
}
},
},
computed: {},
watch: {},
filters: {},
};
</script>