使用Horseman和PhantomJS下载wav文件会丢失数据质量

时间:2016-03-23 10:12:47

标签: javascript node.js audio phantomjs base64

我正在使用PhantomJSHorsemanJS从远程服务器下载wav文件。但是,当文件是base64编码并写入新文件时,它会失去质量,使其无法使用。音频在那里,但它的扭曲导致我认为它是一个编码问题。我正在使用节点v5

在Ubuntu 14.04上运行

以下是我的脚本可能有任何想法改进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 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    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

如果文件是手动下载并通过同一个播放器播放,则播放正常,只有当它完成此过程时才会播放。

1 个答案:

答案 0 :(得分: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;
})...