2012-05-18 25 views
2

我正在創建一個使用SoundCloud API來流動藝術家曲目的Web應用程序。我知道如何獲得波形PNG圖像(例如,http://w1.sndcdn.com/fxguEjG4ax6B_m.png),但實際上我需要某種波形數據(當歌曲中的音量很高,什麼時候音量較低?)。有沒有辦法檢索或派生原始SoundCloud API波形數據?

我沒有像LAME或類似的音頻庫,因爲我的虛擬主機不允許它。是否有可能

  1. 以某種方式直接從SoundCloud API獲取此數據。
  2. 使用PHP或JavaScript處理波形PNG圖像以檢索所需的數據? (並且可能有某種類型的庫可用於此類處理?)

回答

4

可以解析波形PNG圖像以將其轉換爲點陣列。這些圖像是垂直對稱的,爲了找到峯值,您只需檢查α值即可計算出圖像頂部有多少個不透明像素。這就是widgetNext SoundCloud的波形呈現方式。

在PHP中,您可以使用ImageMagickGD Graphics Library來讀取這些值,在Javascript中,可以將圖像放在畫布對象上,然後從那裏檢查圖像數據。我不會過多介紹這些細節,但是如果您遇到困難,您當然可以提出另一個問題。

-1

對不起,但沒有那種東西的API。在soundcloud上,波形是在上傳時生成的,並且數據被拋出。

0

對不起,碰到一箇舊的線程 - 以防萬一您正在尋找類似的東西,並在這篇文章中發現:現在可以按照此鏈接:Waveforms, Let's Talk About Them

這是在這個線程後不久發佈 - 所以再次道歉撞擊舊的。

6

Soundcloud開始提供浮點數,但它尚未正式發佈。只是一個小動作,當你有你的PNG:

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

更改 「W1」 由 「威斯康星」 和 「PNG」 由 「JSON」:

https://wis.sndcdn.com/XwA2iPEIVF8z_m.json 

你明白了!

1

雖然沒有官方的方式直接從SoundCloud API請求獲取原始波形數據,但是有一種方法可以在PHP中使用此方法來導出SoundCloud在非官方端點(類似於https://wis.sndcdn.com/XwA2iPEIVF8z_m.json之類)中顯示的完全相同的數據這樣的代碼。簡單地改變$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/網址是有用的,是沒有說服力如果/當SoundCloud會改變來自它的數據結構。從官方波形中獲取數據PNG提供了一些長期穩定性,因爲它們不會在沒有對SoundCloud API最終用戶進行公正警告的情況下更改該PNG圖像。

此外,請注意,雖然$source_width是1800,但$source_height是140,因爲雖然SoundCloud PNG文件是280像素高,但下半部分基本上只是上半部分的翻轉/鏡像副本。所以只需測量0到150的值就可以得到所需的波形數據值。

相關問題