繁体   English   中英

html 中的 getUserMedia 和 mediarecorder

[英]getUserMedia and mediarecorder in html

我通过 getUserMedia 和 mediarecorder 录制音频:

 ...
 navigator.mediaDevices.getUserMedia(constraints).then(mediaStream => {
      try {            
        const mediaRecorder = new MediaRecorder(mediaStream);
        mediaRecorder.ondataavailable = vm.mediaDataAvailable;
        mediaRecorder.start(1000);
        ...

当我在回调中收到卡盘时,我通过 websockets 将它们发送到 web api,它只是将这些部分一个接一个地写入文件:

 mediaDataAvailable(e) {
 if (!event.data || event.data.size === 0)
 {
   return;
 }

 vm.websocket.SendBlob(e.data);
 ...

该文件是在 webapi 的 webserver 端创建的(我们称之为“server.webm”),无法正常工作。 更准确地说:它播放前 n 秒(n 是我为启动命令选择的时间),然后停止。 这意味着,第一个块被正确传输,但是将第二个,第三个,......夹块一起添加到文件中不起作用。 如果我将 web 页面中的块推送到数组和文件中,则生成的文件(我们称之为“client.webm”)在整个录制期间都有效。 在 web 客户端创建文件:

mediaDataAvailable(e) {
 if (!event.data || event.data.size === 0)
 {
   return;
 }
 vm.chuncks.push(e.data);

 ...

 stopCapturing() {
   var blob = new Blob(this.chuncks, {type: 'audio/webm'});
   var url = window.URL.createObjectURL(blob);
   var a = document.createElement('a');
   a.style.display = 'none';
   a.href = url;
   a.download = 'client.webm';
   document.body.appendChild(a);
   a.click();

我比较了文件 client.webm 和 server.webm。 它们非常相似,但 server.webm 中的某些部分不在 client.webm 中。

有人有什么想法吗? 服务器代码如下所示:

 private async Task Echo( HttpContext con, WebSocket webSocket)
    {
        System.IO.BinaryWriter Writer = new System.IO.BinaryWriter(System.IO.File.OpenWrite(@"server.webm"));


        var buffer = new byte[1024 * 4];
        WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
        while (!result.CloseStatus.HasValue)
        {                
            Writer.Write(buffer);
            Writer.Flush();



            await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);

            result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
        }
        await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
        Writer.Close();
    }

已解决,我将保留字节数组的所有字节写入服务器代码中的文件,而不是接收到的字节数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM