HTML中的getUserMedia和mediarecorder

问题描述 投票:0回答:1

我通过getUserMedia和mediarecorder记录音频:

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

[当我在回调中收到卡盘时,我通过websockets将它们发送到Web api,该Websocket只是将各个部分依次写入文件:

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

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

该文件是在webapi中的Web服务器端创建的(我们称其为“ server.webm”),无法正常工作。更确切地说:它播放前n秒(n是我为启动命令选择的时间),然后停止。这意味着,第一个块已正确传输,但它表明将第二,第三,...卡盘添加到文件中是行不通的。如果我将数组中的块推送到一个数组上,然后将其推送到一个文件,则生成的文件(称为“ 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();
    }
html mediarecorder getusermedia
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.