我有一个.net core WebSocket服务器,它从客户端A接收实时流音频,然后我需要把这个实时音频流给客户端B(浏览器)。所以我从客户端A收到了字节数组,我把字节数组发送到客户端B(浏览器)*字节数组是正确的,因为我可以把它转换成.wav并顺利播放。
在客户端B(Browser)中,我试图将阵列缓冲区解码为音频缓冲区,以便将其放入输出并播放。
mediastreamhandler.SendArraySegToAllAsync是我开始从服务器向客户端B发送字节数组的地方。我首先使用发送至所有的方法,随后将进行修改,并通过匹配websocket连接ID发送数据。
private async Task Echo(HttpContext context, WebSocket webSocket)
Debug.WriteLine("Start Echo between Websocket server & client");
var buffer = new byte[1024 * 4];
WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
while (!result.CloseStatus.HasValue)
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 mediastreamhandler.SendArraySegToAllAsync(new ArraySegment<byte>(buffer, 0, result.Count));
Debug.WriteLine("Close Echo");
await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
然后我通过Javascript中的websocket.onmessage接收音频字节数组。然后我把字节数组传递给解码和播放。但在这里它说 "无法解码数据"。而在Mozilla中,它确实说内容格式未知(我需要重新格式化我收到的字节数组吗?)字节数组本身是好的,因为我已经用同样的字节数在本地创建了.wav文件并播放它,没有任何问题。
var ctx = new AudioContext();
function playSound(arrBuff) {
var myAudioBuffer;
var src = ctx.createBufferSource();
ctx.decodeAudioData(arrBuff, function (buffer) {
myAudioBuffer = buffer;
src.buffer = myAudioBuffer;
src.connect(ctx.destination);
src.start();
然后我尝试用另一种方法来解码和播放音频,这一次,它播放了一些白噪声,而不是从客户端A流出来的音频。
var ctx = new AudioContext();
function playSound(arrBuff) {
var myAudioBuffer;
var src = ctx.createBufferSource();
myAudioBuffer = ctx.createBuffer(1, arrBuff.byteLength, 8000);
var nowBuffering = myAudioBuffer.getChannelData(0);
for (var i = 0; i < arrBuff.byteLength; i++) {
nowBuffering[i] = arrBuff[i];
src.buffer = myAudioBuffer;
src.connect(ctx.destination);
src.start();
我想我真的需要一些帮助,试图在几周内打出阵列缓冲区,但仍然无法有任何突破。困在这里了。我不知道我做了什么,你们能指导我或告诉我任何其他的方法吗?非常感谢,真的很感谢。
decodeAudioData()