uniapp纯前端爬取视频,免费追剧神器,开箱即用,内置接口源,选集,投屏,倍速播放都已适配,下一集,弹幕,截图等未适配,有需要的自己实现。
作者: 140***@qq.com 
下载人数: 4 下载次数: 5
收藏人数: 2
(0)
插件ID:jds-tv
插件包体积:21.3MB
更新记录
1.8.8(2024-06-04)
1.通过内置api.js获取视频源,无后端,纯前端项目。 2.内置好用播放器ext.dcloud.net.cn/plugin?id=8… 3.新增全屏的时候选集功能。 4.新增右上角投屏功能,投屏仅支持安卓端,不同投机系统适配不一样,有需要的自己再适配。 5.新增分享功能,你觉得比较好看的视频可以点击分享按钮复制视频地址发给好朋友。 6.新增香港tv源。 7.新增播放器顶部滚动公告。
平台兼容性
| App | 快应用 | 微信小程序 | 支付宝小程序 | 百度小程序 | 字节小程序 | QQ小程序 |
|---|
| HBuilderX 3.91 app-vue | × | × | × | × | × | × |
| H5-Safari | Android Browser | 微信浏览器(Android) | QQ浏览器(Android) | Chrome | IE | Edge | Firefox | PC-Safari |
|---|
| × | × | × | × | × | × | × | × | × |
使用须知
- 1.这个纯前端视频软件一共用了了两个开源的插件进行修改而成。【1.无后端影视 2.好用播放器】
- 2.本项目新增了动态获取视频封面为轮播图,并且点击轮播图可进行对应的视频播放。
- 3.支持视频格式有ogg、mp4、webm、m3u8、flv
- 4.支持弹幕功能
- 5.将搜索框移到了主页,更集中
- 6.播放器添加了投屏功能,投屏功能仅适用安卓端,不同手机需自己适配进行实现投屏,本人手机当贝投影仪已适配,可投屏。
- 7.播放器新增了选集功能,全屏状态下不用退出全屏进行选集。
- 8.新增播放器顶部滚动公告栏。
- 9.播放器右上角新增当时北京时间和当前第几集显示,让你不用点击屏幕也能知道当前时间,主打纯净追剧。
- 10.播放器左边加入了logo显示,全屏状态隐藏logo,还加入了分享功能,遇到好看的视频可以点击复制微信粘贴分享给好友看。
- 11.未实现的功能还有,下一集,需要自己去修改动态获取下一集的videourl。弹幕和截屏也需要自己实现。本人业余爱好者,有什么建议可以加我qq:1406389941进行交流指导。
- 下面是好用播放器的适用说明,可以根据下面的使用说明进行自定义,比如跳过片头片尾。
props属性
| 属性名 | 类型 | 默认值 | 可选值 | 说明 |
|---|
| dataId | String | ---- | ---- | 唯一id( 不传入则默认随机ID) |
| src | String | ---- | ---- | 播放链接 |
| poster | String | ---- | ---- | 封面 |
| formats | String | auto | auto/mp4/ogg/webm/m3u8/flv | 视频格式(auto只能确定拥有后缀的播放链接,没有视频后缀的链接只能指定格式播放) |
| title | String | ---- | ---- | 视频标题(全屏后在顶部展示) |
| volume | Number | 1.0 | ---- | 音量 |
| duration | Number | 0 | ---- | 播放时长(当isLive为true时表现为直播已播放时长) |
| playShow | Boolean | true | true/false | 展示播放按钮 |
| timeShow | Boolean | true | true/false | 展示播放时间 |
| volumeShow | Boolean | true | true/false | 展示静音按钮 |
| settingShow | Boolean | true | true/false | 展示设置按钮 |
| fullscreenShow | Boolean | true | true/false | 展示全屏按钮 |
| prevBtnShow | Boolean | false | true/false | 展示切换上一个视频按钮 |
| nextBtnShow | Boolean | false | true/false | 展示切换下一个视频按钮 |
| initialTime | Number | 0 | ---- | 播放初始位置 (单位是秒) |
| playbackRate | Number | 1.0 | ---- | 播放倍速 |
| autoplay | Boolean | false | true/false | 自动播放 (新版的谷歌浏览器和IOS一样也不支持自动播放了,需要让用户在页面上操作之后才能进行播放,如果一定要自动播放,只能先设置为静音,然后让用户手动将静音关闭) |
| loop | Boolean | false | true/false | 循环播放 |
| preload | String | atuo | auto(加载所有资源)/meta(只加载元数据)/none(不加载) | 预加载(autoplay设置为true时忽略此属性) |
| muted | Boolean | false | true/false | 静音 |
| controls | Boolean | true | true/false | 显示控制栏 |
| settings | String | all | all(全部显示)/barrage(弹幕控制),playbackRate(倍速列表),mirror(镜像画面),capture(截取画面),pictureInPicture(画中画) | 控制栏设置菜单显示(all表示全部显示,不想全部显示但要显示多个以逗号分隔) |
| mirror | Boolean | false | true/false | 镜像画面 |
| progressShow | Boolean | true | true/false | 展示进度条 |
| barrageShow | Boolean | true | true/false | 展示弹幕 |
| barrages | Array | ---- | ---- | 弹幕列表 |
| barrageConfig | Number | 1.0 | ---- | 弹幕配置 |
| barrageGap | Number | 0 | ---- | 弹幕显示上下间距 |
| isLive | Boolean | false | true/false | 是否是直播流 |
| flvConfig | Object | ---- | ---- | flv配置 |
| segments | Array | ---- | ---- | flv切片列表 |
| fullscreenDirection | String | landscape-primary | auto/landscape-primary/portrait-primary/landscape-secondary/portrait-secondary | 全屏时设备方向 (只支持APP) |
| generallyDirection | String | portrait-primary | auto/landscape-primary/portrait-primary/landscape-secondary/portrait-secondary | 非全屏时设备方向 (只支持APP) |
| objectFit | String | contain | contain/fill/cover/none | 当视频大小与 video 容器大小不一致时,视频的表现形式。contain:包含,fill:填充,cover:覆盖,none:不处理 |
| crossOrigin | String | ---- | anoymous/use-credentials | 该枚举属性指明抓取相关图片是否必须用到CORS(跨域资源共享)。 支持CORS的资源 可在 canvas元素中被重用,而不会被污染。允许的值如下:anonymous:跨域请求会被执行,但是不发送凭证。use-credentials:跨域请求A cross-origin request会被执行,且凭证会被发送。 |
| enableBlob | Boolean | false | true/false | 将视频转化为Blob对象(仅支持mp4) |
event事件
| 事件名 | 参数 | 说明 |
|---|
| canplay | --- | 可以播放状态,但不保证后面可以流畅播放,视频总长度,尺寸信息可以从这里取到 (该事件只要视频发生加载就会触发,如果想在这个方法做一些操作,建议用loadedmetadata或loadeddata替代) |
| canplaythrough | --- | 可以正常播放且无需停顿和缓冲时触发。,视频总长度,尺寸信息可以从这里取到 (该事件只要视频发生加载就会触发,如果想在这个方法做一些操作,建议用loadedmetadata或loadeddata替代) |
| loadeddata | ---- | 加载视频当前帧时触发,视频总长度,尺寸信息可以从这里取到 |
| loadedmetadata | ---- | 元素据加载完毕,视频总长度,尺寸信息可以从这里取到 |
| loadstart | ---- | 开始加载视频时触发 |
| play | --- | 播放事件 |
| pause | --- | 暂停事件 |
| stop | --- | 停止事件 |
| ended | --- | 自然播放结束事件 |
| error | --- | 播放错误事件 |
| abort | --- | 播放中断事件 |
| timeupdate | --- | 播放进度更新事件 |
| waiting | --- | 加载中事件,当视频因为数据不足,需要停下来加载时会触发 |
| playing | --- | 继续播放事件,当视频因为数据不足停下来成功加载到数据之后继续播放时触发 |
| seeking | --- | 进行跳转进度操作事件 |
| seeked | --- | 完成跳转进度操作事件 |
| seizing | --- | 视频(直播流)播放卡住事件(仅在播放时间卡住时起效) |
| volumeChange | --- | 音量改变事件 |
| rateChange | --- | 播放倍速改变事件 |
| durationChange | --- | 播放进度改变事件 |
| fullscreenChange | --- | 全屏切换事件(type为requestfullscreen表示为全屏API调用的全屏type为cssfullscreen表示css模拟的全屏) |
| controlsChange | --- | 控制栏显示\消失事件(仅在controls为true时有效) |
| barrageChange | --- | 弹幕显示\消失事件 |
| enterpictureinpicture | --- | 进入画中画模式(仅支持H5) |
| leavepictureinpicture | --- | 退出画中画模式(仅支持H5) |
| captureFinish | --- | 截图完成事件(H5会返回blob类型和base64图片,app只返回base64) |
| prevBtnClick | --- | 点击切换上一个视频按钮事件 |
| nextBtnClick | --- | 点击切换下一个视频按钮事件 |
| statisticsInfo | --- | flv监听statistic_info事件 |
| loadingComplete | --- | flv监听loading_complete事件 |
| recoveredEarlyEof | --- | flv监听recovered_early_eof事件 |
| mediaInfo | --- | flv监听media_info事件 |
| metadataArrived | --- | flv监听metadata_arrived事件 |
| scriptdataArrived | --- | flv监听scriptdata_arrived事件 |
内置方法
| 方法名 | 参数 | 说明 |
|---|
| play | --- | 播放 |
| pause | --- | 暂停 |
| toggle | --- | 播放/暂停 |
| reload | --- | 重加载 |
| stop | --- | 停止(注销视频) |
| seek | --- | 跳转位置(单位是s) |
| drawBarrage | --- | 绘制弹幕(可传入多条弹幕) |
| capture | --- | 截取画面 |
| switchFullscreen | --- | 开启/退出全屏(部分手机不允许用户直接调用全屏API,插件自动使用css模拟全屏替代) |
| launchFullscreen | --- | 开启全屏(部分手机不允许用户直接调用全屏API,插件自动使用css模拟全屏替代) |
| exitFullscreen | --- | 退出全屏 |
| switchPictureInPicture | --- | 切换画中画(仅支持H5) |
| launchPictureInPicture | --- | 开启画中画(仅支持H5) |
| exitPictureInPicture | --- | 退出画中画(仅支持H5) |
弹幕(barrage)
| 属性名 | 类型 | 说明 |
|---|
| key | String | 弹幕的唯一标识 |
| time | Number | 弹幕出现的时间(单位:秒) |
| text | String | 弹幕文本内容 |
| fontSize | Number | 弹幕大小(单位:像素) |
| color | String | 弹幕颜色 |
弹幕配置(barrageConfig)
| 属性名 | 类型 | 默认值 | 说明 |
|---|
| duration | Number | -1 | 弹幕动画的循环周期,-1 表示不循环播放 |
| speed | Number | 150 | 弹幕的运动速度 |
| fontSize | Number | 24 | 文字大小(单位:像素) |
| fontFamily | String | 'Microsoft Yahei' | 字体 |
| textShadowBlur | Number | 0.5 | 字体阴影扩散,有效值 >= 0 |
| opacity | Number | 1 | 透明度,有效值 0-1 |
| defaultColor | String | '#ffffff' | 默认颜色,与 CSS 颜色属性一致 |
| lineHeight | Number | 5 | 行间距 |
| overlap | Boolean | true | 防重叠 |
| playbackRate | Number | 1 | 播放倍速 |
| initialTime | Number | 0 | 播放初始时间 |
flv切片列表(segments)
| 属性名 | 类型 | 说明 |
|---|
| duration | Number | 必填字段,表示段持续时间(以毫秒为单位 |
| filesize | Number | 可选字段,以字节为单位指示段文件大小 |
| url | String | 必填字段,指示段文件URL |
flv配置(flvConfig)
| 属性名 | 类型 | 默认值 | 说明 |
|---|
| cors | Boolean | ---- | 是否启用CORS进行http提取 |
| withCredentials | Boolean | ---- | 是否对Cookie进行http提取 |
| hasAudio | Boolean | ---- | 流是否有音频轨道 |
| hasVideo | Boolean | ---- | 流中是否有视频轨道 |
| duration | Number | ---- | 总媒体持续时间(以毫秒为单位) |
| filesize | Number | ---- | 媒体文件的总文件大小,以字节为单位 |
| enableWorker | Boolean | false | 启用分离的线程进行转换(暂时不稳定) |
| enableWorker | Boolean | false | 启用分离的线程进行转换(暂时不稳定) |
| enableStashBuffer | Boolean | true | 启用IO隐藏缓冲区。如果您需要实时(最小延迟)进行实时流播放,则设置为false,但是如果网络抖动,则可能会停顿 |
| stashInitialSize | Number | 384KB | 表示IO暂存缓冲区的初始大小。默认值为384KB。指出合适的尺寸可以改善视频负载/搜索时间 |
| isLive | Boolean | false | 同样要isLive在MediaDataSource,如果忽略已经在MediaDataSource结构集合 |
| lazyLoad | Boolean | true | 如果有足够的数据可播放,则中止http连接 |
| lazyLoadMaxDuration | Number | 3 * 60 | 指示要保留多少秒的数据lazyLoad |
| lazyLoadRecoverDuration | Number | 30 | 指示lazyLoad恢复时间边界,以秒为单位 |
| deferLoadAfterSourceOpen | Boolean | true | 在MediaSourcesourceopen事件触发后加载。在Chrome上,在后台打开的标签页可能不会触发sourceopen事件,除非切换到该标签页 |
| autoCleanupSourceBuffer | Boolean | false | 对SourceBuffer进行自动清理 |
| autoCleanupMaxBackwardDuration | Number | 3 * 60 | 当向后缓冲区持续时间超过此值(以秒为单位)时,请对SourceBuffer进行自动清理 |
| autoCleanupMinBackwardDuration | Number | 2 * 60 | 指示进行自动清除时为反向缓冲区保留的持续时间(以秒为单位) |
| fixAudioTimestampGap | Boolean | true | 当检测到较大的音频时间戳间隙时,请填充无声音频帧,以避免A / V不同步 |
| accurateSeek | Boolean | false | 精确查找任何帧,不限于视频IDR帧,但可能会慢一些。可用的Chrome > 50,FireFox和Safari |
| seekType | String | 'range' | 'range'使用范围请求进行查找,或'param'在url中添加参数以指示请求范围 |
| seekParamStart | String | 'bstart' | 指示的搜索起始参数名称 seekType = 'param' |
| seekParamEnd | String | 'bend' | 指示的搜索结束参数名称 seekType = 'param' |
| rangeLoadZeroStart | Boolean | false | Range: bytes=0-如果使用范围查找,则发送首次负载 |
| customSeekHandler | Object | ---- | 指示自定义搜索处理程序 |
| reuseRedirectedURL | Boolean | false | 重复使用301/302重定向的url进行子序列请求,例如搜索,重新连接等 |
| referrerPolicy | String | 'no-referrer-when-downgrade' | 指示使用FetchStreamLoader时的推荐人策略 |
| headers | Object | ---- | 指示将添加到请求的其他标头 |
插槽slots
| 名称 | 说明 |
|---|
| default | 默认插槽(该插槽的内容不随控制栏一起消失/显示) |
| controls | 控制栏插槽(该插槽的内容会随控制栏一起消失/显示,仅在controls为ture时有效) |
History路由模式下引入js文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
<script type="text/javascript" src="/uni_modules/yingbing-video/static/flv.min.js"></script>
<script type="text/javascript" src="/uni_modules/yingbing-video/static/hls.min.js"></script>
<title></title>
</head>
<body>
<div id="app"></div>
</body>
</html>
快速开始
<yingbing-video src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/a876efc0-4f35-11eb-97b7-0dc4655d6e68.mp4">
</yingbing-video>
自动播放
<yingbing-video autoplay muted src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/a876efc0-4f35-11eb-97b7-0dc4655d6e68.mp4"/>
添加弹幕列表
<yingbing-video :barrages="barrages" barrage-show src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/a876efc0-4f35-11eb-97b7-0dc4655d6e68.mp4"/>
export default {
data() {
return {
barrages: [{
key:
time: 1,
text:
fontSize: 24,
color:
},{
key:
time: 1,
text:
fontSize: 24,
color:
}]
}
}
}
绘制弹幕
<yingbing-video ref="video" barrage-show src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/a876efc0-4f35-11eb-97b7-0dc4655d6e68.mp4"/>
export default {
onReady () {
setTimeout (() => {
this.$refs.video.drawBarrage({
text: '这是绘制的实时弹幕',
color: '#ff0033',
fontSize: 20,
time: 12//不传time 则根据当前播放进度绘制弹幕出现时间
})
}, 5000)
setTimeout (() => {
this.$refs.video.drawBarrage([{
text: '这是绘制的实时弹幕',
color: '#ff0033',
fontSize: 20
},{
text: '这是绘制的实时弹幕',
color: '#ff0033',
fontSize: 20
},{
text: '这是绘制的实时弹幕',
color: '#ff0033',
fontSize: 20
}])
}, 10000)
}
}
截取画面
<yingbing-video ref="video" @captureFinish="onCaptureFinish" src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/a876efc0-4f35-11eb-97b7-0dc4655d6e68.mp4"/>
<button @tap="capture">截图</button>
export default {
methods: {
capture () {
this.$refs.video.capture()
},
onCaptureFinish (e) {
console.log(e)
}
}
}
切换视频
<yingbing-video next-btn-show @nextBtnClick="onNextBtnclick" :src="src"/>
export default {
data () {
src: 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/a876efc0-4f35-11eb-97b7-0dc4655d6e68.mp4'
},
methods: {
onNextBtnclick () {
this.src = 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/a876efc0-4f35-11eb-97b7-0dc4655d6e68.mp4'
}
}
}
使用插槽
<yingbing-video src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/a876efc0-4f35-11eb-97b7-0dc4655d6e68.mp4">
<div>加载中</div>
<template #controls>
<div style="position:absolute;top:0;left:0;right:0;">视频标题</div>
</template>
</yingbing-video>