【发布时间】:2024-01-10 04:19:01
【问题描述】:
我能够生成使用 MediaRecorder API 记录的数据块。使用 MediaSource API 存储和播放它们。 如果我以正确的顺序将所有块附加到 sourceBuffer,这可以正常工作。
async function recordScreen() {
recordedChunks = []
stream = await navigator.mediaDevices.getDisplayMedia(getDisplayMediaOptions)
mediaRecorder = new MediaRecorder(stream)
mediaRecorder.ondataavailable = event => {
if (event.data.size > 0) {
recordedChunks.push(event.data)
}
}
const interval = setInterval(() => {
if (isRecording) {
mediaRecorder.requestData()
} else {
clearInterval(interval)
}
}, 1000)
mediaRecorder.start()
isRecording = true
}
function replay(chunks) {
const mediaSource = new MediaSource()
video.src = URL.createObjectURL(mediaSource)
mediaSource.addEventListener('sourceopen', () => {
const sourceBuffer = mediaSource.addSourceBuffer()
const appendChunk = chunk => chunk.arrayBuffer().then(data => sourceBuffer.appendBuffer(data))
sourceBuffer.addEventListener('updateend', () => {
if (chunks[i]) {
appendChunk(chunks[i++])
} else {
mediaSource.endOfStream()
}
})
appendChunk(chunks[i++])
})
}
但是,当我尝试不附加所有块时,问题就开始了。
- 如何跳过录制视频的开头部分?
- 如果缺少一个块,在新的块到达之前,视频会不会有一秒钟是空白的?
我知道录制的媒体不仅包含原始视频数据,还包含某种标题信息。但在这一点上,我没有计划我在做什么。 也许你们可以帮助我:
- 如何检查这些标头信息(非视频数据)?
- 我可以编辑或添加它们吗?有没有关于如何做到这一点的好资源?
我的目标是抓取任何记录的块,然后播放其中的视频数据。如果不知何故缺少一个块,它应该继续播放以下块。
背景
我正在尝试开发一种可与 webRTC 一起使用 p2p 的实时流媒体解决方案。我知道我可以将流直接放入 RtcConnection 中。但据我所知,这意味着每个对等点只能与另一个对等点共享一个完整的流。如果每个对等方在为实时流做出贡献时会更加灵活,例如共享 1.5 个流。所以我认为通过 RtcDataChannels 共享这些数据是有意义的,收集它们并通过 MediaSource API 播放它。 如果你们对如何做到这一点有任何其他想法,我将不胜感激。
【问题讨论】:
-
“例如共享 1.5 个流”是什么意思?如果要共享多个流,为什么不能启动多个 RTC 连接?关于 X-Y 问题的 Y,你可能很幸运,只需要第一个块,但我不会打赌它会永远在任何地方工作。
-
我需要为每个连接共享 1 个完整的流。但是,如果一个节点没有能力处理另一个完整的节点怎么办?所以我想尽可能地拆分它
-
但是“拆分”流是什么意思?像只有一半的视频和音频中只有高于 800Hz 的频率?
-
我真的不知道。这是我的问题的一部分。我的想法是将流分成数据块,我可以传输给对等方,然后使用 MediaSource API 播放它们。
-
让我们退后一步,您面临并试图解决的真正问题是什么?
标签: javascript webrtc media-source web-mediarecorder