【问题标题】:Play video on Canvas in React Konva在 React Konva 中的 Canvas 上播放视频
【发布时间】:2020-05-01 15:05:38
【问题描述】:

基于Konva 关于如何将视频渲染到画布的文档,我想通过直接从Konva.Image 实例访问视频参考来播放视频。下面是一个人为的示例,用于模拟我从​​组件外部动态播放视频的目标。即使imageRef.current.image() 返回视频元素引用,以下内容也不会按预期播放视频。关于如何访问视频参考的任何建议?

import React, { useEffect, useContext, useState } from 'react'
import { Image } from "react-konva";
import Konva from 'konva'

 export const MainVideo = ({ shape, dispatch  }) =>  {
  const imageRef = React.useRef(null);
  const video = document.createElement('video');
  video.setAttribute('src',shape.url);


  useEffect(() => {
    if(imageRef) {

  imageRef.current.image().play();
  const layer = imageRef.current.getLayer();

  const anim = new Konva.Animation(() => {
  }, layer);

        anim.start()

    }
  }, [imageRef])

    return (
     <Image 
     ref={imageRef}
     opacity={shape.o}
     id={shape.id} 
     image={video} 
     x={shape.x} 
     y={shape.y} 
     zIndex={0}
     height={360}
     width={640} />
    )
}

【问题讨论】:

    标签: javascript konvajs react-konva


    【解决方案1】:

    你可以这样做:

    const Video = ({ src }) => {
      const imageRef = React.useRef(null);
      const [size, setSize] = React.useState({ width: 50, height: 50 });
    
      // we need to use "useMemo" here, so we don't create new video elment on any render
      const videoElement = React.useMemo(() => {
        const element = document.createElement("video");
        element.src = src;
        return element;
      }, [src]);
    
      // when video is loaded, we should read it size
      React.useEffect(() => {
        const onload = function() {
          setSize({
            width: videoElement.videoWidth,
            height: videoElement.videoHeight
          });
        };
        videoElement.addEventListener("loadedmetadata", onload);
        return () => {
          videoElement.removeEventListener("loadedmetadata", onload);
        };
      }, [videoElement]);
    
      // use Konva.Animation to redraw a layer
      React.useEffect(() => {
        videoElement.play();
        const layer = imageRef.current.getLayer();
    
        const anim = new Konva.Animation(() => {}, layer);
        anim.start();
    
        return () => anim.stop();
      }, [videoElement]);
    
      return (
        <Image
          ref={imageRef}
          image={videoElement}
          x={20}
          y={20}
          stroke="red"
          width={size.width}
          height={size.height}
          draggable
        />
      );
    };
    

    演示:https://codesandbox.io/s/react-konva-video-on-canvas-oygvf

    【讨论】:

      猜你喜欢
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 2014-05-01
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多