Websocket MediaSource缓冲区只能在一个客户端上工作

Websocket MediaSource缓冲区只能在一个客户端上工作,websocket,media-source,web-mediarecorder,Websocket,Media Source,Web Mediarecorder,因此,我试图构建一个livestreaming应用程序,但遇到了一个奇怪的问题 因此,我使用getUserMedia从用户那里捕获视频,然后用户被标记为广播者。然后我使用MediaRecorder从MediaStream获取实际的视频数据,并通过websocket发送 websocket只是将视频数据广播到所有连接的客户端,但出于某种原因,它只能在广播公司的播放机上正确播放,但当我尝试播放来自不同客户端的相同确切流时,它只会给我以下错误: Uncaught DomeException:未能对“S

因此,我试图构建一个livestreaming应用程序,但遇到了一个奇怪的问题

因此,我使用
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,但找不到从服务器中继视频数据的简单解决方案。您是否建议我阅读任何文档以了解如何做到这一点?