I am using Remotion Video Player.
I am using video player in multiple components, over there when I am passing remote video link its getting rendered, but in this component for the same Video Player when I am passing remote URL its giving me Error : SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data.
Here is the Screenshot1 attached of the error :
Below is the code :
import React, { useCallback, useEffect, useRef } from "react";
import { AbsoluteFill, useVideoConfig, Video, staticFile } from "remotion";
import Cookies from "js-cookie";
let videoUrl='https://examplevideo.com/VHS+Heavy+White.mov'
const videoAsset = videoUrl
export const Greenscreen: React.FC<{
opacity: number;
}> = ({ opacity }) => {
const video = useRef<HTMLVideoElement>(null);
const canvas = useRef<HTMLCanvasElement>(null);
const { width, height } = useVideoConfig();
// Process a frame
const onVideoFrame = useCallback(
(opacity: number) => {
if (!canvas.current || !video.current) {
return;
}
const context = canvas.current.getContext("2d");
if (!context) {
return;
}
context.drawImage(video.current, 0, 0, width, height);
const imageFrame = context.getImageData(0, 0, width, height);
const { length } = imageFrame.data;
// If the pixel is very green, reduce the alpha channel
for (let i = 0; i < length; i += 4) {
const red = imageFrame.data[i + 0];
const green = imageFrame.data[i + 1];
const blue = imageFrame.data[i + 2];
if (green > 200 && red < 200 && blue < 200) {
imageFrame.data[i + 3] = opacity * 255;
}
}
context.putImageData(imageFrame, 0, 0);
},
[height, width]
);
useEffect(() => {
const { current } = video;
if (!current || !current.requestVideoFrameCallback) {
return;
}
let handle = 0;
const callback = () => {
onVideoFrame(opacity);
handle = current.requestVideoFrameCallback(callback);
};
callback();
return () => {
current.cancelVideoFrameCallback(handle);
};
}, [onVideoFrame, opacity]);
return (
<AbsoluteFill>
<AbsoluteFill>
<Video
ref={video}
style={{ opacity: 0 }}
startFrom={0}
src={videoAsset}
/>
</AbsoluteFill>
<AbsoluteFill>
<canvas ref={canvas} width={width} height={height} />
</AbsoluteFill>
</AbsoluteFill>
);
};
Expecting the video player to accept remote url and render video. Its rendering video in another component were i am using the same video player with remote video link.