index.tsx 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { videoUrlMessage } from "@/utils/compress"
  2. import { ScissorOutlined } from "@ant-design/icons"
  3. import { Button, Popover, Image } from "antd"
  4. import React, { useState } from "react"
  5. import style from './index.less'
  6. import Lazyimg from "react-lazyimg-component"
  7. interface Props {
  8. url: string,
  9. onChange?: (url: string) => void
  10. }
  11. /**
  12. * 获取oo视频帧序列
  13. * @returns
  14. */
  15. const VideoFrameSelect: React.FC<Props> = ({ url, onChange }) => {
  16. /************************************/
  17. const [urlList, setUrlList] = useState<string[]>([])
  18. const [urlNum, seturlNum] = useState<number>(30)
  19. const [open, setOpen] = useState(false);
  20. const [selectUrl, setSelectUrl] = useState<string>()
  21. const [visible, setVisible] = useState<boolean>(false)
  22. const [lookUrl, setLookUrl] = useState<string>()
  23. /************************************/
  24. const handleOk = () => {
  25. if (selectUrl) {
  26. console.log(selectUrl)
  27. onChange?.(selectUrl)
  28. setTimeout(() => setOpen(false), 100)
  29. }
  30. };
  31. const onVisibleChange = async (newOpen: boolean) => {
  32. if (newOpen && url && url.includes('.mp4')) {
  33. let data = await videoUrlMessage(url)
  34. let duration = data.videoLength
  35. let gap = duration / urlNum
  36. setUrlList(Array(urlNum).fill('').map((item, index) => url + `?x-oss-process=video/snapshot,t_${(index * gap * 1000).toFixed(0)}`))
  37. }
  38. setOpen(newOpen);
  39. };
  40. const selectHandle = (url: string) => {
  41. setSelectUrl(url)
  42. }
  43. return <Popover
  44. content={<div className={style.popover}>
  45. {open && <>
  46. <div className={style.content}>
  47. {urlList.map((url, index) => <div className={`${style.imgBox} ${selectUrl === url ? style.select : ''}`} key={index}>
  48. <Lazyimg onClick={() => { selectHandle(url) }} className={`lazy`} src={url} />
  49. <span className={style.look} onClick={() => { setLookUrl(url); setVisible(true) }}>查看</span>
  50. </div>)}
  51. </div>
  52. <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"
  53. preview={{
  54. visible,
  55. src: lookUrl,
  56. onVisibleChange: (value) => {
  57. setVisible(value);
  58. },
  59. }}
  60. />
  61. <Button type="primary" style={{ backgroundColor: '#00b96b', borderColor: '#00b96b' }} onClick={handleOk} disabled={!selectUrl} size="small">确定</Button>
  62. </>}
  63. </div>}
  64. destroyTooltipOnHide={true}
  65. trigger="click"
  66. open={open}
  67. onOpenChange={onVisibleChange}
  68. >
  69. <Button type="link" icon={<ScissorOutlined />}>视频截帧更换封面</Button>
  70. </Popover>
  71. }
  72. export default React.memo(VideoFrameSelect)