Squeak.ru - шаблоны программирования

Загрузка wav-файла с использованием Horseman и PhantomJS с потерей качества данных

Я использую PhantomJS и HorsemanJS для загрузки wav-файла с удаленного сервера. Однако, когда файл кодируется base64 и записывается в новый файл, он теряет качество, что делает его непригодным для использования. Звук есть, но он искажен, что наводит меня на мысль, что это проблема с кодировкой. Я работаю на Ubuntu 14.04, используя узел v5.

Ниже мой скрипт, есть идеи по улучшению кодировки 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

Если файл скачивается вручную и проигрывается через тот же плеер, то проигрывается нормально, это только при прохождении этого процесса.


  • Это требует дополнительной информации. В частности, вы можете скачать файл и сохранить его? Похоже, что кодек использует неправильную временную последовательность, но необходим образец wav-файла. 01.04.2016
  • Вы можете загрузить файл с меньшим количеством кода с помощью CasperJS вместо PhantomJS, и вам не придется использовать обходной путь через base64. 01.04.2016
  • @ st2erw2od Я изучу CasperJS, но когда я первоначально исследовал его, он был автономным, поэтому я не мог делать то, что мне было нужно, с файлом после факта (хранить на S3) 01.04.2016
  • @CharlesMerriam да, я могу вручную загрузить файл и воспроизвести его с помощью того же аудиоплеера, который я использую для воспроизведения файла после того, как он пройдет этот процесс. Исходный wav-файл при прямой загрузке имеет идеальное качество, поэтому это не проблема кодека, к сожалению, информация в wav-файле (запись звонков) является конфиденциальной, поэтому я не могу предоставить публичный пример. 01.04.2016

Ответы:


1

Почему бы вам не проверить среду и не использовать Buffer в 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;
})...
01.04.2016
  • Buffer - это только NodeJS, поэтому его нельзя внедрить в браузер, скрипт, в котором я кодирую base64 и в чем проблема. 01.04.2016
  • Да, это потому, что в вопросе вы сказали: я работаю на Ubuntu 14.04, используя node v5, и я предположил, что вам нужно решение на основе nodejs. Как насчет определения среды (узел | браузер) и запуска соответствующих методов, таких как Buffer в узле и atob()/btoa() в браузере? Обновил мой ответ. 01.04.2016
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...