JavaScript XMLHttpRequest.responseType как «arraybuffer» — как получить текущий фрагмент arraybuffer

#javascript

#javascript

Вопрос:

Я пытаюсь передать поток a со стороны клиента на сторону сервера, чтобы позже передать видео обратно другому клиенту.

Дело в том,:

Как я могу получить фрагменты видео из клиентского JavaScript (которые могут быть отправлены на сервер)?

используя этот код, например:

 var x = new XMLHttpRequest();
        var url = location.href;
        x.onreadystatechange = function(){
            if(x.readyState == 200) {
                console.log("done");
            } else {
                console.log("chunk",x.response); //this is null until readyState is 200 anyway
            }

        }
        x.onprogress = e => {
            console.log("EE",e.target.response); //also null if resposneType is arraybuffer
        };
        x.responseType="arraybuffer";
        x.open("GET","http://localhost:88/videoplayback.mp4",true);
        x.send("");
  

Когда я пытаюсь напечатать ответ до его завершения загрузки (чтобы получить его по частям), то он просто равен нулю; arraybuffer возвращается как respnse только после завершения загрузки.

Если я удаляю responsetype и просто оставляю его в виде обычного текста, то действительно некоторые символы unicode выводятся на экран для каждого readystatechange даже до его завершения, только arraybuffer этого не делает.

Итак: это лучший способ потоковой передачи видео с клиента на сервер, и если да, то как я могу это сделать? а если нет, то какой способ лучше?

Ответ №1:

Действительно, arraybuffer или blob типы ответов не разрешают доступ к фрагменту данных до завершения загрузки.

Итак, есть способы… Например, в новейших браузерах вы могли бы запустить ReadableStream из fetch API, или в Firefox вы могли бы установить responseType значение "moz-chunked-buffer" , но это совсем не то, что вам нужно здесь.

То, что вы описываете, — это именно то, для чего был создан WebRTC. Итак, лучший способ — запустить сервер STUN / TURN и передавать ваши медиа через него, используя MediaStream API.

Комментарии:

1. О, интересно, WebRTC — это встроенный интерфейс браузера, который поддерживается всеми?

2. WebRTC — это набор стандартизированных API, которые в конечном итоге должны поддерживать все веб-браузеры, следующие веб-стандартам. Текущая поддержка браузера не так уж плоха , но мы не можем сказать, что все поддерживают. Через несколько версий Edge не поддерживался, и IE никогда не будет иметь поддержки. На самом деле это зависит от вашей аудитории, но большинство пользователей должны иметь возможность его использовать.