我通过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();
}
已解决,我将保留字节数组的所有字节写到服务器代码中的文件中,而不是接收字节数。