Project Icon

react-player

React多媒体播放组件 支持多种视频音频源

react-player是一个功能全面的React多媒体播放组件。它支持播放YouTube、Facebook、Twitch等平台的视频,以及本地音视频文件。该组件提供丰富的配置项和事件回调,可灵活控制播放行为。它还具备响应式设计、轻量模式等特性。react-player为开发者提供了便捷的方式来集成多种来源的媒体播放功能。

ReactPlayer

最新npm版本 测试覆盖率 在Patreon上成为赞助商

一个React组件,用于播放各种URL,包括文件路径、YouTube、Facebook、Twitch、SoundCloud、Streamable、Vimeo、Wistia、Mixcloud、DailyMotion和Kaltura。不使用React?没问题。


使用Next.js并需要处理视频上传/处理?请查看 next-video

✨ ReactPlayer的未来

ReactPlayer的维护将由 Mux 接管。Mux团队参与过许多备受尊敬的项目,并致力于改进开发者的视频工具。

ReactPlayer将保持开源,但修复和发布的频率会随时间增加。感谢社区中每个人一直以来的支持。

使用方法

npm install react-player # 或 yarn add react-player
import React from 'react'
import ReactPlayer from 'react-player'

// 渲染YouTube视频播放器
<ReactPlayer url='https://www.youtube.com/watch?v=LXb3EKWsInQ' />

默认情况下,ReactPlayer支持多种类型url。如果你只使用一种类型,可以使用react-player/youtube这样的导入来减少你的包大小。查看配置键了解所有播放器键。

import React from 'react'
import ReactPlayer from 'react-player/youtube'

// 只加载YouTube播放器
<ReactPlayer url='https://www.youtube.com/watch?v=LXb3EKWsInQ' />

如果你的构建系统支持import()语句,使用react-player/lazy来懒加载适合你传入的url的播放器。这会在你的输出中添加几个reactPlayer分块,但减少了主包的大小。

import React from 'react'
import ReactPlayer from 'react-player/lazy'

// 懒加载YouTube播放器
<ReactPlayer url='https://www.youtube.com/watch?v=ysz5S6PUM-U' />

演示页面:https://cookpete.github.io/react-player

该组件解析URL并加载适当的标记和外部SDK,以播放来自各种来源的媒体。可以传入属性来控制播放和响应缓冲或媒体结束等事件。查看演示源代码获取完整示例。

对于不直接使用npm模块的平台,安装后在dist目录中有一个压缩版的ReactPlayer。要自己生成这个文件,请检出仓库并运行npm run build:dist

自动播放

从Chrome 66开始,视频必须设置为muted才能自动播放。一些播放器,如Facebook,在用户与视频交互之前无法取消静音,因此你可能需要启用controls以允许用户自己取消视频静音。请设置muted={true}

属性

属性描述默认值
url要播放的视频或歌曲的URL
  ◦  可以是数组MediaStream对象
playing设置为truefalse来暂停或播放媒体false
loop设置为truefalse来循环播放媒体false
controls设置为truefalse来显示原生播放器控件
  ◦  对于Vimeo视频,隐藏控件必须由视频所有者启用
false
light设置为true只显示视频缩略图,点击时加载完整播放器
  ◦  传入图片URL可覆盖预览图
false
volume设置播放器音量,介于01之间
  ◦  null在所有播放器上使用默认音量#357
null
muted使播放器静音
  ◦  仅当设置了volume时有效
false
playbackRate设置播放器的播放速率
  ◦  仅YouTube、Wistia和文件路径支持
1
width设置播放器宽度640px
height设置播放器高度360px
style为根元素添加内联样式{}
progressIntervalonProgress回调之间的时间间隔,以毫秒为单位1000
playsinline在支持的地方应用playsinline属性false
pip设置为truefalse来启用或禁用画中画模式
  ◦  仅在播放文件URL时在特定浏览器中可用
false
stopOnUnmount如果使用pip,可能需要使用stopOnUnmount={false}以便在ReactPlayer卸载后继续在画中画模式下播放true
fallback如果使用延迟加载,用作回退的元素或组件null
wrapper用作容器元素的元素或组件div
playIcon在light模式下用作播放图标的元素或组件
previewTabIndex设置在light模式下使用的tab索引0
config覆盖各种播放器的选项,参见config prop

回调属性

回调属性接受一个在各种播放器事件上触发的函数:

属性描述
onReady当媒体加载完毕并准备播放时调用。如果playing设置为true,媒体将立即播放
onStart当媒体开始播放时调用
onPlay当媒体在暂停或缓冲后开始或恢复播放时调用
onProgress包含playedloaded进度(以分数表示),以及playedSecondsloadedSeconds(以秒表示)的回调
  ◦  例如{ played: 0.12, playedSeconds: 11.3, loaded: 0.34, loadedSeconds: 16.7 }
onDuration包含媒体时长(以秒为单位)的回调
onPause当媒体暂停时调用
onBuffer当媒体开始缓冲时调用
onBufferEnd当媒体完成缓冲时调用
  ◦  适用于文件、YouTube和Facebook
onSeek当媒体进行跳转时调用,带有seconds参数
onPlaybackRateChange当播放器的播放速率改变时调用
  ◦  仅YouTube、Vimeo(如果启用)、Wistia和文件路径支持
onPlaybackQualityChange当播放器的播放质量改变时调用
  ◦  仅YouTube支持(如果启用
onEnded当媒体播放结束时调用
  ◦  当loop设置为true时不触发
onError当尝试播放媒体时发生错误时调用
onClickPreview当用户点击light模式预览时调用
onEnablePIP当启用画中画模式时调用
onDisablePIP当禁用画中画模式时调用

Config属性

有一个单独的config属性用于覆盖每种类型播放器的设置:

<ReactPlayer
  url={url}
  config={{
    youtube: {
      playerVars: { showinfo: 1 }
    },
    facebook: {
      appId: '12345'
    }
  }}
/>

每个播放器的设置位于不同的键下:

选项
youtubeplayerVars: 覆盖默认播放器参数
embedOptions: 覆盖默认嵌入选项
onUnstarted: 当状态变为unstarted时调用(通常是视频无法自动播放时)
facebookappId: 你自己的Facebook应用ID
version: Facebook SDK版本
playerId: 覆盖播放器ID以实现一致的服务器端渲染(与react-uid一起使用)
attributes: 传递给fb-video元素的额外数据属性
soundcloudoptions: 覆盖默认播放器选项
vimeoplayerOptions: 覆盖默认参数
title: 设置播放器iframe的title属性
muxattributes: 应用元素属性
version: Mux播放器版本
wistiaoptions: 覆盖默认播放器选项
playerId: 覆盖播放器ID以实现一致的服务器端渲染(与react-uid一起使用)
mixcloudoptions: 覆盖默认播放器选项
dailymotionparams: 覆盖默认播放器变量
twitchoptions: 覆盖默认播放器选项
playerId: 覆盖播放器ID以实现一致的服务器端渲染(与react-uid一起使用)
fileattributes: 应用元素属性
forceVideo: 始终渲染<video>元素
forceAudio: 始终渲染<audio>元素
forceHLS: 对HLS流使用hls.js
forceSafariHLS: 对HLS流使用hls.js即使在Safari上
forceDisableHLS: 禁用对HLS流使用hls.js
forceDASH: 始终对DASH流使用dash.js
forceFLV: 始终使用flv.js
hlsOptions: 覆盖默认的hls.js选项
hlsVersion: 覆盖从jsdelivr加载的hls.js版本,默认:0.13.1
dashVersion: 覆盖从cdnjs加载的dash.js版本,默认:2.9.2
flvVersion: 覆盖从jsdelivr加载的flv.js版本,默认:1.5.0

方法

静态方法

方法描述
ReactPlayer.canPlay(url)判断是否可以播放一个URL。这能检测由于隐私设置、流媒体权限等原因而无法播放的媒体。在这种情况下,尝试播放后会调用onError属性。任何不匹配任何模式的URL都会回退到原生HTML5媒体播放器。
ReactPlayer.canEnablePiP(url)判断一个URL是否可以在画中画模式中播放
ReactPlayer.addCustomPlayer(CustomPlayer)添加自定义播放器。参见添加自定义播放器
ReactPlayer.removeCustomPlayers()移除使用addCustomPlayer()添加的所有播放器

实例方法

使用ref来调用播放器的实例方法。参见演示应用中的示例。

方法描述
seekTo(amount, type)跳转到指定的秒数,如果amount介于01之间则为比例
  ◦  type参数允许你指定'seconds''fraction'来覆盖默认行为
getCurrentTime()返回已播放的秒数
  ◦  如果不可用则返回null
getSecondsLoaded()返回已加载的秒数
  ◦  如果不可用或不支持则返回null
getDuration()返回当前播放媒体的时长(以秒为单位)
  ◦  如果时长不可用则返回null
getInternalPlayer()返回当前正在播放的内部播放器
  ◦  例如YouTube播放器实例,或播放视频文件时的<video>元素
  ◦  使用getInternalPlayer('hls')获取hls.js播放器
  ◦  使用getInternalPlayer('dash')获取dash.js播放器
  ◦  如果内部播放器不可用则返回null
showPreview()使用light模式时,返回到预览覆盖层

高级用法

轻量级播放器

light属性将渲染一个带有简单播放图标的视频缩略图,只有在用户与图像交互后才会加载完整的播放器。使用Noembed来获取视频URL的缩略图。注意,不支持自动获取Facebook、Wistia、Mixcloud和文件URL的缩略图,且不保证持续支持其他URL。

如果你想传入自己的缩略图使用,将light设置为图片URL而不是true

你也可以通过light属性传递一个组件:

<ReactPlayer light={<img src='https://example.com/thumbnail.png' alt='缩略图' />} />

预览图片和播放图标的样式可以通过覆盖CSS类 react-player__previewreact-player__shadowreact-player__play-icon 来修改。

响应式播放器

widthheight 设置为 100%,并将播放器包裹在一个固定宽高比的盒子中,即可得到一个响应式播放器:

class ResponsivePlayer extends Component {
  render () {
    return (
      <div className='player-wrapper'>
        <ReactPlayer
          className='react-player'
          url='https://www.youtube.com/watch?v=ysz5S6PUM-U'
          width='100%'
          height='100%'
        />
      </div>
    )
  }
}
.player-wrapper {
  position: relative;
  padding-top: 56.25%; /* 播放器比例: 100 / (1280 / 720) */
}

.react-player {
  position: absolute;
  top: 0;
  left: 0;
}

查看 jsFiddle 示例

SDK 覆盖

你可以使用任何播放器SDK的自定义版本,只要在播放器挂载前正确设置 window 全局变量即可。例如,要使用 hls.js 的本地版本,可以在你的应用中添加 <script src='/path/hls.js'></script>。如果在 ReactPlayer 挂载时 window.Hls 可用,它将使用该版本,而不是从 cdnjs 加载 hls.js。更多信息请参见 #605

独立播放器

如果你没有使用 React,你仍然可以使用独立库来渲染播放器:

<script src='https://cdn.jsdelivr.net/npm/react-player/dist/ReactPlayer.standalone.js'></script>
<script>
  const container = document.getElementById('container')
  const url = 'https://www.youtube.com/watch?v=d46Azg3Pm4c'

  renderReactPlayer(container, { url, playing: true })

  function pausePlayer () {
    renderReactPlayer(container, { url, playing: false })
  }
</script>

查看 jsFiddle 示例

添加自定义播放器

如果你有自己的播放器,并且与 ReactPlayer 的内部架构兼容,你可以使用 addCustomPlayer 添加它:

import YourOwnPlayer from './somewhere';
ReactPlayer.addCustomPlayer(YourOwnPlayer);

使用 removeCustomPlayers 清除所有自定义播放器:

ReactPlayer.removeCustomPlayers();

你有责任确保自定义播放器能跟上 ReactPlayer 后续版本的任何内部变化。

移动设备注意事项

由于各种限制,无法保证 ReactPlayer 在移动设备上正常运行。例如,YouTube 播放器文档解释说某些移动浏览器在播放前需要用户交互:

在某些移动浏览器(如 Chrome 和 Safari)中,HTML5 <video> 元素只允许通过用户交互(如点击播放器)来启动播放。

多个源和音轨

将 YouTube URL 数组传递给 url 属性将加载它们作为无标题播放列表。

<ReactPlayer
  url={[
    'https://www.youtube.com/watch?v=oUFJJNQGwhk',
    'https://www.youtube.com/watch?v=jNgP6d9HraI'
  ]}
/>

播放文件路径时,可以将源数组传递给 url 属性以渲染多个 <source> 标签。

<ReactPlayer playing url={['foo.webm', 'foo.ogg']} />

你也可以通过使用带有 srctype 属性的对象来为每个源指定 type

<ReactPlayer
  playing
  url={[
    {src: 'foo.webm', type: 'video/webm'},
    {src: 'foo.ogg', type: 'video/ogg'}
  ]}
/>

可以使用 config.file 添加字幕的 <track> 元素:

<ReactPlayer
  playing
  url='foo.webm'
  config={{ file: {
    tracks: [
      {kind: 'subtitles', src: 'subs/subtitles.en.vtt', srcLang: 'en', default: true},
      {kind: 'subtitles', src: 'subs/subtitles.ja.vtt', srcLang: 'ja'},
      {kind: 'subtitles', src: 'subs/subtitles.de.vtt', srcLang: 'de'}
    ]
  }}}
/>

迁移到 v2.0

ReactPlayer v2.0 更改了单个播放器的导入方式,并添加了懒加载播放器。同时移除了对 preload 的支持,以及一些其他变更。有关信息请参见 MIGRATING.md

支持的媒体

贡献

在创建拉取请求之前,请查看贡献指南

致谢

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号