Websocket MediaSource缓冲区只能在一个客户端上工作
因此,我试图构建一个livestreaming应用程序,但遇到了一个奇怪的问题 因此,我使用Websocket MediaSource缓冲区只能在一个客户端上工作,websocket,media-source,web-mediarecorder,Websocket,Media Source,Web Mediarecorder,因此,我试图构建一个livestreaming应用程序,但遇到了一个奇怪的问题 因此,我使用getUserMedia从用户那里捕获视频,然后用户被标记为广播者。然后我使用MediaRecorder从MediaStream获取实际的视频数据,并通过websocket发送 websocket只是将视频数据广播到所有连接的客户端,但出于某种原因,它只能在广播公司的播放机上正确播放,但当我尝试播放来自不同客户端的相同确切流时,它只会给我以下错误: Uncaught DomeException:未能对“S
getUserMedia
从用户那里捕获视频,然后用户被标记为广播者。然后我使用MediaRecorder
从MediaStream
获取实际的视频数据,并通过websocket发送
websocket只是将视频数据广播到所有连接的客户端,但出于某种原因,它只能在广播公司的播放机上正确播放,但当我尝试播放来自不同客户端的相同确切流时,它只会给我以下错误:
Uncaught DomeException:未能对“SourceBuffer”执行“appendBuffer”:此SourceBuffer已从父媒体源中删除。
当我往里看的时候chrome://media-internals 我看到这个错误:
00:00:00 94错误意外元素ID 0x8c
00:00:00 94错误追加:流解析失败。数据大小=33926追加\u窗口\u开始=0追加\u窗口\u结束=inf
00:00:00 94管道\u错误块\u解复用器\u错误\u追加\u失败
当然,两个客户端上的脚本和所有内容都是相同的。唯一不同的是,我认为可能是罪魁祸首的是,广播商的流没有立即开始,因为广播商首先需要将视频数据发送到websocket服务器,以便服务器将任何内容转发回来。然而,非广播公司的客户在“中间”跳流
唯一的另一个区别是广播是通过同一个套接字下载和上传视频数据,但我不知道这将如何影响这个问题
编辑:在运行一个测试,其中两个客户端都连接到websocket而没有视频流,然后运行流之后,两个客户端都工作了,这意味着问题确实源于其他客户端中途跳入流,如何解决此问题?
然而,我对这一切都是新手,所以我不确定这是否是一个好的理由。以下脚本供参考:
var socket = new WebSocket('websocket');
socket.binaryType = 'arraybuffer';
var broadcastMs = new MediaSource();
var video = document.querySelector("#broadcast");
video.src = window.URL.createObjectURL(broadcastMs);
var msReady = false;
var sourceBuffer = false;
var queue = [];
broadcastMs.addEventListener('sourceopen', function(e)
{
sourceBuffer = broadcastMs.addSourceBuffer('video/webm; codecs="opus,vp8"');
sourceBuffer.addEventListener('update', function()
{
if ( queue.length > 0 && !sourceBuffer.updating )
sourceBuffer.appendBuffer(queue.shift());
});
msReady = true;
});
socket.onmessage = function(ev)
{
setTimeout(function()
{
if ( msReady )
{
if ( sourceBuffer.updating )
queue.push(ev.data);
else
sourceBuffer.appendBuffer(ev.data);
}
}, 50);
};
您不能只是将针插入WebM流中。您必须首先发送几个部分来初始化流 找到一个EBML查看器的副本。(EBML是Matroska基于的标准二进制格式。WebM是Matroska的子集。)打开WebM文件。您将看到一个Segment元素,其中包含一组配置流的数据。(曲目、编解码器等)在第一个集群开始之前,所有这些数据都必须首先发送到MediaSource。之后,可以从包含关键帧的任何线段开始
我应该指出,你所做的是一个解决了的问题。查看WebRTC以获得更有效的方法。你的控制力变小了。。。但是很多东西都是免费的。所以我尝试发送初始帧,最初似乎可以解决问题,但当服务器发送帧超过这两个初始帧时,它会冻结,这意味着必须有某种时间线才能使视频正常工作。你解决了这个问题吗?没有,我最终放弃了这个项目。然而,现在有许多第三方应用程序可用,您可以使用它们来简化此过程!查看AWS Livestreaming服务堆栈,它会让您走上正确的道路。谢谢!如何在livestreamed环境中应用此功能?我使用一个用户的硬件直接从媒体流传输到websocket;配置段是否总是相同的,或者是否存在某种模式?我尝试研究WebRTC,但找不到从服务器中继视频数据的简单解决方案。您是否建议我阅读任何文档以了解如何做到这一点?