| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- import { videoUrlMessage } from "@/utils/compress"
- import { ScissorOutlined } from "@ant-design/icons"
- import { Button, Popover, Image } from "antd"
- import React, { useState } from "react"
- import style from './index.less'
- import Lazyimg from "react-lazyimg-component"
- interface Props {
- url: string,
- onChange?: (url: string) => void
- }
- /**
- * 获取oo视频帧序列
- * @returns
- */
- const VideoFrameSelect: React.FC<Props> = ({ url, onChange }) => {
- /************************************/
- const [urlList, setUrlList] = useState<string[]>([])
- const [urlNum, seturlNum] = useState<number>(30)
- const [open, setOpen] = useState(false);
- const [selectUrl, setSelectUrl] = useState<string>()
- const [visible, setVisible] = useState<boolean>(false)
- const [lookUrl, setLookUrl] = useState<string>()
- /************************************/
- const handleOk = () => {
- if (selectUrl) {
- console.log(selectUrl)
- onChange?.(selectUrl)
- setTimeout(() => setOpen(false), 100)
- }
- };
- const onVisibleChange = async (newOpen: boolean) => {
- if (newOpen && url && url.includes('.mp4')) {
- let data = await videoUrlMessage(url)
- let duration = data.videoLength
- let gap = duration / urlNum
- setUrlList(Array(urlNum).fill('').map((item, index) => url + `?x-oss-process=video/snapshot,t_${(index * gap * 1000).toFixed(0)}`))
- }
- setOpen(newOpen);
- };
- const selectHandle = (url: string) => {
- setSelectUrl(url)
- }
- return <Popover
- content={<div className={style.popover}>
- {open && <>
- <div className={style.content}>
- {urlList.map((url, index) => <div className={`${style.imgBox} ${selectUrl === url ? style.select : ''}`} key={index}>
- <Lazyimg onClick={() => { selectHandle(url) }} className={`lazy`} src={url} />
- <span className={style.look} onClick={() => { setLookUrl(url); setVisible(true) }}>查看</span>
- </div>)}
- </div>
- <Image width={200} style={{ display: 'none' }} src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png?x-oss-process=image/blur,r_50,s_50/quality,q_1/resize,m_mfit,h_200,w_200"
- preview={{
- visible,
- src: lookUrl,
- onVisibleChange: (value) => {
- setVisible(value);
- },
- }}
- />
- <Button type="primary" style={{ backgroundColor: '#00b96b', borderColor: '#00b96b' }} onClick={handleOk} disabled={!selectUrl} size="small">确定</Button>
- </>}
- </div>}
- destroyTooltipOnHide={true}
- trigger="click"
- open={open}
- onOpenChange={onVisibleChange}
- >
- <Button type="link" icon={<ScissorOutlined />}>视频截帧更换封面</Button>
- </Popover>
- }
- export default React.memo(VideoFrameSelect)
|