2016-03-23 16 views
11

Używam PhantomJS i HorsemanJS do pobrania pliku WAV ze zdalnego serwera. Jednak gdy plik jest kodowany base64 i zapisywany do nowego pliku, traci jakość, przez co nie nadaje się do użytku. Dźwięk jest tam, ale jest zniekształcony, co prowadzi mnie do myślenia, że ​​jest to problem z kodowaniem. Używam aplikacji Ubuntu 14.04 za pomocą węzła v5Pobieranie pliku WAV przy użyciu programu Horseman i PhantomJS z utratą jakości danych

Poniżej znajduje się mój skrypt dotyczący pomysłów na ulepszenie kodowania base64?

var Horseman = require('node-horseman'); 
var horseman = new Horseman({cookiesFile:'./cookiejar'}); 
var fs = require('fs'); 

horseman.on("urlChanged", function(url){ 
    console.log(url); 
}); 

horseman.on('consoleMessage', function(msg){ 
    console.log(msg); 
}); 

horseman 
    .userAgent("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36") 
    .open('https://remoteserver.com/audo.aspx?guid=01439900-5361-4828-ad0e-945b56e9fe51') 
    .waitForNextPage() 
    .type('input[name="password"]', process.env.PASS) 
    .type('input[name="username"]', process.env.UN) 
    .click("button:contains('Login')") 
    .waitForNextPage() 
    .evaluate(function(){ 
    var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 

    function base64encode(str) { 
     var out, i, len; 
     var c1, c2, c3; 

     len = str.length; 
     i = 0; 
     out = ""; 
     while(i < len) { 
     c1 = str.charCodeAt(i++) & 0xff; 
     if(i == len) 
     { 
      out += base64EncodeChars.charAt(c1 >> 2); 
      out += base64EncodeChars.charAt((c1 & 0x3) << 4); 
      out += "=="; 
      break; 
     } 
     c2 = str.charCodeAt(i++); 
     if(i == len) 
     { 
      out += base64EncodeChars.charAt(c1 >> 2); 
      out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); 
      out += base64EncodeChars.charAt((c2 & 0xF) << 2); 
      out += "="; 
      break; 
     } 
     c3 = str.charCodeAt(i++); 
     out += base64EncodeChars.charAt(c1 >> 2); 
     out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); 
     out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)); 
     out += base64EncodeChars.charAt(c3 & 0x3F); 
     } 
     return out; 
    } 

    var url = $("a:contains('Uncompressed file')").attr("href"); 

    console.log(url); 

    var out; 
    $.ajax({ 
     'async' : false, 
     'url' : url, 
     'success' : function(data, status, xhr) { 
     console.log(status); 
     console.log(xhr.getResponseHeader('Content-Type')); 
     out = base64encode(data); 
     } 
    }); 
    return out; 
    }) 
    .then(function(out){ 
    fs.writeFile('./mydownloadedfile.txt', out, 'base64', function(){ 
     return horseman.close(); 
    }); 
    }); 

The-typ zawartości wraca jako audio/wav

Jeśli plik jest ręcznie pobierane i odtwarzane przez tego samego gracza, jaką odgrywa w porządku, to tylko wtedy, gdy przechodzi przez ten proces.

+0

Potrzebuje więcej informacji. W szczególności, możesz pobrać plik i zapisać go? To brzmi jak kodek ciągnący błędne sekwencjonowanie czasu, ale potrzebny jest przykładowy plik WAV. –

+0

Można pobrać plik z mniejszą ilością kodu za pomocą CasperJS zamiast PhantomJS i nie musiałbyś używać obejścia przez base64. – st2erw2od

+0

@ st2erw2od Zajmę się CasperJS, ale kiedy początkowo sprawdziłem, był samodzielny, więc nie mogłem zrobić tego, czego potrzebowałem po fakcie z plikiem (sklep na S3) – thegogz

Odpowiedz

1

Dlaczego nie można sprawdzić środowiska i wykorzystywać Buffer w NodeJS lub btoa()/atob() w przeglądarce, do kodowania i dekodowania base64:

function base64Encode(plainData) { 
    if(isNode) { 
     return new Buffer(plainData).toString('base64'); 
    }else { 
     return window.btoa(plainData); 
    } 
} 

function base64Decode(encodedData) { 
    if(isNode) { 
     return new Buffer(encodedData, 'base64').toString(); 
    }else { 
     return window.atob(encodedData); 
    } 
} 

w skrypcie:

var out; 
$.ajax({ 
    'async' : false, 
    'url' : url, 
    'success' : function(data, status, xhr) { 
    console.log(status); 
    console.log(xhr.getResponseHeader('Content-Type')); 
    out = base64Encode(data); 
    } 
}); 
return out; 
})... 
+0

Bufor jest NodeJS tylko dlatego nie może być wstrzyknięto do przeglądarki skrypt, w którym mam kodowanie base64 i gdzie leży problem. – thegogz

+0

Tak, ponieważ w pytaniu powiedziałeś: "Używam Ubuntu 14.04 przy użyciu węzła v5" i założyłem, że potrzebujesz rozwiązania opartego na nodejach. A co z wykrywaniem środowiska (węzeł | przeglądarka) i uruchamianiem odpowiednich metod, takich jak bufor w węźle i atob()/btoa() w przeglądarce? Zaktualizowałem moją odpowiedź. –