likes
comments
collection
share

视频播放器 Plyr 和 DPlayerPlyr 是简单、轻量级的 HTML5 播放器,但在播放大文件时可能会出现卡顿;

作者站长头像
站长
· 阅读数 52

主要介绍了两种视频播放器的基本使用和配置等。Plyr 是一个简单、轻量级且高度可定制化的 HTML5 播放器,但在播放大文件时可能会出现卡顿;DPlayer 是一个轻量级的 HTML5 视频播放器,支持 HLS 格式视频播放。通过将大视频文件切片成多个较小的片段,可以提高加载速度和节省带宽资源。

1. Plyr 视频播放器

1.1 安装

Plyr 是一个简单、轻量级、可定制的 HTML5 播放器

npm 地址:www.npmjs.com/package/ply…

plyer 地址:github.com/sampotts/pl…

安装依赖:

# 我的版本:"plyr-react": "^5.3.0"
npm install plyr-react

1.2 组件实现

// PlyrVideo.tsx视频组件
import Plyr from "plyr-react";
import "plyr-react/plyr.css";
import "./index.scss";

interface iProps {
  videoSrc: string;
  autoPlay?: boolean;
  videoRef: any;
}

function Page(props: iProps) {
  const { videoSrc, autoPlay = false, videoRef } = props;

  return (
    <div className="pp_video">
      <Plyr
        ref={videoRef}
        source={{
          type: "video",
          sources: [{ src: videoSrc, type: "video/mp4" }],
        }}
        options={{
          // 加载时自动播放媒体
          autoplay: autoPlay,
          // 是否在播放其他媒体时自动暂停当前媒体(一次只允许一个播放)
          autopause: true,
          // 单击或轻触视频容器将切换播放/暂停
          clickToPlay: true,
          // 显示的控件列表
          controls: [
            // "play-large", // 大尺寸播放按钮
            "play", // 播放/暂停按钮
            // "rewind", // 快退按钮
            // "fast-forward", // 快进按钮
            "progress", // 进度条
            "current-time", // 当前时间
            "mute", // 静音按钮
            "volume", // 音量控制器
            // "captions", // 字幕按钮
            "settings", // 设置按钮
            // "pip", // 画中画模式按钮
            "fullscreen", // 全屏按钮
          ],
          // 设置选项
          settings: ["captions", "quality", "speed", "loop"],
          // 字幕相关配置
          captions: {
            active: true, // 是否启用字幕
            language: "auto", // 字幕语言
            update: true, // 更新字幕
          },
          // 全屏配置
          fullscreen: {
            enabled: true, // 切换是否应启用全屏
            fallback: true, // 允许回退到完整窗口解决方案true/false/“force”)
            container: "c_layout_page", // player元素祖先的选择器
          },
          // 预览缩略图配置
          previewThumbnails: {
            enabled: false, // 是否启用预览缩略图
            src: "", // 缩略图资源 URL
          },
          // 配置可用的速度选项
          speed: {
            selected: 1, // 播放的默认速度
            options: [0.75, 1, 1.25, 1.5, 2], // 速度选项
          },
          // 国际化多语言配置
          i18n: {
            speed: "播放速率",
            normal: "正常",
          },
          // 时间轴段落标记
          markers: {
            enabled: false,
            points: [
              { time: 5, label: "段落标记1" },
              { time: 10, label: "段落标记2" },
            ],
          },
        }}
      />
    </div>
  );
}

export default Page;

视频播放器 Plyr 和 DPlayerPlyr 是简单、轻量级的 HTML5 播放器,但在播放大文件时可能会出现卡顿;

1.3 关闭事件

在 Modal 模态框打开视频组件,关掉 Modal 时,PlyrVideo 还在播放,需要手动处理,调用 stop 方法来停止视频播放。

const handleClose = () => {
  // 在关闭模态框前,确保视频停止播放
  if (videoRef.current && videoRef.current.plyr) {
    videoRef.current.plyr.stop();
  }
};

2. DPlayer 视频播放器

因为 PlyrVideo 播放器,在视频文件比较大的时候,是一边加载一边播放,播放会很卡,用户感觉体验不好。

项目组讨论的解决方案为:视频切片,将一个完整的视频文件分割成多个较小的片段,每个片段可以独立存储和传输。这种方法可以提高视频上传的速度和效率,特别是在网络条件不佳的情况下。

HLS (HTTP Live Streaming) 是一种基于 HTTP 协议的流媒体传输协议,它将视频内容分割成一系列较小的文件片段,并通过 HTTP 服务器向客户端提供这些文件片段。HLS 格式的视频文件通常由一个.m3u8 文件和多个.ts 文件组成,其中.m3u8 文件包含了所有.ts 文件的列表和时间戳信息。

  • 提高加载速度:视频切片可以并行加载,从而加快视频的加载速度。
  • 节省带宽资源:HLS 格式可以根据用户的网络状况动态调整视频质量,减少带宽消耗。
  • 错误恢复:单个切片加载失败时,只需要重新加载该切片,而不需要重载整个视频。

将视频文件上传到阿里云 OSS 中,然后转成 HLS 格式(视频切片后会将原视频切片,分割为一个.m3u8 与若干.ts 文件,当对视频读取时,会按照时间节点通过.m3u8 中的文件地址读取相应的.ts 文件,大大减少了视频加载时的等待时间)。

前端视频播放组件,就需要支持播放.m3u8 格式视频。因此使用了 DPlayer,分段加载播放。

DPlayer 是一个轻量级的 HTML5 视频播放器,支持多种视频格式,包括 HLS 格式。

官方文档:dplayer.diygod.dev/guide.html

2.1 引入

在 HTML 文件中引入 DPlayer 和 HLS.js 的 CDN 链接。

// index.html文件中引入
<body>
  <noscript>You need to enable JavaScript to run this app.</noscript>
  <div id="root"></div>
  <script
    src="https://cdn.jsdelivr.net/npm/hls.js@1.1.5/dist/hls.min.js"
    async
  ></script>
  <script
    src="https://cdn.jsdelivr.net/npm/dplayer@1.26.0/dist/DPlayer.min.js"
    async
  ></script>
</body>

2.2 组件实现

// DPlayerVideo.tsx视频组件
import { useEffect } from "react";
import "./index.scss";

interface iProps {
  videoSrc: string;
  autoPlay?: boolean;
  videoRef: any;
}

function Page(props: iProps) {
  const { videoSrc, autoPlay = false } = props;

  useEffect(() => {
    if (!videoSrc) return;

    // 创建播放器
    // @ts-ignore
    const dp = new DPlayer({
      container: document.getElementById("dplayer"),
      autoplay: autoPlay, // 自动播放
      live: false, // 直播模式
      theme: "#4593ea", // 主题颜色
      loop: true, // 循环播放
      lang: "zh-cn", // 语言选择
      screenshot: false, // 截图选项
      hotkey: true, // 热键开启
      airplay: false, // 在 Safari 中开启 AirPlay
      mutex: true, // 播放器互斥
      preload: "auto", // 视频预加载
      volume: 1, // 默认音量
      hls: {
        // HLS 配置
        withCredentials: false,
        overrideNative: false,
        startPosition: 0,
      },
      video: {
        url: videoSrc,
        type: "hls", // 视频类型
        // pic: "", // 视频封面
        // thumbnails: "", // 缩略图
      },
    });
    console.log(dp.plugins.hls); // Hls 实例
    // 如果需要自动播放,则先将音量设为 0
    if (autoPlay) {
      dp.play();
    }

    // 清理函数
    return () => {
      dp.destroy(); // 销毁 DPlayer 实例
    };
  }, [videoSrc, autoPlay]);

  return (
    <div className="pp_video">
      <div id="dplayer"></div>
    </div>
  );
}

export default Page;

视频播放器 Plyr 和 DPlayerPlyr 是简单、轻量级的 HTML5 播放器,但在播放大文件时可能会出现卡顿;

3. 使用

<DPlayerVideo
  videoSrc={detail?.resourceUrl}
  autoPlay={true}
  videoRef={videoRef}
/>

4. 兼容性问题

360极速浏览器中,有时候会报错:Unexpedted Application Error! DPlayer is not defined

原因分析:点击播放时,DPlayer.js文件还没加载完毕,导致报错

问题解决:调整DPlayer加载时机

转载自:https://juejin.cn/post/7410670277309792271
评论
请登录