🍊 UglyOrange
💻 软件

ArtPlayer.js:一款现代化 HTML5 视频播放器

frigidpluto Views: ...

推荐一款现代化、功能全面的 HTML5 视频播放器 ArtPlayer.js,支持高度自定义和扩展,适用于 Web 和移动端视频播放场景。

核心功能与特点

  • 功能丰富且高度可定制

    • 支持主流视频格式(e.g., .mp4)和流媒体协议(通过集成 flv.jshls.jsdash.js 等库)。
    • 直接兼容 .vtt.ass.srt 字幕格式,支持多字幕插件(如 artplayer-plugin-multiple-subtitles)。
    • 提供弹幕功能(artplayer-plugin-danmuku)、画中画(artplayer-plugin-document-pip)等扩展插件。
  • 技术架构清晰易维护

    • 代码高度解耦,逻辑模块化,便于调试和新增功能。
  • 插件生态与扩展性

    • 提供丰富的插件(如广告支持 artplayer-plugin-vast、字幕解析 artplayer-plugin-libass)。
    • 支持与其他库(如 webtorrent.js)集成,适应不同流媒体需求。

安装与使用

  • 安装方式
    • npm: npm install artplayer
    • CDN: 直接引入 <script src="https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.js">
  • 基础用法示例
    let art = new Artplayer({
      container: ".artplayer-app",
      url: "path/to/video.mp4",
    });
  • 插件支持丰富:包括弹幕、HLS/DASH 控制、缩略图生成、字幕加载、视频章节、视频背景等,非常强大。

一条完整的 ArtPlayer.js 初始化代码示例

var art = new Artplayer({
  container: ".artplayer-app",
  url: "/assets/sample/video.mp4",
  poster: "/assets/sample/poster.jpg",
  volume: 0.5,
  isLive: false,
  muted: false,
  autoplay: false,
  pip: true,
  autoSize: true,
  autoMini: true,
  screenshot: true,
  setting: true,
  loop: true,
  flip: true,
  playbackRate: true,
  aspectRatio: true,
  fullscreen: true,
  fullscreenWeb: true,
  subtitleOffset: true,
  miniProgressBar: true,
  mutex: true,
  backdrop: true,
  playsInline: true,
  autoPlayback: true,
  airplay: true,
  theme: "#23ade5",
  lang: navigator.language.toLowerCase(),
  moreVideoAttr: {
    crossOrigin: "anonymous",
  },
  settings: [
    {
      width: 200,
      html: "Subtitle",
      tooltip: "Bilingual",
      icon: '<img width="22" height="22" src="/assets/img/subtitle.svg">',
      selector: [
        {
          html: "Display",
          tooltip: "Show",
          switch: true,
          onSwitch(item) {
            item.tooltip = item.switch ? "Hide" : "Show";
            art.subtitle.show = !item.switch;
            return !item.switch;
          },
        },
        {
          default: true,
          html: "Bilingual",
          url: "/assets/sample/subtitle.srt",
        },
        {
          html: "Chinese",
          url: "/assets/sample/subtitle.cn.srt",
        },
        {
          html: "Japanese",
          url: "/assets/sample/subtitle.jp.srt",
        },
      ],
      onSelect(item) {
        art.subtitle.switch(item.url, {
          name: item.html,
        });
        return item.html;
      },
    },
    {
      html: "Switcher",
      icon: '<img width="22" height="22" src="/assets/img/state.svg">',
      tooltip: "OFF",
      switch: false,
      onSwitch(item) {
        item.tooltip = item.switch ? "OFF" : "ON";
        console.info("You clicked on the custom switch", item.switch);
        return !item.switch;
      },
    },
    {
      html: "Slider",
      icon: '<img width="22" height="22" src="/assets/img/state.svg">',
      tooltip: "5x",
      range: [5, 1, 10, 0.1],
      onRange(item) {
        return `${item.range[0]}x`;
      },
    },
    {
      html: "Button",
      icon: '<img width="22" height="22" src="/assets/img/state.svg">',
      tooltip: "tooltip",
      onClick() {
        return "Button clicked";
      },
    },
  ],
  contextmenu: [
    {
      html: "Custom menu",
      click(contextmenu) {
        console.info("You clicked on the custom menu");
        contextmenu.show = false;
      },
    },
  ],
  layers: [
    {
      html: '<img width="100" src="/assets/sample/layer.png">',
      click() {
        window.open("https://aimu.app");
        console.info("You clicked on the custom layer");
      },
      style: {
        position: "absolute",
        top: "20px",
        right: "20px",
        opacity: ".9",
      },
    },
  ],
  quality: [
    {
      default: true,
      html: "SD 480P",
      url: "/assets/sample/video.mp4?q=480",
    },
    {
      html: "HD 720P",
      url: "/assets/sample/video.mp4?q=720",
    },
  ],
  thumbnails: {
    url: "/assets/sample/thumbnails.png",
    number: 60,
    column: 10,
    scale: 0.85,
  },
  subtitle: {
    url: "/assets/sample/subtitle.srt",
    type: "srt",
    style: {
      color: "#fe9200",
      fontSize: "20px",
    },
    encoding: "utf-8",
  },
  highlight: [
    {
      time: 15,
      text: "One more chance",
    },
    {
      time: 30,
      text: "谁でもいいはずなのに",
    },
    {
      time: 45,
      text: "夏の想い出がまわる",
    },
    {
      time: 60,
      text: "こんなとこにあるはずもないのに",
    },
    {
      time: 75,
      text: "终わり",
    },
  ],
  controls: [
    {
      position: "right",
      html: "Control",
      index: 1,
      tooltip: "Control Tooltip",
      style: {
        marginRight: "20px",
      },
      click() {
        console.info("You clicked on the custom control");
      },
    },
  ],
  icons: {
    loading: '<img src="/assets/img/ploading.gif">',
    state: '<img width="150" height="150" src="/assets/img/state.svg">',
    indicator: '<img width="16" height="16" src="/assets/img/indicator.svg">',
  },
});

效果图:

ArtPlayer.js 效果图
ArtPlayer.js 效果图

类似的项目还是挺多的,比如 plyrvideo.jshls.js 等。 plyr 也是一款简单优雅,功能十分强大的视频播放器,笔者在 twitdown.com 这个项目上用的就是 plyr 播放器,非常推荐使用。

plyr preview
plyr preview

链接