m3u8视频文件夹COS上传及播放

m3u8视频文件夹COS上传及播放(无论是TCplayer 还是video.js在手机浏览器端都无法兼容, 特别是ios端)

  • 创作的背景: 原来使用的mp4来进行视频上传 播放和下载, 由于腾讯云视频流量高峰期一周的收费达到5000元左右, 特提出优化方案, 上传视频的时候上传mp4 和 m3u8 各一份, 视频在线播放使用TCplayer或videojs 进行m3u8视频播放, 下载时下载mp4格式视频, 以此方案来减少腾讯云流量来减少支出
  • 经过多篇文章的阅读无果后又与腾讯客服反复沟通实现前端上传mp4转换成的m3u8视频文件夹, 并实现m3u8视频播放

1. 找到项目的index.html入口文件引入下边样式和js, 放入标签内即可

  <!--播放器样式文件-->
  <link async href="https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.2/tcplayer.min.css" rel="stylesheet" />
  <!--现代浏览器中通过 H5 播放 HLS 格式的视频,需要在 tcplayer.v4.2.2.min.js 之前引入 hls.min.0.13.2m.js。-->
  <script async src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.2/libs/hls.min.0.13.2m.js"></script>
  <!--播放器脚本文件-->
  <script async src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.2/tcplayer.v4.2.2.min.js"></script>

2. mp4文件上传常规上传即可, 在此特别说明m3u8文件夹cos上传

  • 2.1 cos.js 封装
var COS = require("cos-js-sdk-v5")
import uuid from 'uuid'
let Bucket = "" /* 存储桶 */
let Region = "" /* 存储桶所在地域,必须字段 */
import fetch from "@/utils/request";
import { ElLoading } from 'element-plus'
let serviceModl = '/content'
let loadingOptions = {
  text: "正在努力上传,请稍等...",
  lock: true,
  spinner: "el-icon-loading",
  background: "rgba(255, 255, 255, 0.5)",
};
let filePath = '/digital-admin/'; // 存储目录(自定义)
//获取cos凭证
export function getCosSTS (data) {
  return fetch({
    url: '自己的后端接口地址',
    method: "POST",
    data: data
  })
}
//初始化 Cos
export function initCos () {
  return new Promise((resolve) => {
    getCosSTS().then(res => {
      Bucket = res.data.bucketName;
      Region = res.data.endpoint;
      let cosObj = {
        TmpSecretId: res.data.credentials.tmpSecretId,
        TmpSecretKey: res.data.credentials.tmpSecretKey,
        SecurityToken: res.data.credentials.sessionToken,
        // 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
        StartTime: res.data.startTime, // 时间戳,单位秒,如:1580000000
        ExpiredTime: res.data.expiredTime, // 时间戳,单位秒,如:1580000900
      };
      let client = new COS({
        getAuthorization: function (options, callback) {
          callback(cosObj);
        }
      })
      resolve(client)
    })
  })
}
//文件夹上传文件至cos
export async function uploadFilesToCos (files, fileName, size, cos) {
  let filesArr = []
  for (var key in files) {
    if (files[key].size) {
      filesArr.push({
        Bucket: Bucket, /* 填入您自己的存储桶,必须字段 */
        Region: Region,  /* 存储桶所在地域,例如ap-beijing,必须字段 */
        Key: filePath + files[key].name,  /* 存储在桶里的对象键(例如1.jpg,a/b/test.txt),必须字段 */
        Body: files[key], /* 必须,上传文件对象,可以是input[type="file"]标签选择本地文件后得到的file对象 */
        onTaskReady: function (taskId) {
          /* taskId可通过队列操作来取消上传cos.cancelTask(taskId)、停止上传cos.pauseTask(taskId)、重新开始上传cos.restartTask(taskId) */
          // console.log(taskId);
        },
        // 支持自定义headers 非必须
        Headers: {
          'x-cos-meta-test': 123
        }
      })
    }
  }
  return new Promise(resolve => {
    ElLoading.service(loadingOptions);
    cos.uploadFiles(
      {
        files: filesArr,
        // SliceSize 分片上传值要大于m3u8文件夹的ts文件大小, 否则会报错 被禁止 403
        SliceSize: 1024 * 1024 * 1024,    /* 设置大于1G采用分块上传 */
      },
      function (err, data) {
        ElLoading.service(loadingOptions).close();
        console.log('data', data)
        if (data.files && data.files.length > 0) {
          data.files.forEach(item => {
            let ary = item.data.Location.split('.')
            let type = ary[ary.length - 1]
            if (type === 'm3u8') {
              // 整个文件夹上传成功后, 只需要保存后缀是m3u8文件的访问地址(mp4转成m3u8的时候.m3u8文件与ts文件已经有了对应的索引关系, m3u8视频文件夹里的所有文件必须上传到同一个文件夹内, 否则访问不了)
              let fileData = {
                url: filePath + fileName, // 不包含访问前缀
                // url: 'https://' + item.data.Location, // 全路径
                size: size,
                name: fileName,
                key: filePath + fileName,
              }
              resolve(fileData)
            }
          })
        }
      }
    )
  })
}
  • 2.2 html中插入文件夹上传代码
  <!-- 上传m3u8 -->
  <el-button type="primary"  @click="m3u8Upload" style="margin-left: 30px;">上传m3u8</el-button>
  <!-- 要想上传文件夹, input 需指定 type类型为 file, webkitdirectory为true 上传文件夹 -->
  <input type="file" id="m3u8Upload" webkitdirectory style="position: absolute; left: 1000000px" @change="m3u8UploadChange($event)">
import {onMounted, ref, reactive, watch} from 'vue'
import { uploadFilesToCos } from "@/api/cos.js";
const cosClient = null
const fileList = ref([])
onMounted(() => {
	//初始cos
	initOss().then(res=>{
	  cosClient = res;
	})
})
// 在这里说明下 用的vue3框架, <script setup></script>
const m3u8Upload = () => {
  let element = document.getElementById('m3u8Upload')
  element.value = null  // 清空上一次的上传
  element.click() // 触发input的上传事件
}
const m3u8UploadChange = ($event) => {
   console.log($event)
   let fileName = ''
   let size = 0
   let files = $event.target.files
   if (files) {
     for (let key in files) {
       if (files[key].type) {
         fileName = files[key].name
       }
       if (typeof files[key].size === 'number') {
         size += files[key].size
       }
     }
     if (size > 1024 * 1024 * 1024) {
       return ElMessage.error('附件大小不可超过1G')
     }
     uploadFilesToCos(files, fileName, size, cosClient).then(res=>{
       if(res && res.url){
         console.log('res', res)
         fileList.value.push({
           name: res.name,
           url: res.url
         })
       }
     })
   }
}
// 文件夹上传成功后, 调用后端接口保存访问地址数组即可

3. 播放m3u8 视频

  • 3.1 使用TCplayer进行视频播放(上边第一步index.html导入的css和js就是TCplayer播放插件
<!--id为自定义id-->
<video id="player-container-id" width="800" height="450" preload="auto" playsinline webkit-playsinline></video>
let player = ref(null)
// url 为m3u8视频的全路径
// 播放m3u8视频
function m3u8Player(url) {
	setTimeout(() => { // 倒计时是为了video元素渲染完成才能拿到该元素
      // player-container-id 为播放器容器 ID,必须与 html 中一致
      player.value = TCPlayer(document.getElementById('player-container-id'), {
        reportable: false,
      })
      player.value.src(url); // url 播放地址, 全路径
      console.log('player', player.value)
    },100)
}
// 关闭m3u8视频播放, 并清楚 player
function m3u8Close() {
	if (player.value) {
		player.value.pause()
		player.value = null
	}
}
  • 3.2 使用video.js进行m3u8格式视频播放
//安装 3个插件对应版本如下
npm install video.jst@7.13.3 videojs-contrib-hls@5.15.0 videojs-flash@2.2.1
	<div class="video-box play-box" ref="videoBox" v-if="showPlayer">
	    <video  
	         id="videoPlayer"
	         ref='videoPlayer'
	         disablePictureInPicture
	         controlsList="nodownload"
	         class="play-back video-js vjs-default-skin vjs-big-play-centered"
	         controls
	         preload="none">
	     </video>
   </div>
	import Videojs from "video.js"
	const myPlayer = ref(null)
	// 关闭视频播放
	function closeVideo () {
	  myPlayer.value.dispose()
	},
	// 初始化播放
	async function initVideo(url) {
	  // 这些options属性也可直接设置在video标签上,见 muted
	  let options = {
	    autoplay: true, // 设置自动播放
	    controls: true, // 显示播放的控件
	    sources: [
	      // 注意,如果是以option方式设置的src,是不能实现 换台的 (即使监听了url也没实现)
	      {
	        src: url, // 视频文件的全路径
	        type: "application/x-mpegURL" // 告诉videojs,这是一个hls流
	      }
	    ]
	  };
	  // videojs的第一个参数表示的是,文档中video的id
	 myPlayer.value = Videojs("videoPlayer", options);
	},
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 为了播放 m3u8 视频,你需要有一个支持 m3u8 格式的视频播放器。常用的视频播放器有 VLC、Potplayer 等。 你需要在这些视频播放器中打开 m3u8 文件,即可播放视频。 你也可以使用网络播放器,比如 HLS.js,来在网页中播放 m3u8 视频。 需要注意的是,有些 m3u8 视频可能需要代理才能访问,因此你可能需要设置代理服务器。 ### 回答2: 播放m3u8视频主要有两种方法:通过浏览器播放和通过专门的m3u8播放播放。 通过浏览器播放m3u8视频,首先需要确保您的浏览器支持HLS协议。打开浏览器,输入m3u8视频的URL地址,浏览器会自动识别并加载该视频。如果浏览器不支持HLS协议,您可以安装插件或升级浏览器版本。通过浏览器播放m3u8视频的优点是方便简单,无需安装额外的软件。 通过专门的m3u8播放播放m3u8视频,需要先下载并安装合适的m3u8播放器。常见的m3u8播放器有VLC媒体播放器、PotPlayer、MPC-HC等。打开m3u8播放器,点击播放器的“打开文件”或“打开URL”选项,将m3u8视频的URL地址粘贴进去并确认,即可开始播放视频。通过专门的m3u8播放播放m3u8视频的优点是支持更多的格式和功能,播放效果更好。 无论是使用浏览器还是专门的m3u8播放播放m3u8视频,要确保网络连接稳定,视频源可用,避免卡顿和中断。此外,对于某些下载加密的m3u8视频,可能需要提供相应的授权证书或密钥才能正常播放。 ### 回答3: 要播放m3u8视频,你可以按照以下步骤进行操作。 首先,你需要确保你的设备上已经安装了支持m3u8格式的视频播放器。市面上有许多播放器可以播放m3u8视频,例如VLC媒体播放器和PotPlayer等。你可以在应用商店或者官方网站上下载并安装这些播放器。 安装好播放器后,你可以打开一个浏览器,使用搜索引擎搜索你想观看的m3u8视频地址。通常,你可以在视频网站上找到这个地址,如YouTube、豆瓣等。拷贝这个地址。 接下来,你可以打开已安装的播放器,点击播放器界面上的“打开”按钮。在弹出的文件选择窗口中,将之前拷贝的m3u8视频地址粘贴进去,然后点击“确定”或“打开”。 播放器会自动解析m3u8视频地址,加载视频资源。加载完成后,你就可以在播放器界面上看到视频的缩略图和控制按钮。点击播放按钮,就可以开始播放m3u8视频了。 如果你想调整视频的清晰度或其他参数,可以查看播放器界面上的菜单选项或设置按钮。不同的播放器可能具有不同的调整选项,请根据自己的需要进行设置。 总的来说,播放m3u8视频并不困难,只需要使用支持m3u8格式的播放器,并将视频地址粘贴进去即可。希望以上的回答能够帮助到你。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值