使用 SoundCloud 默认音频小部件,您可以将其设置为从 JavaScript 随机播放吗?
Posted
技术标签:
【中文标题】使用 SoundCloud 默认音频小部件,您可以将其设置为从 JavaScript 随机播放吗?【英文标题】:With SoundCloud default audio widget can you set it to shuffle from JavaScript? 【发布时间】:2013-03-22 14:02:47 【问题描述】:我正在使用默认的 SoundCloud 音频小部件来播放播放列表,并希望歌曲以随机顺序播放。我正在使用 SoundCloud javascript SDK oEmbed 对象(iframe 版本)。
<script src="//connect.soundcloud.com/sdk.js"></script>
SC.oEmbed("//soundcloud.com/buzzinfly",
auto_play: true,
start_track: random_start_track,
iframe: true,
maxwidth: 480,
enable_api: true,
randomize: true
,
document.getElementById("soundcloud_player"));
文档没有提到任何 randomize 或 shuffle 属性,但 oembed 支持其他未记录的属性,如 start_track。
//developers.soundcloud.com/docs/oembed#parameters
//developers.soundcloud.com/docs/widget
有谁知道默认音频小部件中是否有一个属性可以随机播放歌曲顺序?
如果没有,有没有办法从默认的 SoundCloud 小部件中捕获事件,这样我就可以在歌曲完成事件后播放一首随机歌曲?就像您可以使用自定义播放器一样。
//developers.soundcloud.com/docs/custom-player#events
$(document).bind('onPlayerTrackSwitch.scPlayer', function(event, track)
// goto random track
);
谢谢
更新
这是我在得到 gryzzly 帮助后使用的代码。
下一个按钮效果很好。我可以跳过随机歌曲。不幸的是,当曲目播放完毕时,我会听到两首歌曲的音频:播放列表中的下一首歌曲和在 FINISH 事件中跳到的随机曲目。
var widget = null;
var song_indexes = new Array();
var current_index = 0;
$(function()
var iframe = document.querySelector('#soundcloud_player iframe');
widget = SC.Widget(iframe);
widget.bind(SC.Widget.Events.READY, function()
widget.unbind(SC.Widget.Events.FINISH);
widget.bind(SC.Widget.Events.FINISH, function()
play_next_shuffled_song();
);
widget.getSounds(function(sounds)
create_shuffled_indexes(sounds.length);
play_next_shuffled_song();
);
);
$("#button_sc_next").on("click", play_next_shuffled_song);
);
function play_next_shuffled_song()
current_index++;
if (current_index >= song_indexes.length)
current_index = 0;
var track_number = song_indexes[current_index];
widget.skip(track_number);
function create_shuffled_indexes (num_songs)
for (var i=0;i<num_songs;i++)
song_indexes.push(i);
song_indexes = shuffle(song_indexes);
//+ Jonas Raoni Soares Silva
//@ http://jsfromhell.com/array/shuffle [v1.0]
function shuffle(o) //v1.0
for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
return o;
;
【问题讨论】:
嘿,我试过你的代码,它对我来说似乎工作正常!这是一个工作示例:jsbin.com/unefut/2/edit 如果将 iframe src 设置为 w.soundcloud.com/player/?url=%2Fidontlikewords%2Ffavorites,则会出现问题 jsbin.com/unefut/4/edit 在歌曲结束前点击。让它发挥到最后。当新的随机歌曲开始时,播放列表中的下一首歌曲也会开始。如果按暂停,它只会暂停随机曲目。播放列表中的下一首歌曲仍在播放。也许玩最爱有什么问题。我尝试将 URL 更改为喜欢(现在他们称之为收藏夹),但不起作用。 【参考方案1】:您可以找到 Widget API here 的文档。
伪代码类似于:
load widget
get widget sounds LENGTH /* say 5 */
create an ARRAY of that LENGTH and shuffle it /* to have something like [3, 1, 0, 2, 4] */
create function SKIP that will check if ARRAY still has any items in it (length is not 0) and skip player to array.pop() index /* pop will return the last item in the array and return its value */
attach event handler to FINISH events that will run SKIP function
run SKIP function first time yourself
如果用户使用小部件 UI 中的“下一个”控件跳过,小部件将 只需播放列表中的下一首歌曲。你也许可以检测到 不知何故跳到另一个随机轨道。
我希望这会有所帮助!
【讨论】:
感谢您的信息。使用 Widget API,我可以让一个按钮跳到一首随机歌曲。不幸的是,如果我让 FINISH 事件调用相同的跳过函数,则会在后台播放第二首歌曲。它播放播放列表中的下一首歌曲和跳到的随机歌曲。以上是关于使用 SoundCloud 默认音频小部件,您可以将其设置为从 JavaScript 随机播放吗?的主要内容,如果未能解决你的问题,请参考以下文章
soundcloud 小部件:自动播放在 Firefox 16 中无法始终如一地工作
SoundCloud SC.Widget.Events.FINISH 不再触发 HTML5 小部件
Soundcloud iframe 和 YouTube iframe 一起出现的问题