|
@@ -9,6 +9,7 @@ import iconplay from '@views/attend-class/image/icon-pause.png';
|
|
|
import iconpause from '@views/attend-class/image/icon-play.png';
|
|
|
import iconReplay from '@views/attend-class/image/icon-replay.png';
|
|
|
import iconPreviewDownload from '@views/attend-class/image/icon-preivew-download.png';
|
|
|
+import iconSpeed from '@views/attend-class/image/icon-speed.png';
|
|
|
import { NSlider, useMessage } from 'naive-ui';
|
|
|
import { saveAs } from 'file-saver';
|
|
|
|
|
@@ -46,7 +47,12 @@ export default defineComponent({
|
|
|
currentTime: '00:00',
|
|
|
durationNum: 0,
|
|
|
duration: '00:00',
|
|
|
- showBar: true
|
|
|
+ showBar: true,
|
|
|
+ speedControl: false,
|
|
|
+ speedStyle: {
|
|
|
+ left: '1px'
|
|
|
+ },
|
|
|
+ defaultSpeed: 1 // 默认速度
|
|
|
});
|
|
|
const videoRef = ref();
|
|
|
const videoItem = ref();
|
|
@@ -66,15 +72,18 @@ export default defineComponent({
|
|
|
//
|
|
|
const toggleHideControl = (isShow: false) => {
|
|
|
videoFroms.showBar = isShow;
|
|
|
+ videoFroms.speedControl = false;
|
|
|
};
|
|
|
|
|
|
const onReplay = () => {
|
|
|
+ videoFroms.speedControl = false;
|
|
|
if (!videoItem.value) return;
|
|
|
videoItem.value.currentTime(0);
|
|
|
};
|
|
|
|
|
|
// 切换音频播放
|
|
|
const onToggleVideo = (e?: MouseEvent) => {
|
|
|
+ videoFroms.speedControl = false;
|
|
|
e?.stopPropagation();
|
|
|
if (videoFroms.paused) {
|
|
|
videoItem.value.play();
|
|
@@ -104,11 +113,7 @@ export default defineComponent({
|
|
|
});
|
|
|
};
|
|
|
|
|
|
- onMounted(() => {
|
|
|
- videoItem.value = TCPlayer(videoID, {
|
|
|
- appID: '',
|
|
|
- controls: false
|
|
|
- }); // player-container-id 为播放器容器 ID,必须与 html 中一致
|
|
|
+ const __init = () => {
|
|
|
if (videoItem.value) {
|
|
|
videoItem.value.poster(poster.value); // 封面
|
|
|
videoItem.value.src(isEmtry.value ? '' : src.value); // url 播放地址
|
|
@@ -140,6 +145,14 @@ export default defineComponent({
|
|
|
emit('ended');
|
|
|
});
|
|
|
}
|
|
|
+ };
|
|
|
+
|
|
|
+ onMounted(() => {
|
|
|
+ videoItem.value = TCPlayer(videoID, {
|
|
|
+ appID: '',
|
|
|
+ controls: false
|
|
|
+ }); // player-container-id 为播放器容器 ID,必须与 html 中一致
|
|
|
+ __init();
|
|
|
});
|
|
|
expose({
|
|
|
// changePlayBtn,
|
|
@@ -175,18 +188,17 @@ export default defineComponent({
|
|
|
<img class={styles.playIcon} src={iconpause} />
|
|
|
)}
|
|
|
</button>
|
|
|
- </div>
|
|
|
- <div class={styles.time}>
|
|
|
- <div
|
|
|
- class="plyr__time plyr__time--current"
|
|
|
- aria-label="Current time">
|
|
|
- {videoFroms.currentTime}
|
|
|
- </div>
|
|
|
- <span class={styles.line}>/</span>
|
|
|
+
|
|
|
+ <button class={styles.iconReplay} onClick={onReplay}>
|
|
|
+ <img src={iconReplay} />
|
|
|
+ </button>
|
|
|
+
|
|
|
<div
|
|
|
- class="plyr__time plyr__time--duration"
|
|
|
- aria-label="Duration">
|
|
|
- {videoFroms.duration}
|
|
|
+ class={styles.actionBtnSpeed}
|
|
|
+ onClick={() => {
|
|
|
+ videoFroms.speedControl = !videoFroms.speedControl;
|
|
|
+ }}>
|
|
|
+ <img src={iconSpeed} />
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -198,6 +210,7 @@ export default defineComponent({
|
|
|
max={videoFroms.durationNum}
|
|
|
tooltip={false}
|
|
|
onUpdate:value={(val: number) => {
|
|
|
+ videoFroms.speedControl = false;
|
|
|
videoItem.value.currentTime(val);
|
|
|
videoFroms.currentTimeNum = val;
|
|
|
videoFroms.currentTime = timeFormat(Math.round(val || 0));
|
|
@@ -206,21 +219,87 @@ export default defineComponent({
|
|
|
</div>
|
|
|
|
|
|
<div class={styles.actions}>
|
|
|
+ <div class={styles.time}>
|
|
|
+ <div
|
|
|
+ class="plyr__time plyr__time--current"
|
|
|
+ aria-label="Current time">
|
|
|
+ {videoFroms.currentTime}
|
|
|
+ </div>
|
|
|
+ <span class={styles.line}>/</span>
|
|
|
+ <div
|
|
|
+ class="plyr__time plyr__time--duration"
|
|
|
+ aria-label="Duration">
|
|
|
+ {videoFroms.duration}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
<div class={styles.actionWrap}>
|
|
|
- <button class={styles.iconReplay} onClick={onReplay}>
|
|
|
- <img src={iconReplay} />
|
|
|
- </button>
|
|
|
{props.isDownload && (
|
|
|
- <button
|
|
|
- class={styles.iconReplay}
|
|
|
- onClick={onDownload}
|
|
|
- style={{ marginLeft: '15px' }}>
|
|
|
+ <button class={styles.iconDownload} onClick={onDownload}>
|
|
|
<img src={iconPreviewDownload} />
|
|
|
</button>
|
|
|
)}
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
+
|
|
|
+ <div
|
|
|
+ style={{
|
|
|
+ display: videoFroms.speedControl ? 'block' : 'none'
|
|
|
+ }}>
|
|
|
+ <div
|
|
|
+ class={styles.sliderPopup}
|
|
|
+ onClick={(e: Event) => {
|
|
|
+ e.stopPropagation();
|
|
|
+ }}>
|
|
|
+ <i
|
|
|
+ class={styles.iconAdd}
|
|
|
+ onClick={() => {
|
|
|
+ if (videoFroms.defaultSpeed >= 1.5) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (videoItem.value) {
|
|
|
+ videoFroms.defaultSpeed =
|
|
|
+ (videoFroms.defaultSpeed * 10 + 1) / 10;
|
|
|
+ videoItem.value.playbackRate(videoFroms.defaultSpeed);
|
|
|
+ }
|
|
|
+ }}></i>
|
|
|
+ <NSlider
|
|
|
+ value={videoFroms.defaultSpeed}
|
|
|
+ step={0.1}
|
|
|
+ max={1.5}
|
|
|
+ min={0.6}
|
|
|
+ vertical
|
|
|
+ tooltip={false}
|
|
|
+ onUpdate:value={(val: number) => {
|
|
|
+ videoFroms.defaultSpeed = val;
|
|
|
+ if (videoItem.value) {
|
|
|
+ videoItem.value.playbackRate(videoFroms.defaultSpeed);
|
|
|
+ }
|
|
|
+ }}>
|
|
|
+ {{
|
|
|
+ thumb: () => (
|
|
|
+ <div class={styles.sliderPoint}>
|
|
|
+ {videoFroms.defaultSpeed}
|
|
|
+ <span>x</span>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </NSlider>
|
|
|
+ <i
|
|
|
+ class={[styles.iconCut]}
|
|
|
+ onClick={() => {
|
|
|
+ if (videoFroms.defaultSpeed <= 0.6) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (videoItem.value) {
|
|
|
+ videoFroms.defaultSpeed =
|
|
|
+ (videoFroms.defaultSpeed * 10 - 1) / 10;
|
|
|
+ videoItem.value.playbackRate(videoFroms.defaultSpeed);
|
|
|
+ }
|
|
|
+ }}></i>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
);
|
|
|
}
|