2015-04-27 4 views
2

Я пытаюсь использовать RecordRTC.js для записи звука с микрофона и загрузки его на сервер nancyfx.RecordRTC с пользовательскими записями частоты дискретизации тишины

Для тестирования я просто пытаюсь загрузить аудиопоток и сохранить его в wav-файле. Однако мое требование состоит в том, что поток сохраняется в 16 бит на 22050 Гц.

Проблема заключается в том, что когда я записываю файл, используя стандартную конфигурацию (без recordRtcOptions), я могу загрузить файл и сохранить его. Когда я укажу частоту дискретизации в recordrtc, выходной файл будет просто тихим.

Соответствующая часть кода находится внутри службы angularJS следующим образом:

app.service('AudioService', ['$window', '$http', function($window, $http) { 

    var recordRtcOptions = { 
     'sample-rate' : 22050 
    }; 

    navigator.getUserMedia = (
     $window.navigator.getUserMedia || 
     $window.navigator.webkitGetUserMedia || 
     $window.navigator.mozGetUserMedia || 
     $window.navigator.msGetUserMedia) 

    var _recordRTC = {}; 
    navigator.getUserMedia({ audio: true, video: false }, function (stream) { 
     console.log('starting to initialize getUserMedia'); 
     console.log(recordRtcOptions); 

     _recordRTC = RecordRTC(stream, recordRtcOptions);  

     console.log('Finished initializing getUserMedia'); 
    }, function (error) { 
     console.log('Error initializing media stream: ' + error); 
    }); 

    var instance = {}; 

    instance.startRecording = function() { 
     console.log('starting to record...'); 
     console.log('sample rate: ' + _recordRTC.sampleRate); 
     _recordRTC.startRecording(); 
    }; 

    instance.stopRecording = function(uploadPath) { 

     console.log('sample rate: ' + _recordRTC.sampleRate); 


     _recordRTC.stopRecording(function(audioVideoMURL) { 
      console.log('stopped recording...'); 
      console.log('recordrtc stop sample rate: ' + _recordRTC.sampleRate); 

      $http({ 
       method : 'POST', 
       url : uploadPath, 
       data : _recordRTC.getBlob() 
      }).success(function(data) { 
       console.log('POST /audio Success'); 

      }).error(function() { 
       console.log('POST /audio error'); 
      }); 
     }); 

    }; 

    return instance; 

}]); 

Любая идея о том, что может быть проблема?

ответ

2

понять проблему, которую вы должны смотреть в RecordRTC.js:

  • первой функция mergeProps копирует конфигурацию вы предоставили.
  • Функция reformatProps преобразует «скорость выборки» в свойство «sampleRate».
  • StereoRecorder используется для записи, которая внутренне использует StereoAudioRecorder, которая по существу аналогична mattdiamond/Recorderjs.

, когда вы смотрите на это, он не принимает sampleRate в качестве входных данных, но определяет его от этой линии

var Recorder = function(source, cfg){ 
    ... 
    this.context = source.context; 
    ... 
     sampleRate: this.context.sampleRate, // --> this is the right way to provide sampleRate 

и в RecordRTC,

var sampleRate = typeof config.sampleRate !== 'undefined' ? config.sampleRate : context.sampleRate || 44100; 

Короче говоря, если вы Обратите внимание, что здесь, когда частота дискретизации не предоставляется, требуется context.sampleRate, которая является частотой дискретизации, предоставляемой микрофоном, поэтому просто изменить частоту дискретизации в конфигурации недостаточно, потому что все, что будет делать, это изменить значение, которое записывается в файл .wav (можно проверить функцию mergeLeftRightBuffers для подтверждения), но данные все равно будут записаны на исходную частоту дискретизации.

Если вы действительно хотите изменить SAMPLERATE, вы можете посмотреть на Record audio on web, preset: 16000Hz 16bit

+1

Я принимаю ваш ответ, так как он отвечает на вопрос. В будущем, я попытаюсь записать в формате по умолчанию и обработать аудио на сервере (фильтрация нижних частот и повторная выборка). – TiagoOliveira

+0

Да, я согласен, что я делаю, это просто интерполяция, и это не так. – mido

Смежные вопросы