我尝试使用由Float32Array
s(每个频道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
但Soundclound API的响应仍然是:" NetworkError:422无法处理的实体 - https://api.soundcloud.com/tracks"
有人能发现错误吗?
答案 0 :(得分:0)
原来,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}
})
});