2016-04-12 33 views
1

Bir mikrofon kullanarak ses kaydetmem ve bir arka uç uygulamasına (tomcat sunucusu) göndermem gereken bir uygulama üzerinde çalışıyorum.

Görünüşe göre çok büyük akışlar göndermek açısal olarak çığlık atıyor ve tarayıcımı donduruyor.

Ses dosyamı kaydetmek için, bir RecordBlob nesnesi almama izin veren yerel işlevi kullanıyorum RecorderWorkerFactory.getUserMedia().

Bundan sonra, Angular içinde, baz64 koşullarında ses içeriğini ayıkladım ve $ kaynak kullanarak arka uç uygulamasına gönderdim. Arka uç uygulaması, verileri doğru şekilde alır ve işler, ancak Firefox sonsuz bir döngü algıladığında ve donarken bu aramanın geri çağrısı hiçbir zaman yürütülmez.

Ancak, programı çalıştırmaya devam edersem, çok uzun bir süre sonra sayfa yenilemesi geçer.


Bu benim base64 Dizesi'ne ses içeriğini ayıklamak kodu göndermek için: Burada

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); 
} 

ben arkasına POST üzerinden OutputStream göndermek ve geri aramasında I (LoadData başlatmak) Görünümümü yeniden yükleyen işlevi.

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


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

Ve bu ses dosyasının yaratılması için Java kodu: içerik gönderilen base64 dize dönüştürme olur

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(); 
     } 
    } 
} 

.


araştırmadan sonra ben sonsuz döngü Java idamından sonra ama sadece callback'inde önce gerçekleşen shallowClearAndCopy() adında bir yerli Açısal fonksiyonu olduğunu buldular. Bu fonksiyonda kod, ses dizisinin her bir karakterini (base64 kodlu) bir object özelliğine dönüştürür ve bunları silmek için bunlara bir döngü yapar. Ancak bu, Firefox'un sonsuz bir döngü olarak gördüğü çok uzun bir tedaviye yol açar.

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 performansından dolayı mı (ve yapılacak başka bir şey yok)? Yoksa sonsuz bir döngü oluşturan bir şeyi özlüyorum mu? Ya da geri arama tanımımda yanlış bir şey mi var?

Şerefe!

cevap

0

Problemi buldum!

Köşeli idi. Nesneyi gerek duymadan dönüştüren - Json (outputStream).