Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过套接字io的实时音频流。alsa关机,如何修复?_Javascript_Angular_Ionic Framework_Socket.io_Alsa - Fatal编程技术网

Javascript 通过套接字io的实时音频流。alsa关机,如何修复?

Javascript 通过套接字io的实时音频流。alsa关机,如何修复?,javascript,angular,ionic-framework,socket.io,alsa,Javascript,Angular,Ionic Framework,Socket.io,Alsa,我想通过socket.io和ionic 4创建实时音频流服务。 对于客户端,我将使用cordova插件audioinput和ng socket io进行angular 对于服务器,我使用standart npm包 节点版本:10.16.0 Npm版本:6.9.0 我正在接收声音并播放它,但在收到58-60个音频包(帧)后也会关机 我的客户代码: export class HomePage { bufferSize:number = 8192; mediaRecorder; const

我想通过socket.io和ionic 4创建实时音频流服务。
对于客户端,我将使用cordova插件audioinput和ng socket io进行angular
对于服务器,我使用standart npm包

节点版本:10.16.0
Npm版本:6.9.0
我正在接收声音并播放它,但在收到58-60个音频包(帧)后也会关机

我的客户代码:

export class HomePage {
  bufferSize:number = 8192;
  mediaRecorder;
  constructor(public socket:Socket) {}
  ngOnInit(){   
    this.socket.connect(); 
    window.addEventListener('audioinput', (data) => {
      this.onAudioInput(data, this.socket);
    });

    audioinput.initialize({
      sampleRate: 8000,
      bufferSize: this.bufferSize,
      channels: 1,
      format: audioinput.FORMAT.PCM_16BIT,
      audioSourceType: audioinput.AUDIOSOURCE_TYPE.MIC
    }, () => {
      audioinput.checkMicrophonePermission((hasPermission) => {
        if (hasPermission) {
          console.log("Permission already exist");
        } 
        else {          
          audioinput.getMicrophonePermission((hasPermission, message) => {
            if (hasPermission) {
              console.log("User gived permission.");
            } else {
              console.warn("User denied permission.");
            }
          });
        }
      });
    });
  }
  onAudioInput(data, socket){
    socket.emit("audioinput", data.data);
  }
  start(){
    audioinput.start({
      sampleRate: 8000,
      bufferSize: this.bufferSize,
      channels: 1,
      format: audioinput.FORMAT.PCM_16BIT,
      audioSourceType: audioinput.AUDIOSOURCE_TYPE.MIC
    });
    this.socket.emit("message", "started");
  }
  stop(){
    audioinput.stop();
    this.socket.emit("message", "stoped");
  }
}
我的服务器代码:

let app = require('express');
let http = require('http').Server(app);
let io = require('socket.io')(http);
let audioContext = require('audio-context')({
    sampleRate: 8000, 
    latencyHint: 'balanced'
});
let buff = require('audio-buffer');
const play = require('audio-play');

var audioBuffer 
= new buff(audioContext, {
    length: 8192,
    sampleRate: 8000,
    numberOfChannels: 1
});
array = new Float32Array();
var counter = 0;
io.on('connection', (socket) =>{
    socket.on('message', (data) =>{
        console.log(data);
    });
    //var outputData = new Float32Array(buffer);
    socket.on('audioinput', (data)=>{ 
        array = data;
        audioBuffer.copyToChannel(array, 0, 0);
        if(counter == 0){
            setTimeout(function audio(){
                var playback = play(audioBuffer, { 
                    start: 0,
                    end: audioBuffer.duration,
                    loop:false,
                    detune: 0,
                    rate: 8000,
                    volume: 1,
                    context: audioContext,
                    autoplay: false
                }, (result) => {});
                playback.play();
                setTimeout(audio, 1000)  
            }, 1000);
        }    
        counter ++;
        console.log(counter);
    });

});
var port = process.env.PORT || 6500;

http.listen(port, () =>{
    console.log('listening started');
});
58-60个音频数据包后,alsa关闭,如下所示:

ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Connection terminated

    [../deps/mpg123/src/output/alsa.c:165] error: cannot open device default
    events.js:174
          throw er; // Unhandled 'error' event
          ^

    Error: open() failed: -1
        at Speaker._open (/home/azat/ionicFolder/server (копия)/node_modules/audio-speaker/node_modules/speaker/index.js:168:11)
        at Speaker._write (/home/azat/ionicFolder/server (копия)/node_modules/audio-speaker/node_modules/speaker/index.js:242:21)
        at doWrite (/home/azat/ionicFolder/server (копия)/node_modules/audio-speaker/node_modules/speaker/node_modules/readable-stream/lib/_stream_writable.js:428:64)
        at writeOrBuffer (/home/azat/ionicFolder/server (копия)/node_modules/audio-speaker/node_modules/speaker/node_modules/readable-stream/lib/_stream_writable.js:417:5)
        at Speaker.Writable.write (/home/azat/ionicFolder/server (копия)/node_modules/audio-speaker/node_modules/speaker/node_modules/readable-stream/lib/_stream_writable.js:334:11)
        at write (/home/azat/ionicFolder/server (копия)/node_modules/audio-speaker/direct.js:67:11)
        at loop (/home/azat/ionicFolder/server (копия)/node_modules/audio-play/index.js:93:4)
        at Function.play (/home/azat/ionicFolder/server (копия)/node_modules/audio-play/index.js:94:4)
        at Timeout.audio [as _onTimeout] (/home/azat/ionicFolder/server (копия)/index.js:54:26)
        at ontimeout (timers.js:436:11)


如何修复此错误?

我已解决此问题。 我的客户端用于从麦克风进行实时音频翻译:

declare var audioinput: any;

import { Component } from '@angular/core';
import { Socket } from 'ng-socket-io';


@Component({
  selector: 'app-home',
  templateUrl: 'home.page.html',
  styleUrls: ['home.page.scss'],
})
export class HomePage {

  bufferSize = 2048;
  constructor(public socket: Socket) {}
  ngOnInit() {
    this.socket.connect();
    window.addEventListener('audioinput', (data) => {
      this.onAudioInput(data, this.socket);
    });

    audioinput.initialize({
      sampleRate: 8192,
      bufferSize: this.bufferSize,
      channels: 1,
      format: audioinput.FORMAT.PCM_16BIT,
      audioSourceType: audioinput.AUDIOSOURCE_TYPE.MIC,
      streamToWebAudio: false
    }, () => {
      audioinput.checkMicrophonePermission((hasPermission) => {
        if (hasPermission) {
          console.log('Разрешение уже получено');
        } else {
          audioinput.getMicrophonePermission((hasPermission, message) => {
            if (hasPermission) {
              console.log('Пользователь дал разрешение на запись.');
            } else {
              console.warn('Пользователь запретил записывать.');
            }
          });
        }
      });
    });
  }
  onAudioInput(data, socket) {
    socket.emit('audioinput', data.data);
    console.log(data.data);
  }
  start() {
    audioinput.start({
      sampleRate: 8192,
      bufferSize: this.bufferSize,
      channels: 1,
      format: audioinput.FORMAT.PCM_16BIT,
      audioSourceType: audioinput.AUDIOSOURCE_TYPE.MIC,
      streamToWebAudio: false
    });
  }
  stop() {
    audioinput.stop();
    // this.socket.emit("message", "stoped");
  }
}
以及我的服务器端,用于从移动麦克风播放语音
服务器通过socket.io接收区块并通过扬声器播放:

let app = require('express');
let http = require('http').Server(app);
let io = require('socket.io')(http);
var buff = require('audio-buffer');
const Speaker = require('audio-speaker/stream');

var audioBuffer = new buff({
    length: 2048,
    sampleRate: 8192,
    numberOfChannels: 1
})

array = new Float32Array();

var speakerVoice;
io.on("connection", (socket) => {
    socket.on("message", (data) =>{

    })
    socket.on("audioinput", (data) => {
        array = data;
        if(counter == 0){
            speakerVoice = new Speaker({
                sampleRate: 4096,
                float: true,
                signed: true,
                bitDepth: 16
            });         
        }
        audioBuffer.copyToChannel(array, 0, 0);
        speakerVoice.write(audioBuffer);
    })
})
var port = process.env.PORT || 6500;

http.listen(port, () =>{
    console.log('listening started');
});