2016-03-23 7 views
11

私はPhantomJSHorsemanJSを使用して、リモートサーバからwavファイルをダウンロードしています。しかし、ファイルがbase64でエンコードされ、新しいファイルに書き込まれると、ファイルは使用できなくなる品質が失われます。オーディオはそこにありますが、その歪みは私にそのエンコーディングの問題と考えるように導きます。私はノードv5を使用してUbuntu 14.04を実行していますHorsemanとPhantomJSを使用してwavファイルをダウンロードするとデータの品質が低下する

以下は私のスクリプトで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(); 
    }); 
    }); 

コンテンツタイプは、このプロセスを通過するとき、それが唯一のバックaudio/wav

として付属しています。

+0

これ以上の情報が必要です。具体的には、ファイルをダウンロードして保存できますか?コーデックのように間違った時間シーケンスを引っ張るように聞こえるが、サンプルwavファイルが必要となる。 –

+0

PhantomJSの代わりにCasperJSを使用してコードを減らしたファイルをダウンロードすることができ、base64で回避策を使用する必要はありません。 – st2erw2od

+0

@ st2erw2od私はCasperJSを調べますが、私が最初に調査したときにはスタンドアロンだったので、ファイル(S3で保存)で事後に必要なことをすることができませんでした – thegogz

答えて

1

なぜあなたは(環境を確認し、NodeJSまたはbtoaにバッファを使用していない)/ATOB()は、ブラウザで、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); 
    } 
} 

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

バッファはNodeJSのみですのでできません私がbase64エンコーディングをしているスクリプトとどこに問題があるのか​​、ブラウザに注入されます。 – thegogz

+0

はい、あなたが言った質問のために: "私はノードv5を使用してUbuntu 14.04で動作しています"と私はあなたにnodejsベースのソリューションが必要だと思った。環境(ノード|ブラウザ)を検出し、ブラウザのノードおよびatob()/ btoa()のバッファなどの適切なメソッドを実行するとどうなりますか?私の答えを更新しました。 –

関連する問題