一、m3u8和HLS介绍
1.M3U8文件是指UTF-8编码格式的M3U文件。M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。
2.HLS 与 M3U8 HLS(全称:Http Live Streaming)是由Apple公司定义的用于实时流传输的协议
二、在vue项目中使用HLS播放m3u8
GitHub地址:https://github.com/surmon-china/vue-video-player
文档地址:https://docs.videojs.com/tutorial-options.html
安装插件
- npm install vue-video-player -s
- npm install videojs-contrib-hls.js -s
- npm install sass-loader -s
// 安装sass-loader是因为万一你项目中要写css,如果只是看视频的话,可以不安装
// 安装完sass-loader后,在 build--webpack.base.conf.js中大概32行的module对象中配置css代码:
{
test: /\.scss$/,
loaders: ['style', 'css', 'sass']
}
配置main.js
- import VideoPlayer from 'vue-video-player'
- Vue.use(VideoPlayer)
编写vue页面
- // 可以直接在components的HelloWorld.vue里面写,也可以src中任意地方新建vue页面来写,下面是vue页面的完整代码
- // 注意三个import引用即可
- <template>
- <div class="player-container">
- <video-player class="vjs-custom-skin" :options="playerOptions"></video-player>
- </div>
- </template>
- <script>
- //引入video样式
- import 'video.js/dist/video-js.css'
- import 'vue-video-player/src/custom-theme.css'
- //引入hls.js
- import 'videojs-contrib-hls.js/src/videojs.hlsjs'
- export default {
- name:'HelloWorld',
- data () {
- return {
- playerOptions: {
- playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度
- autoplay: false, //如果true,浏览器准备好时开始回放。
- controls: true, //控制条
- preload: 'auto', //视频预加载
- muted: false, //默认情况下将会消除任何音频。
- loop: false, //导致视频一结束就重新开始。
- language: 'zh-CN',
- aspectRatio: '16:9', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
- fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
- sources: [{
- type: 'application/x-mpegURL',
- src: 'https://video-dev.github.io/streams/x36xhzz/x36xhzz.m3u8'
- }],
- poster: "http://static.smartisanos.cn/pr/img/video/video_03_cc87ce5bdb.jpg", //你的封面地址
- width: document.documentElement.clientWidth,
- notSupportedMessage: '此视频暂无法播放,请稍后再试' //允许覆盖Video.js无法播放媒体源时显示的默认信息。
- }
- }
- },
- methods: {
- },
- computed: {
- }
- }
- </script>
完成
实测,报错,也有可能操作有问题,hls.js在html页面,是可以正常播放的,但是在vue中报错
Uncaught TypeError: Cannot read property 'readyState' of null
at XhrLoader.readystatechange (hls.js?ba56:14379)
at MockXMLHttpRequest.dispatchEvent (mock.js?411c:8517)
at XMLHttpRequest.handle (mock.js?411c:8335)
解答:由于在main.js中,引入了mock所以监控地址被篡改引起的错题
二、nuxt项目中使用HLS播放m3u8
1.安装hls.js依赖,可以通过npm安装依赖
- npm install hls.js --save
也可以通过引入的方式
- <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
2.代码实现
- <template>
- <section>
- <video class="full-height full-width" ref="video" controls></video>
- </section>
- </template>
- <script>
- let Hls = require('hls.js');
- export default {
- data() {
- return {
- hls: ''
- };
- },
- mounted() {
- this.$axios.get('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx').then(res => {
- this.getStream(res.data);
- });
- },
- methods: {
- videoPause() {
- if (this.hls) {
- this.$refs.video.pause();
- this.hls.destroy();
- this.hls = null;
- }
- },
- getStream(source) {
- if (Hls.isSupported()) {
- this.hls = new Hls();
- this.hls.loadSource(source);
- this.hls.attachMedia(this.$refs.video);
- this.hls.on(Hls.Events.MANIFEST_PARSED, () => {
- console.log('加载成功');
- this.$refs.video.play();
- });
- this.hls.on(Hls.Events.ERROR, (event, data) => {
- // console.log(event, data);
- // 监听出错事件
- console.log('加载失败');
- });
- }
- },
- beforeDestroy() {
- this.videoPause();
- }
- }
- };
- </script>
页面初始化mounted的时候,获取到m3u8视频的链接,然后通过getStream()方法加载视频,也通过videoPause()方法停止视频播放
以上两种方式皆可以。