查看: 287|回复: 0

Vue播放M3U8视频流:Video.js与hls.js两种实现代

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
M3U8是HLS(HTTP Live Streaming)协议中常用的索引文件格式,在Vue项目中播放M3U8视频流时,通常需要借助video.js配合videojs-contrib-hls插件,或使用更轻量的hls.js库。下面给出两种在Vue组件中可落地的实现方式,包含依赖安装、组件代码、生命周期处理以及兼容性注意事项。

一、基于Video.js与videojs-contrib-hls的播放方案

1. 安装依赖
在Vue项目目录下执行:
  1. npm install video.js videojs-contrib-hls
复制代码

videojs-contrib-hls负责解析M3U8流并将其转换为浏览器可播放的分段数据,video.js则提供UI控件与播放器管理能力。

2. 在Vue组件中引入并初始化播放器
在组件的script中引入video.js、样式文件和HLS插件:
  1. import videojs from 'video.js'
  2. import 'video.js/dist/video-js.css'
  3. import 'videojs-contrib-hls'
  4. export default {
  5.   mounted() {
  6.     this.initVideoPlayer()
  7.   },
  8.   methods: {
  9.     initVideoPlayer() {
  10.       this.player = videojs(this.$refs.videoPlayer, {
  11.         autoplay: true,
  12.         controls: true,
  13.         sources: [{
  14.           src: 'your-m3u8-url.m3u8',
  15.           type: 'application/x-mpegURL'
  16.         }]
  17.       })
  18.     }
  19.   },
  20.   beforeDestroy() {
  21.     if (this.player) {
  22.       this.player.dispose()
  23.     }
  24.   }
  25. }
复制代码

注意:sources中的type必须设置为application/x-mpegURL,videojs-contrib-hls才能正确识别该源并启动HLS解析流程。

3. 模板部分:定义video容器
video标签中需要设置ref供Video.js挂载,并且class包含video-js和vjs-default-skin。若不在初始化时传入sources,也可借助data-setup属性启用自动初始化,但通常更推荐通过ref手动初始化,便于控制播放器实例。
  1. <template>
  2.   <div>
  3.     <video
  4.       ref="videoPlayer"
  5.       class="video-js vjs-default-skin"
  6.       width="640"
  7.       height="360"
  8.       data-setup="{}">
  9.     </video>
  10.   </div>
  11. </template>
复制代码

4. 样式适配
通过CSS限制播放器宽度,使其在不同屏幕下都能正常展示:
  1. .video-js {
  2.   width: 100%;
  3.   max-width: 640px;
  4.   margin: 0 auto;
  5. }
复制代码

5. 完整组件示例(支持传入src)
将播放地址通过props传入组件,便于复用。
  1. <template>
  2.   <div class="video-container">
  3.     <video ref="videoPlayer" class="video-js"></video>
  4.   </div>
  5. </template>
  6. <script>
  7. import videojs from 'video.js'
  8. import 'video.js/dist/video-js.css'
  9. import 'videojs-contrib-hls'
  10. export default {
  11.   props: {
  12.     src: {
  13.       type: String,
  14.       required: true
  15.     }
  16.   },
  17.   mounted() {
  18.     this.initPlayer()
  19.   },
  20.   methods: {
  21.     initPlayer() {
  22.       this.player = videojs(this.$refs.videoPlayer, {
  23.         autoplay: false,
  24.         controls: true,
  25.         sources: [{
  26.           src: this.src,
  27.           type: 'application/x-mpegURL'
  28.         }]
  29.       })
  30.     }
  31.   },
  32.   beforeDestroy() {
  33.     if (this.player) {
  34.       this.player.dispose()
  35.     }
  36.   }
  37. }
  38. </script>
  39. <style scoped>
  40. .video-container {
  41.   margin: 20px auto;
  42.   width: 80%;
  43. }
  44. </style>
复制代码

二、基于hls.js的轻量级播放方案

如果项目不想引入体积较大的video.js,可以直接使用hls.js。hls.js是专门处理HLS流的前端库,在支持Media Source Extensions(MSE)的浏览器中表现良好。

1. 安装hls.js
  1. npm install hls.js
复制代码

2. 组件内实现
  1. <template>
  2.   <video ref="videoPlayer" controls></video>
  3. </template>
  4. <script>
  5. import Hls from 'hls.js'
  6. export default {
  7.   data() {
  8.     return {
  9.       hls: null
  10.     }
  11.   },
  12.   mounted() {
  13.     this.loadVideo()
  14.   },
  15.   methods: {
  16.     loadVideo() {
  17.       const videoSrc = 'your-m3u8-url.m3u8'
  18.       const video = this.$refs.videoPlayer
  19.       // 优先使用hls.js:通过MSE驱动播放
  20.       if (Hls.isSupported()) {
  21.         this.hls = new Hls()
  22.         this.hls.loadSource(videoSrc)
  23.         this.hls.attachMedia(video)
  24.       } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
  25.         // Safari等原生支持HLS的浏览器直接设置src
  26.         video.src = videoSrc
  27.       }
  28.     }
  29.   },
  30.   beforeDestroy() {
  31.     // 销毁hls实例,释放资源
  32.     if (this.hls) {
  33.       this.hls.destroy()
  34.     }
  35.   }
  36. }
  37. </script>
复制代码

三、关键注意事项

- 跨域问题:M3U8地址必须允许跨域访问,否则播放器无法拉取ts分片。若接口和视频流不在同一域名下,需要在服务端配置CORS策略,允许当前页面域名发起请求。
- 移动端内联播放:在iOS/Android的WebView或部分移动浏览器中,如果想在页面内直接播放而不跳转全屏,需要给video标签增加playsinline属性。
- HTTPS环境:如果当前页面是通过HTTPS访问,M3U8地址也必须是HTTPS。混合内容(HTTPS页面加载HTTP流)会被浏览器拦截,导致视频无法播放。
- 动态切换视频源:如果是直播或监控场景,播放地址可能变化,建议在设置新源前先调用player.src(newSource)或重新创建hls实例,同时注意销毁旧的hls对象。
- videojs-contrib-hls插件已经停止积极维护,较新版本的video.js建议直接集成hls.js或使用http-streaming组件。如果遇到兼容性问题,请先检查video.js版本和插件版本是否匹配。

以上两种方式分别适用于不同场景:Video.js方案组件完善、自带控制条和样式,适合快速实现标准播放器;hls.js方案更轻量,适合已有自定义播放器UI或需要直接操作HLS流的业务。开发者可根据实际需求选择。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-9-5 17:03 , Processed in 0.021902 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部