Streaming 通过客户端XHR打开声音云曲目的流\u url?

Streaming 通过客户端XHR打开声音云曲目的流\u url?,streaming,html5-audio,soundcloud,cors,web-audio-api,Streaming,Html5 Audio,Soundcloud,Cors,Web Audio Api,因为您可以通过XHR调用SoundCloudAPI (因为它发送的CORS头,对吗?) 我想知道音频数据本身是否有可能做到这一点,比如说曲目的stream_url 当尝试使用Web Audio API使用XHR(从客户端)打开stream_url时,我得到了Access Control Allow Origin不允许的源代码。错误。 有没有一种方法可以从客户端Javascript通过XHttpRequest加载音频资源,或者不可能()加载 这将是伟大的,因为这将允许一些真正酷的东西与网络音频AP

因为您可以通过XHR调用SoundCloudAPI (因为它发送的CORS头,对吗?) 我想知道音频数据本身是否有可能做到这一点,比如说曲目的stream_url

当尝试使用Web Audio API使用XHR(从客户端)打开stream_url时,我得到了Access Control Allow Origin不允许的源代码。错误。 有没有一种方法可以从客户端Javascript通过XHttpRequest加载音频资源,或者不可能()加载

这将是伟大的,因为这将允许一些真正酷的东西与网络音频API

谢谢

更新

问题可能与您在呼叫时得到的302重定向有关:

http://api.soundcloud.com/tracks/5646378/stream.json?client_id=[client_id]
或者其他一些请求实际媒体文件的呼叫(请参阅注释)


原始的JSON响应有CORS头,而重定向的位置没有。

好吧,只要音频文件本身没有CORS头(请参阅问题中的curl-IL输出),对我来说唯一有效的解决方案就是打开音频文件并自己添加头

据我所知,这也是其他类似的应用程序所做的。(在node.js中) 这有一个巨大的缺点,就是将二进制文件的流量转移到您的服务器,否则soundcloud.com将为您提供服务

您可以使用PHP打开文件,添加标题,并使用以下内容重新整理文件:

$fp = fopen('http://api.soundcloud.com/tracks/[track_id]/stream.json?client_id=[client_id]', 'rb');

header("Content-Type: audio/mpeg");
header("Access-Control-Allow-Methods: GET, PUT, POST, DELETE");
header("Access-Control-Allow-Headers: Accept, Authorization, Content-Type, Origin");
header("Access-Control-Allow-Origin: *");
fpassthru( $fp );

exit();
正如我所说的,这只是一种变通方法,对于生产环境来说不是一个好的解决方案, 但是帮助我继续使用我的网络音频应用程序


Soundcloud,有没有可能将CORS头添加到音频文件中?:)

如果不一定要使用XHR,则可以创建新的
元素,并将其
src
设置为所需的任何资产,而无需绑定到同一来源策略

较新版本的Chrome允许您通过
MediaElementAudioSourceNode
从媒体元素创建AudioNode实例,因此您仍然可以使用所有酷炫的新Web音频素材

var audio, body, context, source;
audio = document.createElement('audio');
body = document.getElementsByTagName('body')[0];
audio.setAttribute('src', 'http://kevincennis.com/mix/assets/sounds/1901_gtr1.mp3');
body.appendChild(audio);
context = new webkitAudioContext();
source = context.createMediaElementSource(audio);
source.connect(context.destination);
source.mediaElement.play();

请原谅这可怕的密码。很晚了,我很累。

应该可以用,例如[(),如果您是从本地主机运行,这可能是一个问题,但当您通过XHR实际加载音频文件时,您似乎正在使用域上的路由。([user]/[track]/audio,对吗?)你是在使用某种代理,还是在服务器端打开并重新整理它们?我很想找到一个解决方案,如何通过XHR直接在JS中打开Soundcloud音频文件。这不是我的工作!我基本上和你有相同的问题。他们在服务器上,然后是客户端,但这应该是相同的原则不?我已经尽了最大努力打开mp3流,但将此错误记录到控制台XMLHttpRequest无法加载。无法从null发出任何请求。我也有此错误。我猜它来自流URL,正在被重写到媒体文件的实际存储位置。当我使用已解析的URI硬编码时消失。(我认为这可以在JS中以某种方式解决)。但是我得到了问题中描述的CORS错误。在我看来,流式音频文件可能不会发送那些CORS头…是的,也得到了CORS错误,也许jsonp会有所帮助
var audio, body, context, source;
audio = document.createElement('audio');
body = document.getElementsByTagName('body')[0];
audio.setAttribute('src', 'http://kevincennis.com/mix/assets/sounds/1901_gtr1.mp3');
body.appendChild(audio);
context = new webkitAudioContext();
source = context.createMediaElementSource(audio);
source.connect(context.destination);
source.mediaElement.play();