首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何播放用WebRTC录制的音频流块?

如何播放用WebRTC录制的音频流块?
EN

Stack Overflow用户
提问于 2017-11-13 21:48:53
回答 1查看 2.5K关注 0票数 2

我正在尝试创建一个实验应用程序,它可以实时地将音频从client 1流到client 2

因此,按照有关同一主题的一些教程和问题,我使用了WebRTCbinaryjs。到目前为止,这是我得到的

Client 1Client 2已经连接到BinaryJS来发送/接收数据块。

2- Client 1使用WebRTC记录音频,并逐渐发送给BinaryJS。

3- Client 2接收到块并尝试播放它们。

嗯,我在最后一部分中出了个错误。这是我得到的错误消息:

RangeError:源代码太大了 在Float32Array.set (本地)

这是密码:

客户端1

代码语言:javascript
复制
var WSClient;
var AudioStream;

function load(){
    var session = {
        audio: true,
        video: false
    };

    var recordRTC = null;

    navigator.getUserMedia(session, startRecording, onError);
    WSClient = new BinaryClient('ws://localhost:9001');
    WSClient.on('open',function(){
        console.log('client opened')
        AudioStream = WSClient.createStream();
    })
}

function startRecording(stream){
    var context = new AudioContext();
    var audio_input = context.createMediaStreamSource(stream);
    var buffer_size = 2048;

    var recorder = context.createScriptProcessor(buffer_size, 1, 1);

    recorder.onaudioprocess = function(e){
        console.log('chunk')
        var left = e.inputBuffer.getChannelData(0);
        AudioStream.write(left);
    };

    audio_input.connect(recorder);
    recorder.connect(context.destination);
}

Client 2

代码语言:javascript
复制
var WSClient;
var audioContext;
var sourceNode;

function load(){
    audioContext = new AudioContext();
    sourceNode = audioContext.createBufferSource();
    sourceNode.connect(audioContext.destination);

    sourceNode.start(0);

    WSClient = new BinaryClient('ws://localhost:9001');

    WSClient.on('open',function(){
        console.log('client opened');
    });

    WSClient.on('stream', function(stream, meta){
        // collect stream data
        stream.on('data', function(data){
            console.log('received chunk')
            var integers = new Int16Array(data);
            var audioBuffer = audioContext.createBuffer(1, 2048, 4410);
            audioBuffer.getChannelData(0).set(integers); //appearently this is where the error occurs
            sourceNode.buffer = audioBuffer;
        });
    });
}

服务器

代码语言:javascript
复制
var wav = require('wav');
var binaryjs = require('binaryjs');

var binaryjs_server = binaryjs.BinaryServer;

var server = binaryjs_server({port: 9001});

server.on('connection', function(client){
    console.log('server connected');

    var file_writter = null;

    client.on('stream', function(stream, meta){
        console.log('streaming', server.clients)
        //send to other clients
        for(var id in server.clients){
            if(server.clients.hasOwnProperty(id)){
                var otherClient = server.clients[id];
                if(otherClient != client){
                    var send = otherClient.createStream(meta);
                    stream.pipe(send);
                }
            }
        }
    });

    client.on('close', function(stream){
        console.log('client closed')
        if(file_writter != null) file_writter.end();
    });
});

错误发生在这里:

代码语言:javascript
复制
audioBuffer.getChannelData(0).set(integers);

所以我有两个问题:

是否可以发送我在client 1中捕获的块,然后在client 2中复制它们?

我所犯的错误是怎么处理的?

谢谢你们!

@编辑1

由于我从其他问题中得到了代码片段,所以我仍然试图理解它。我在client 2代码中注释了创建Int16Array的行,现在得到了一个不同的错误(但我不知道哪个版本的代码更正确):

Uncaught :未能在“AudioBufferSourceNode”上设置“缓冲区”属性:无法在已设置缓冲区后设置缓冲区

可能是因为每次我得到新的数据时都会设置它。

EN

回答 1

Stack Overflow用户

发布于 2017-11-14 16:17:57

DOMException about AudioBufferSourceNode意味着您需要为正在创建的每个新Audiobuffer创建一个新的AudioBufferSourceNode。所以就像

sourceNode = new AudioBufferSourceNode(audioContext, {buffer: audioBuffer})

AudioBufferFloat32Array,您需要在将Int16Array分配给AudioBuffer之前将其转换为Float32Array。很可能足以除以32768。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47274120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档