我正在尝试构建一个 Electron React App 来捕获屏幕的短视频但无法存储视频(作为更大的“有效负载”对象的一部分:
{video_buffer: xxx, time_stamp: 3456345 ...}
视频是在渲染器进程中通过API 创建的MediaStream
,MediaRecorder
然后转换为 Blob。这是一些示例代码:-
let mediaRecorder = new MediaRecorder(videoStream);
mediaRecorder.start()
let chunks = []
mediaRecorder.ondataavailable = (event) => {chunks.push(event.data)}
mediaRecorder.onstop = async (event) => {
let blob = new Blob(chunks, {type: 'video/mp4'})
chunks = []
const buffer = await blob.arrayBuffer()
当我转换为 URL 并将其设置为 Video 元素 src 时,缓冲区有效
let videoURL = URL.createObjectURL(blob)
视频很短,最大占用约 2.5MB。
我只能通过IPC
(而不是 Blob)发送缓冲区(或 URL)。
在主要过程中,我使用 Mongoose 和模式:
new payloadSchema = {video_buffer: {type: Buffer}}
但这不起作用,大概是因为 buffer 是 anArrayBuffer
而不是 a Data View
or TypedArray
。
所以我尝试将它转换为一个Uint8Array TypedArray
对象:
const new_buffer = new Uint8Array(buffer)
但我在保存时收到此错误:
video_buffer: CastError: Cast to Buffer failed for value "Uint8Array(2041510) [
[electron] 26, 69, 223, 163, 159, 66, 134, 129, 1, 66, 247, 129,
[electron] 1, 66, 242, 129, 4, 66, 243, 129, 8, 66, 130, 132,
[electron] 119, 101, 98, 109, 66, 135, 129, 4, 66, 133, 129, 2,
[electron] 24, 83, 128, 103, 1, 255, 255, 255, 255, 255, 255, 255,
[electron] 21, 73, 169, 102, 153, 42, 215, 177, 131, 15, 66, 64,
[electron] 77, 128, 134, 67, 104, 114, 111, 109, 101, 87, 65, 134,
[electron] 67, 104, 114, 111, 109, 101, 22, 84, 174, 107, 171, 174,
[electron] 169, 215, 129, 1, 115, 197, 135, 155, 112, 30, 237, 62,
[electron] 162, 245, 131, 129,
[electron] ... 2041410 more items
[electron] ]" at path "video_buffer"
然后我尝试将其转换Uint8Array
为十六进制编码字符串,然后将其存储为缓冲区。
在终端中查询 MongoDB 时,它存储了字符串:
const buff_to_hex_string = new_buffer.toString('hex')
然后像以前一样通过 Mongoose 保存它:(Schema {type: Buffer})
这似乎适用于 MongoDB 的以下输出:
保存的 Payload Schema 的输出是:
video_buffer: Binary {
[electron] _bsontype: 'Binary',
[electron] sub_type: 0,
[electron] position: 9514868,
[electron] buffer: <Buffer 32 36 2c 36 39 2c 32 32 33 2c 31 36 33 2c 31 35 39 2c 36 36 2c 31 33 34 2c 31 32 39 2c 31 2c 36 36 2c 32 34 37 2c 31 32 39 2c 31 2c 36 36 2c 32 34 32 ... 9514818 more bytes>
问题:在检索存储的缓冲区对象时,将其转换回 ArrayBuffer 以便我可以在视频元素中播放它的最简单方法是什么?
我需要向后转换 --> 十六进制字符串 --> Uint8Array --> ArrayBuffer ---> Blob ---> URL 吗?
我已经尝试了很多提供的方法,但都没有奏效。
任何帮助将非常感激。
谢谢。