我正在製作應用程序,需要使用麥克風錄製音頻並將其發送到後端應用程序(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性能(並且沒有其他要做)? 或者我錯過了創建無限循環的東西?或者在我的回調定義中出現錯誤?
乾杯!