【发布时间】:2022-01-15 16:37:35
【问题描述】:
我想从上传到我网站的多张图片创建一个视频文件。
到目前为止,我所做的只是拍摄这些图像,在画布上一一绘制,然后使用MediaRecorder API 记录它们。但是,有很多空闲时间。
相反,我想使用VideoEncoder API。
我创建了一个将每个块保存为缓冲区的编码器:
const chunks = [];
let encoder = new VideoEncoder({
output: (chunk) => {
const buffer = new ArrayBuffer(chunk.byteLength)
chunk.copyTo(buffer);
chunks.push(buffer);
},
error: (e) => console.error(e.message)
});
并使用我的设置进行配置:
encoder.configure({
codec: 'vp8',
width: 256,
height: 256,
bitrate: 2_000_000,
framerate: 25
});
然后,我将每个图像编码为一个帧:
const frame = new VideoFrame(await createImageBitmap(image));
encoder.encode(frame, {keyFrame: true});
frame.close();
最后,我尝试从中创建一个视频:
await encoder.flush();
const blob = new Blob(chunks, {type: 'video/webm; codecs=vp8'});
const url = URL.createObjectURL(blob);
但是,该 URL blob 无法播放。如果我尝试下载它,VLC 不会显示它。如果我将其设置为 video 元素的来源,我会得到:
DOMException: 该元素没有支持的来源。
如何将多个帧编码为可播放的视频?
我如何知道支持哪些编解码器/blob 类型?
最小复制
下面的代码笔是上面的代码,连接并加入一个函数。 https://codepen.io/AmitMY/pen/OJxgPoG?editors=0010
【问题讨论】:
-
您有完整的可测试代码来重新创建您的问题吗?或者可能提供输出视频(下载的 blob)的链接,以便我们检查编码有什么问题(例如: 可能缺少 webM 标头)。
-
@VC.One 我已经添加了一个最小的复制代码笔。
标签: video videoencoder webcodecs