2013-04-26 35 views
2

我正在用webgl創建音頻可視化工具,並且已經整合了soundcloud音軌。我想不能切換曲目,但是我可以讓我的可視化工具工作,並打破音頻,或者我可以讓音頻工作和可視化工具打破。打開音頻開關的鉻音頻分析儀

兩種方式,我已經能夠使它工作的

音頻工作

  1. 刪除音頻元素
  2. 新的音頻元素追加到身體
  3. 觸發玩

Vi sualizer工作

  1. 停止音頻
  2. 變化源
  3. 觸發播放

當我有可視化的工作,音頻完全搞砸了。緩衝區聽起來不對,音頻中有人造物(噪聲,嗶嗶聲和爆炸聲)。

當我有音頻工作,當我打電話analyser.getByteFrequencyData,我得到一個0的數組。我想這是因爲分析儀沒有正確連接。

的音頻使用的代碼看起來像

$('#music').trigger("pause"); 
currentTrackNum = currentTrackNum + 1; 
var tracks = $("#tracks").data("tracks") 
var currentTrack = tracks[parseInt(currentTrackNum)%tracks.length]; 
// Begin audio switching 
analyser.disconnect(); 
$('#music').remove(); 
$('body').append('<audio id="music" preload="auto" src="'+ currentTrack["download"].toString() + '?client_id=4c6187aeda01c8ad86e556555621074f"></audio>'); 
startWebAudio(), 

(我不認爲我需要pause電話。難道我?)

當我想可視化的工作,我用這代碼

currentTrackNum = currentTrackNum + 1; 
var tracks = $("#tracks").data("tracks") 
var currentTrack = tracks[parseInt(currentTrackNum)%tracks.length]; 
// Begin audio switching 
$("#music").attr("src", currentTrack["download"].toString() + "?client_id=4c6187aeda01c8ad86e556555621074f"); 
$("#songTitle").text(currentTrack["title"]); 
$('#music').trigger("play"); 

startWebAudio函數看起來像這樣。

function startWebAudio() { 
    // Get our <audio> element 
    var audio = document.getElementById('music'); 
    // Create a new audio context (that allows us to do all the Web Audio stuff) 
    var audioContext = new webkitAudioContext(); 
    // Create a new analyser 
    analyser = audioContext.createAnalyser(); 
    // Create a new audio source from the <audio> element 
    var source = audioContext.createMediaElementSource(audio); 
    // Connect up the output from the audio source to the input of the analyser 
    source.connect(analyser); 
    // Connect up the audio output of the analyser to the audioContext destination i.e. the speakers (The analyser takes the output of the <audio> element and swallows it. If we want to hear the sound of the <audio> element then we need to re-route the analyser's output to the speakers) 
    analyser.connect(audioContext.destination); 

    // Get the <audio> element started 
    audio.play(); 
    var freqByteData = new Uint8Array(analyser.frequencyBinCount); 
} 

我懷疑是分析儀沒有勾搭上了正確的,但我想不出來看看弄明白什麼。我看過frequencyByteData的輸出結果,這似乎表明某些東西沒有正確連接。 analyser變量是全局變量。如果您想了解更多的參考代碼,這裏的where it is on github

回答

1

只能創建每個窗口的單一AudioContext。完成使用後,您還應該斷開MediaElementSource

下面是我用來回答類似問題的示例:http://jsbin.com/acolet/1/