有没有办法检索或派生原始的SoundCloud API波形数据?

时间:2012-05-18 12:35:37

标签: php javascript soundcloud waveform

我正在创建一个使用SoundCloud API来流式传输艺术家视频的Web应用程序。我知道如何获得波形PNG图像(例如http://w1.sndcdn.com/fxguEjG4ax6B_m.png),但实际上我需要某种波形数据(在歌曲中它是高时还是低时?)。

我无法访问像LAME这样的音频库,因为我的网络托管不允许它。是否可能

  1. 以某种方式直接从SoundCloud API获取此数据。
  2. 以PHP或JavaScript处理波形PNG图像以检索所需数据? (是否有某种库可用于此类处理?)

5 个答案:

答案 0 :(得分:6)

Soundcloud开始提供浮点数,但它尚未正式发布。只要一点点技巧,当你有PNG时:

DROP PROCEDURE IF EXISTS CreateNativeUser;

delimiter $$
CREATE PROCEDURE CreateNativeUser (p_email varchar(100), p_pass varchar(32))
BEGIN

 insert into users(email) values (p_email);
 insert into user_logins_native() values(???, p_email, p_pass);
 commit;

END $$

delimiter ;

更改" w1 "通过" wis "和" png "通过" json ":

https://w1.sndcdn.com/XwA2iPEIVF8z_m.png

你明白了!

答案 1 :(得分:4)

可以解析波形PNG图像以将其转换为点阵列。图像是垂直对称的,为了找到峰值,您只需要检查alpha值来计算它从图像顶部有多少不透明像素。这是为widgetNext SoundCloud上的波形呈现方式。

在PHP中,您可以使用ImageMagickGD Graphics Library来读取这些值,在Javascript中,可以将图像放到画布对象上,然后从那里检查图像数据。我不会过多地了解这些细节,但如果你遇到困难,你当然可以提出另一个问题。

答案 2 :(得分:1)

虽然没有官方方法直接从SoundCloud API请求获取原始波形数据,但有一种方法可以导出SoundCloud在非官方端点(又名:https://wis.sndcdn.com/XwA2iPEIVF8z_m.json之类的东西)中显示的完全相同的数据。 PHP使用这样的代码。只需更改$image_file的值即可匹配任何SoundCloud 1800宽280高PNG图像,您就可以了:

$source_width = 1800;
$source_height = 140;
$image_file = 'https://w1.sndcdn.com/XwA2iPEIVF8z_m.png';
$image_processed = imagecreatefrompng($image_file);
imagealphablending($image_processed, true);
imagesavealpha($image_processed, true);

$waveform_data = array();

for ($width = 0; $width < $source_width; $width++) {

  for ($height = 0; $height < $source_height; $height++) {

    $color_index = @imagecolorat($image_processed, $width, $height);

    // Determine the colors—and alpha—of the pixels like this.
    $rgb_array = imagecolorsforindex($image_processed, $color_index);

    // Peak detection is based on matching a transparent PNG value.
    $match_color_index = array(0, 0, 0, 127);
    $diff_value = array_diff($match_color_index, array_values($rgb_array));
    if (empty($diff_value)) {
      break;
    }

  } // $height loop.

  // Value is based on the delta between the actual height versus detected height.
  $waveform_data[] = $source_height - $height;

} // $width loop.

// Dump the waveform data array to check the values.
echo '<pre>';
print_r($waveform_data);
echo '</pre>';

这种方法的好处是虽然https://wis.sndcdn.com/ URL很有用,但是没有人知道SoundCloud是否会改变来自它的数据的结构。从官方波形PNG中获取数据提供了一些长期稳定性,因为它们不会在没有公平警告SoundCloud API最终用户的情况下更改PNG图像。

另请注意,虽然$source_width为1800,但$source_height为140,因为SoundCloud PNG文件高280像素,下半部分基本上只是上半部分的翻转/镜像副本。因此,仅测量0到150的值将为您提供必要的波形数据值。

答案 3 :(得分:0)

很抱歉碰到一个旧帖子 - 以防万一你正在寻找类似的东西并且在这篇文章中发现:现在可以按照这个链接:Waveforms, Let's Talk About Them

这篇帖子发布后不久就发布了 - 所以再次为一个旧帖子道歉。

答案 4 :(得分:-1)

对不起,但是那种东西没有API。在soundcloud上,波形在上传时生成,数据被抛出。