feat: 保留腾讯播放器

This commit is contained in:
LittleBoy 2025-04-24 16:38:05 +08:00
parent 0ccbfb5f5a
commit 611a00a550
3 changed files with 20 additions and 8 deletions

View File

@ -23,6 +23,8 @@ type Props = {
poster?: string; poster?: string;
onChange?: (state: State) => void; onChange?: (state: State) => void;
onProgress?: (current:number,duration:number) => void; onProgress?: (current:number,duration:number) => void;
onPause?: () => void;
onPlay?: () => void;
muted?: boolean; muted?: boolean;
autoPlay?: boolean; autoPlay?: boolean;
} }
@ -35,6 +37,7 @@ export type PlayerInstance = {
export const Mp4Player = React.forwardRef<PlayerInstance, Props>((props, ref) => { export const Mp4Player = React.forwardRef<PlayerInstance, Props>((props, ref) => {
const [tcPlayer, setTcPlayer] = useState<VideoPlayer | null>(null) const [tcPlayer, setTcPlayer] = useState<VideoPlayer | null>(null)
const [prevUrl, setPrevUrl] = useState<string | undefined>(); const [prevUrl, setPrevUrl] = useState<string | undefined>();
const [state, _setState] = useState<State>({ const [state, _setState] = useState<State>({
playing: false, playing: false,
muted: false, muted: false,
@ -46,7 +49,6 @@ export const Mp4Player = React.forwardRef<PlayerInstance, Props>((props, ref) =>
}) })
const setState = (data: StateUpdate) => { const setState = (data: StateUpdate) => {
console.log('playstate change', data)
_setState(prev => { _setState(prev => {
const _state = typeof (data) === 'function' ? {...prev, ...data(prev)} : {...prev, ...data} const _state = typeof (data) === 'function' ? {...prev, ...data(prev)} : {...prev, ...data}
props.onChange?.(_state) props.onChange?.(_state)
@ -73,9 +75,11 @@ export const Mp4Player = React.forwardRef<PlayerInstance, Props>((props, ref) =>
player.on('pause', () => { player.on('pause', () => {
setState({playing: false, end: false, error: false}) setState({playing: false, end: false, error: false})
props.onPause?.()
}) })
player.on('playing', () => { player.on('playing', () => {
setState({playing: true, end: false, error: false}) setState({playing: true, end: false, error: false})
props.onPlay?.()
}) })
player.on('ended', () => { player.on('ended', () => {
setState({end: true, playing: false, error: false}) setState({end: true, playing: false, error: false})

View File

@ -11,13 +11,13 @@ import {deleteByIds, getList, modifyOrder, playState, restoreByIds} from "@/serv
import {showErrorToast, showToast} from "@/components/message.ts"; import {showErrorToast, showToast} from "@/components/message.ts";
import ButtonBatch from "@/components/button-batch.tsx"; import ButtonBatch from "@/components/button-batch.tsx";
import {formatDuration} from "@/util/strings.ts"; import {formatDuration} from "@/util/strings.ts";
import {Player, PlayerInstance} from "@/components/video/player.tsx"; import {Mp4Player as Player, PlayerInstance} from "@/components/video/Mp4Player.tsx";
import {IconDelete, IconLocked, IconRollbackCircle} from "@/components/icons"; import {IconDelete, IconLocked, IconRollbackCircle} from "@/components/icons";
import InfiniteScroller, {InfiniteScrollerRef} from "@/components/scoller/infinite-scroller.tsx"; import InfiniteScroller, {InfiniteScrollerRef} from "@/components/scoller/infinite-scroller.tsx";
import ButtonToTop from "@/components/scoller/button-to-top.tsx"; import ButtonToTop from "@/components/scoller/button-to-top.tsx";
import {ModalWarningIcon, ModalWarningTitle} from "@/components/icons/ModalWarning.tsx";
import styles from "./style.module.scss" import styles from "./style.module.scss"
import {ModalWarningIcon, ModalWarningTitle} from "@/components/icons/ModalWarning.tsx";
const cache: { flvPlayer?: FlvJs.Player, timerPlayNext?: any, timerLoadState?: any, prevUrl?: string } = {} const cache: { flvPlayer?: FlvJs.Player, timerPlayNext?: any, timerLoadState?: any, prevUrl?: string } = {}
@ -88,6 +88,7 @@ export default function LiveIndex() {
if (playedTime < 0 || playedTime > duration) { // 已播放时间大于总时长了 if (playedTime < 0 || playedTime > duration) { // 已播放时间大于总时长了
//initPlayingState() // 重新获取播放状态 //initPlayingState() // 重新获取播放状态
console.log('已播放时间大于总时长') console.log('已播放时间大于总时长')
cache.timerLoadState = setTimeout(initPlayingState, 5000)
return; return;
} }
player.current?.play(video.video_oss_url, playedTime) player.current?.play(video.video_oss_url, playedTime)

View File

@ -1,8 +1,10 @@
import {Checkbox, Empty, Space} from "antd"; import {Checkbox, Empty, Space} from "antd";
import React, {useEffect, useMemo, useRef, useState} from "react"; import React, {useEffect, useRef, useState} from "react";
import {DndContext} from "@dnd-kit/core"; import {DndContext} from "@dnd-kit/core";
import {arrayMove, SortableContext} from "@dnd-kit/sortable"; import {arrayMove, SortableContext} from "@dnd-kit/sortable";
import {useSetState} from "ahooks"; import {useSetState} from "ahooks";
import {useLocation, useNavigate} from "react-router-dom";
import {useTranslation} from "react-i18next";
import {VideoListItem} from "@/components/video/video-list-item.tsx"; import {VideoListItem} from "@/components/video/video-list-item.tsx";
import ArticleEditModal from "@/components/article/edit-modal.tsx"; import ArticleEditModal from "@/components/article/edit-modal.tsx";
@ -10,13 +12,11 @@ import {deleteFromList, getList, modifyOrder, regenerateById, VideoStatus} from
import {formatDuration} from "@/util/strings.ts"; import {formatDuration} from "@/util/strings.ts";
import ButtonBatch from "@/components/button-batch.tsx"; import ButtonBatch from "@/components/button-batch.tsx";
import {showErrorToast, showToast} from "@/components/message.ts"; import {showErrorToast, showToast} from "@/components/message.ts";
import {Player, PlayerInstance} from "@/components/video/player.tsx"; import {Mp4Player as Player, PlayerInstance} from "@/components/video/Mp4Player.tsx";
import ButtonPush2Room from "@/pages/video/components/button-push2room.tsx"; import ButtonPush2Room from "@/pages/video/components/button-push2room.tsx";
import ButtonToTop from "@/components/scoller/button-to-top.tsx"; import ButtonToTop from "@/components/scoller/button-to-top.tsx";
import InfiniteScroller, {InfiniteScrollerRef} from "@/components/scoller/infinite-scroller.tsx"; import InfiniteScroller, {InfiniteScrollerRef} from "@/components/scoller/infinite-scroller.tsx";
import {IconDelete} from "@/components/icons"; import {IconDelete} from "@/components/icons";
import {useLocation, useNavigate} from "react-router-dom";
import {useTranslation} from "react-i18next";
export default function VideoIndex() { export default function VideoIndex() {
const {t} = useTranslation() const {t} = useTranslation()
@ -29,6 +29,7 @@ export default function VideoIndex() {
const [state, setState] = useSetState({ const [state, setState] = useSetState({
checkedAll: false, checkedAll: false,
playingId: -1, playingId: -1,
videoPlaying: false,
showToTop: false, showToTop: false,
showStatePos: false, showStatePos: false,
playState: { playState: {
@ -170,6 +171,12 @@ export default function VideoIndex() {
onChange={(state) => { onChange={(state) => {
if (state.end || state.error) setState({playingId: -1}) if (state.end || state.error) setState({playingId: -1})
}} }}
onPause={() => {
setState({videoPlaying:false})
}}
onPlay={() => {
setState({videoPlaying:true})
}}
onProgress={(current, duration) => { onProgress={(current, duration) => {
setState({ setState({
playState: { playState: {
@ -238,7 +245,7 @@ export default function VideoIndex() {
key={index} key={index}
type={'create'} type={'create'}
active={checkedIdArray.includes(v.id)} active={checkedIdArray.includes(v.id)}
playing={state.playingId == v.id} playing={state.playingId == v.id && state.videoPlaying}
checked={checkedIdArray.includes(v.id)} checked={checkedIdArray.includes(v.id)}
className={`list-item-${index} mt-3 mb-2 list-item-state-${v.status} `} className={`list-item-${index} mt-3 mb-2 list-item-state-${v.status} `}
onCheckedChange={(checked) => { onCheckedChange={(checked) => {