Отправка данных WebAudio на дорожку Soundcloud с помощью Javascript SDK

Я пытаюсь использовать аудиобуфер, состоящий из Float32Arrays (по 1 для каждого канала), в качестве данных актива для создания дорожки soundcloud. Аудиобуфер для монофонической записи выглядит так:

[Float32Array { 0=-0.0001220703125,  1=0.000579833984375,  2=0.000762939453125,  ...}]

Поэтому я предполагаю, что мне следует преобразовать его в двоичную строку. Чтобы узнать правильную кодировку, я взглянул на http://connect.soundcloud.com/examples/recording.html Это флеш, но в конце делается следующий пост:

audio.wav
--ievejmnijdgyooinchslwnpygpivapif
Content-Disposition: form-data; name="track[asset_data]"; filename="audio.wav"
Content-Type: application/octet-stream

RIFF(WAVEfmt D¬XdataÚÿÇÿÿ+ÿc]ÿ1&»ÿUÿ(1ÊÿEc&môã...

Чтобы превратить мой аудиобуфер в такой, я использовал код, похожий на https://gist.github.com/kevincennis/9754325, так что теперь мой процесс выглядит так:

worker.onmessage = function( e ) {
  var blob = e.data;
  var reader = new window.FileReader();
  reader.onloadend = function() {
     var binaryData = reader.result;                
     SC.post('/tracks', {
       asset_data : binaryData,
       title : 'recording'
     });
  };
  reader.readAsText(blob);
});

Тем не менее, должны быть некоторые проблемы с кодировкой. Вышеизложенное создает следующий пост:

_status_code_map[302]   200
asset_data              RIFF ���WAVEfmt �����D�������data����
format                  json
oauth_token             1....
title                   recording

но ответ Soundcloud API по-прежнему: «NetworkError: 422 Unprocessable Entity — https://api.soundcloud.com/tracks "

Кто-нибудь может определить, что не так?


person digital illusion    schedule 30.06.2015    source источник
comment
превратить его в большой двоичный объект, затем вы можете загрузить большой двоичный объект или использовать FormData, чтобы превратить большой двоичный объект в то, что выглядит на сервере как прикрепленный файл.   -  person dandavis    schedule 01.07.2015
comment
Я последовал вашему предложению, но я просто получаю: assets_data=%5Bobject%20Blob%5D   -  person digital illusion    schedule 01.07.2015
comment
что высокоуровневая функция загрузки может не обрабатывать двоичные данные, она относительно новая.   -  person dandavis    schedule 01.07.2015
comment
Я обновил свой код в соответствии с вашим предложением, но что-то все еще не работает с кодировкой.   -  person digital illusion    schedule 01.07.2015
comment
developers.soundcloud.com/docs/api/guide#uploading   -  person dandavis    schedule 01.07.2015
comment
Теперь я знаю это наизусть, но я не хочу записывать звук с помощью Soundcloud SDK. Есть ли какая-то полезная информация, которую я там пропустил?   -  person digital illusion    schedule 01.07.2015
comment
похоже, у них нет возможности загружать двоичные файлы в свой JS-клиент. то, что вы можете попробовать, это запустить демо-запись, а затем посмотреть на вкладку сети devtools, чтобы шпионить за POST. если вы можете воссоздать необработанное HTTP-взаимодействие в пользовательском вызове ajax, вы можете заменить записанный звук вашим новым материалом в том же формате. если они хотят MP3, это будет трудная задача, но вы, вероятно, можете отправлять аудиоданные в формате WAV, которые легко построить из необработанных сэмплов буфера массива. загляните в файл recorder.js, чтобы найти подпрограмму arraybuffer для wav blob.   -  person dandavis    schedule 01.07.2015
comment
похоже, что это WAV, но я понятия не имею, как использовать мой аудиобуфер...   -  person digital illusion    schedule 01.07.2015


Ответы (1)


Оказывается, Soundcloud принимает запрос только в том случае, если он находится в кодировке составной формы. Мне кажется невозможным добиться этого с помощью SDK. Это код, использующий angular.js:

worker.onmessage = function( e ) {
  var blob = e.data;
  var fd = new FormData();
  fd.append('oauth_token', SC.accessToken());
  fd.append('format','json');
  fd.append('track[title]', 'recording');
  fd.append('track[asset_data]', blob);

  $http.post('https://api.soundcloud.com/tracks', fd, {
    transformRequest: angular.identity,
    headers: {'Content-Type': undefined}
  })
});
person digital illusion    schedule 01.07.2015