Проблема с использованием Reader.onloadend: прочитать предыдущие данные - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь понять код, разработанный другим человеком.Вкратце, мне нужно записать аудиопоток с микрофона и отправить его в систему распознавания речи Google API.

Мы используем recordrtc.

У меня есть кнопка, которая при нажатии записывает звук, а затем при повторном нажатии останавливает запись.

Проблема в том, чтоостановить запись функции.Используя reader.onloadend, когда я пытаюсь прочитать аудио, я всегда читаю предыдущее аудио, а не новое, как будто я в цикле, и я читаю данные i-1, вставленные в i-й.

здесь код stopRecording:

stopRecording() {
    if (this.isRecording) {
      this.audioRecordingService.stopRecording();
      this.isRecording = false;
    }

    var reader = new FileReader();
    reader.readAsDataURL(this.ccc.blob); 
    reader.onloadend = function() {
        console.log("onloadend")
            var base64data = reader.result;
            localStorage.setItem("audioData", base64data.toString());                   
    }
    var data = localStorage.getItem("audioData");
    var clean_data =  data.substr(data.indexOf(',')+1);
    var post_obj = JSON.stringify({
        "name":"audio",
        "base64": clean_data
    })
    this.commandList.postBlob(post_obj).subscribe((res) => {
       console.log("Google API translation: "+ res["res"]);
    });
 }

Извините, если чего-то не хватает.

спасибо


Чтобы все было ясно, я также добавилфункции в службе аудиозаписи.Надеюсь, это поможет.Я тоже проверил и могу подтвердить, что он использовал recordRTC

 getRecordedBlob(): Observable<RecordedAudioOutput> {
   return this._recorded.asObservable();
 }

 getRecordedTime(): Observable<string> {
   return this._recordingTime.asObservable();
 }

 recordingFailed(): Observable<string> {
   return this._recordingFailed.asObservable();
 }

 startRecording() {
   if (this.recorder) {
     return;
   }

   this._recordingTime.next('00:00');
   navigator.mediaDevices.getUserMedia({ audio: true }).then(s => {
   this.stream = s;
   this.record();
 }).catch(error => {
  this._recordingFailed.next();
 });
}

abortRecording() {
  this.stopMedia();
}

private record() {
  this.recorder = new RecordRTC.StereoAudioRecorder(this.stream, {
  type: 'audio',
  numberOfAudioChannels: 1, // or leftChannel:true
  mimeType: 'audio/webm'
});

this.recorder.record();
this.startTime = moment();
this.interval = setInterval(
  () => {
    const currentTime = moment();
    const diffTime = moment.duration(currentTime.diff(this.startTime));
    const time = this.toString(diffTime.minutes()) + ':' + this.toString(diffTime.seconds());
    this._recordingTime.next(time);
  },
  1000
 );
}

 private toString(value) {
   let val = value;
   if (!value) {
   val = '00';
 }
 if (value < 10) {
   val = '0' + value;
 }
 return val;
}

stopRecording() {
  if (this.recorder) {
    this.recorder.stop((blob) => {
      if (this.startTime) {
        const mp3Name = encodeURIComponent('audio_' + new Date().getTime() + '.mp3');
        this.stopMedia();
        this._recorded.next({ blob: blob, title: mp3Name });
      }
     }, () => {
       this.stopMedia();
       this._recordingFailed.next();
     });
  }
} 

 private stopMedia() {
   if (this.recorder) {
     this.recorder = null;
     clearInterval(this.interval);
     this.startTime = null;
     if (this.stream) {
       this.stream.getAudioTracks().forEach(track => track.stop());
       this.stream = null;
     }
   }
 }

1 Ответ

0 голосов
/ 28 ноября 2018

Пожалуйста, попробуйте это:

stopRecording() {
    if (this.isRecording) {
        var that = this;
        this.audioRecordingService.stopRecording(function() {
            that.ccc.blob = that.audioRecordingService.getBlob();
            stopRecording(); // this line is tricky; maybe "that.stopRecording()"?
        });
        this.isRecording = false;
        return;
    }

    var reader = new FileReader();
    reader.readAsDataURL(this.ccc.blob);
    reader.onloadend = function() {
        console.log("onloadend")
        var base64data = reader.result;
        localStorage.setItem("audioData", base64data.toString());
    }
    var data = localStorage.getItem("audioData");
    var clean_data = data.substr(data.indexOf(',') + 1);
    var post_obj = JSON.stringify({
        "name": "audio",
        "base64": clean_data
    })
    this.commandList.postBlob(post_obj).subscribe((res) => {
        console.log("Google API translation: " + res["res"]);
    });
}

т.е. я изменил это в вашем коде:

audioRecordingService.stopRecording(function() {
    var blob = audioRecordingServices.getBlob();
});
...