2016-04-12 104 views
1

我正在製作應用程序,需要使用麥克風錄製音頻並將其發送到後端應用程序(tomcat服務器)。

似乎發送太大的流驅動角瘋狂和凍結我的瀏覽器。

要錄製我的音頻文件,我使用了原生函數RecorderWorkerFactory.getUserMedia(),它們允許我獲得一個RecordBlob對象。

之後,仍然在Angular中,我提取了base64 enconding中的音頻內容,然後使用$ resource將其發送到後端應用程序。 後端應用程序正確接收數據並對其進行處理,但此調用的回調從未執行,因爲Firefox檢測到無限循環並凍結。

但是,如果我繼續運行該程序,很長一段時間後頁面刷新將通過。


這是我提取音頻內容爲base64,串碼,送它:

var blob = $scope.audio.recordBlob; 
if (blob) { 
    var reader = new FileReader(); 
    reader.readAsDataURL(blob); 
    reader.onloadend = function() { 
     $scope.audioContent = reader.result; 
     $scope.sendMessage(); 
    } 
} 

$scope.sendMessage = function(){ 
    var outputStream = { 
         "audio": $scope.audioContent 
        }; 
    $scope.sendIM(outputStream); 
} 

在這裏,我通過POST發送的OutputStream到後面,並在回調我啓動loadData( )函數,重新加載我的觀點。

services.FileCreation= $resource(URI_SERVICE_CREATION, {}, { 
    'post' : urlEncodedFormPost 
}); 


$scope.sendIM = function(fluxSortie) { 
    $services.FileCreation.post(angular.toJson(outputStream)).$promise.then(function(result){ 
     $scope.loadData(); 
    }); 
} 

這是創建音頻文件的Java代碼:

private void createAudioFile(File file, byte[] content) throws IOException { 
    FileOutputStream stream = null; 
    try { 
     stream = new FileOutputStream(file.getPath()); 
     IOUtils.write(content, stream); 
    } catch (IOException e) { 
     LOGGER.debug("creation failed"); 
    } finally { 
     if (stream != null) { 
      stream.flush(); 
      stream.close(); 
     } 
    } 
} 

內容是發送的base64字符串轉換。


研究後,我發現,無限循環是在一個名爲shallowClearAndCopy()的Java執行之後,但就在回調之前所發生的本地角度的功能。在這個函數中,代碼明顯地將音頻字符串的每個字符(base64編碼)轉換爲對象屬性,並對它們執行循環以刪除它們。但是這導致了Firefox被認爲是一個無限循環的很長時間的處理。

function shallowClearAndCopy(src, dst) { 
    dst = dst || {}; 

    angular.forEach(dst, function(value, key) { // This is where it freezes, as dst contains all my base64 encoded data and iterate over each character of it (which is veeeeeery long !) 
    delete dst[key]; 
    }); 

    for (var key in src) { 
    if (src.hasOwnProperty(key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) { 
     dst[key] = src[key]; 
    } 
    } 

    return dst; 
} 

是否因爲angularjs性能(並且沒有其他要做)? 或者我錯過了創建無限循環的東西?或者在我的回調定義中出現錯誤?

乾杯!

回答

0

我發現了問題!

這是角度。 toJson(outputStream),無需轉換對象。