add bufferToVideo and fetchVideo
parent
7b8b30bfc9
commit
22d4199fdd
|
@ -0,0 +1,22 @@
|
||||||
|
import { env } from '../env/index';
|
||||||
|
|
||||||
|
export function bufferToVideo(buf: Blob): Promise<HTMLVideoElement> {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
if (!(buf instanceof Blob)) reject(new Error('bufferToVideo - expected buf to be of type: Blob'));
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onload = () => {
|
||||||
|
if (typeof reader.result !== 'string') reject(new Error('bufferToVideo - expected reader.result to be a string, in onload'));
|
||||||
|
const video = env.getEnv().createVideoElement();
|
||||||
|
video.onloadstart = () => {
|
||||||
|
setTimeout(() => resolve(video), 100);
|
||||||
|
};
|
||||||
|
video.onerror = reject;
|
||||||
|
// video.type = 'video/mp4';
|
||||||
|
video.autoplay = true;
|
||||||
|
video.muted = true;
|
||||||
|
video.src = reader.result as string;
|
||||||
|
};
|
||||||
|
reader.onerror = reject;
|
||||||
|
reader.readAsDataURL(buf);
|
||||||
|
});
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
import { bufferToVideo } from './bufferToVideo';
|
||||||
|
import { fetchOrThrow } from './fetchOrThrow';
|
||||||
|
|
||||||
|
export async function fetchVideo(uri: string): Promise<HTMLVideoElement> {
|
||||||
|
const res = await fetchOrThrow(uri);
|
||||||
|
const blob = await (res).blob();
|
||||||
|
|
||||||
|
if (!blob.type.startsWith('video/')) {
|
||||||
|
throw new Error(`fetchVideo - expected blob type to be of type video/*, instead have: ${blob.type}, for url: ${res.url}`);
|
||||||
|
}
|
||||||
|
return bufferToVideo(blob);
|
||||||
|
}
|
|
@ -7,6 +7,7 @@ export * from './fetchImage';
|
||||||
export * from './fetchJson';
|
export * from './fetchJson';
|
||||||
export * from './fetchNetWeights';
|
export * from './fetchNetWeights';
|
||||||
export * from './fetchOrThrow';
|
export * from './fetchOrThrow';
|
||||||
|
export * from './fetchVideo';
|
||||||
export * from './getContext2dOrThrow';
|
export * from './getContext2dOrThrow';
|
||||||
export * from './getMediaDimensions';
|
export * from './getMediaDimensions';
|
||||||
export * from './imageTensorToCanvas';
|
export * from './imageTensorToCanvas';
|
||||||
|
|
|
@ -16,6 +16,7 @@ export function createBrowserEnv(): Environment {
|
||||||
Video: HTMLVideoElement,
|
Video: HTMLVideoElement,
|
||||||
createCanvasElement: () => document.createElement('canvas'),
|
createCanvasElement: () => document.createElement('canvas'),
|
||||||
createImageElement: () => document.createElement('img'),
|
createImageElement: () => document.createElement('img'),
|
||||||
|
createVideoElement: () => document.createElement('video'),
|
||||||
fetch,
|
fetch,
|
||||||
readFile,
|
readFile,
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,6 +6,8 @@ export function createNodejsEnv(): Environment {
|
||||||
// eslint-disable-next-line dot-notation
|
// eslint-disable-next-line dot-notation
|
||||||
const Canvas = global['Canvas'] || global.HTMLCanvasElement;
|
const Canvas = global['Canvas'] || global.HTMLCanvasElement;
|
||||||
const Image = global.Image || global.HTMLImageElement;
|
const Image = global.Image || global.HTMLImageElement;
|
||||||
|
// eslint-disable-next-line dot-notation
|
||||||
|
const Video = global['Video'] || global.HTMLVideoElement;
|
||||||
|
|
||||||
const createCanvasElement = () => {
|
const createCanvasElement = () => {
|
||||||
if (Canvas) return new Canvas();
|
if (Canvas) return new Canvas();
|
||||||
|
@ -17,6 +19,11 @@ export function createNodejsEnv(): Environment {
|
||||||
throw new Error('createImageElement - missing Image implementation for nodejs environment');
|
throw new Error('createImageElement - missing Image implementation for nodejs environment');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const createVideoElement = () => {
|
||||||
|
if (Video) return new Video();
|
||||||
|
throw new Error('createVideoElement - missing Video implementation for nodejs environment');
|
||||||
|
};
|
||||||
|
|
||||||
const fetch = global.fetch;
|
const fetch = global.fetch;
|
||||||
// if (!fetch) throw new Error('fetch - missing fetch implementation for nodejs environment');
|
// if (!fetch) throw new Error('fetch - missing fetch implementation for nodejs environment');
|
||||||
|
|
||||||
|
@ -30,6 +37,7 @@ export function createNodejsEnv(): Environment {
|
||||||
Video: global.HTMLVideoElement || class {},
|
Video: global.HTMLVideoElement || class {},
|
||||||
createCanvasElement,
|
createCanvasElement,
|
||||||
createImageElement,
|
createImageElement,
|
||||||
|
createVideoElement,
|
||||||
fetch,
|
fetch,
|
||||||
...fileSystem,
|
...fileSystem,
|
||||||
};
|
};
|
||||||
|
|
|
@ -11,6 +11,7 @@ export type Environment = FileSystem & {
|
||||||
Video: typeof HTMLVideoElement
|
Video: typeof HTMLVideoElement
|
||||||
createCanvasElement: () => HTMLCanvasElement
|
createCanvasElement: () => HTMLCanvasElement
|
||||||
createImageElement: () => HTMLImageElement
|
createImageElement: () => HTMLImageElement
|
||||||
|
createVideoElement: () => HTMLVideoElement
|
||||||
// eslint-disable-next-line no-undef, no-unused-vars
|
// eslint-disable-next-line no-undef, no-unused-vars
|
||||||
fetch: (url: string, init?: RequestInit) => Promise<Response>
|
fetch: (url: string, init?: RequestInit) => Promise<Response>
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue