我正在寻找一种从soundcloud获取网址的方法,例如:
https://soundcloud.com/cameron-mitchell-28/ancient-greek
并将其转换为音频文件的直接链接,以用作html音频标记的来源。
答案 0 :(得分:9)
重点是,您不能直接将streamUrl传递/使用到您通过其API检索的自己的audioPlayer。
因为实际上streamURL不是您期望播放的音频的终点URL。轨道的实际音频(以mp3格式)正在按需创建'当您向流网址发送http请求时。 (因为没有类似的东西,实际的音频正在等待你随时流式传输 - 它们被存储为AWS blob存储中的二进制文件)
要求'音频'使用每首歌曲的唯一streamURL(您再次通过SoundCloud API检索),您将被重定向到作为物理路径的音频的端点URL,您可以使用通过发送http检索到的此端点URL来播放它请求。关键是,音频的这个端点URL的到期时间是sth。喜欢15-20分钟。
为了达到我在这里所说的,你将不得不做一些与此类似的技巧: (代码在C#中,但你会得到这个想法)
public void Run()
{
if (!string.IsNullOrEmpty(TrackUrl))
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(TrackUrl + ".json?client_id=YOUR_CLIENT_ID");
request.Method = "HEAD";
request.AllowReadStreamBuffering = true;
request.AllowAutoRedirect = true;
request.BeginGetResponse(new AsyncCallback(ReadWebRequestCallback), request);
}
}
private void ReadWebRequestCallback(IAsyncResult callbackResult)
{
HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState;
HttpWebResponse myResponse = (HttpWebResponse)myRequest.EndGetResponse(callbackResult);
using (StreamReader httpwebStreamReader = new StreamReader(myResponse.GetResponseStream()))
{
this.AudioStreamEndPointUrl = myResponse.ResponseUri.AbsoluteUri;
this.SearchCompleted(this);
}
myResponse.Close();
}
AudioStreamEndPointUrl
是您的mp3音频将在接下来的15-20分钟内驻留的实际网址。请注意,每次要流式传输歌曲时,都必须重新请求端点URL。
所以实际上并不是SoundCloud家伙不希望你在自定义音频播放器中流式传输音轨,但它与音频数据的存储感相关。将这些数据保存为blob而不是实际的mp3文件远远便宜得多。
请注意,通过这样做,您应该公平地实际上将SoundCloud归功于应用程序中的某个位置。如果您不信任,我不会认为存在违反使用法律/条款的行为,但这只会是不公平的。
答案 1 :(得分:1)
Soundcloud不会轻易使用HTML5音频标签。这个问题在其他地方被问到SO,而且我找不到任何可行的答案。播放soundcloud链接的最佳方式是使用他们的API。
您可以查看解析调用以将URL更改为轨道对象。 http://developers.soundcloud.com/docs/api/reference#resolve
track对象具有stream_url
属性,您可以将其传递给soundcloud API中的play功能。
http://developers.soundcloud.com/docs/api/reference#tracks
<script src="http://connect.soundcloud.com/sdk.js"></script>
<script>
SC.get('/resolve?url=' + 'https://soundcloud.com/cameron-mitchell-28/ancient-greek', function(track){
SC.stream(track.stream_url, function(sound){
sound.play();
});
});
</script>