[英]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.