我正在开发一个应用程序,我需要使用麦克风录制音频并将其发送到后端应用程序(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();
}
}
}
其中 content 是发送的base64字符串的转换。
经过研究,我发现无限循环是在Java执行之后但在回调之前发生的名为 shallowClearAndCopy()的本机Angular函数中。在此函数中,代码显然将音频字符串的每个字符(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 :(得分:0)
我发现了,问题!
角度。 toJson (outputStream)无需转换对象。