Zuerst werde ich mein Problem beschreiben, ich bin eine automatische Wiedergabeliste aus zufälligen Songs erstellen, einige der Lieder 10-15 Sekunden Stille am Ende des Songs haben, was ich versuche zu erreichen ist von erkennen der Analysator, wenn ein Lied für 5 Sekunden still war und darauf reagieren.Wie kann ich einen aus einem audioContext erstellten Analysator verwenden, um zu erkennen, ob ein Spielgeräusch hörbar ist?
Bisher habe ich dies bekommt:
var context, analyser, source, audio;
context = new (window.AudioContext || window.webkitAudioContext)();
analyser = context.createAnalyser();
audio = new Audio();
source = context.createMediaElementSource(audio)
source.connect(analyser);
analyser.connect(context.destination);
var playNext = function() {
var pickedSong;
// chooses a song from an api with several
// thousands of songs and store it in pickedSong
audio.src = pickedSong;
audio.play();
}
audio.addEventListener('ended', playNext);
playNext();
Ich weiß die Antwort irgendwo im Analysator ist, aber ich habe keine Kohärenz in den zurückgegebenen Daten aus Ihm gefunden.
ich etwas tun kann:
var frequencies = new Float32Array(analyser.frequencyBinCount);
analyser.getFloatFrequencyData(frequencies);
und die Frequenzen var 2048 Tasten jeweils mit einem zufälligen (für mich) Zahl enthalten würde (-48,11, -55, -67, etc ...) Bedeuten diese Zahlen etwas, das mit dem wahrgenommenen Klang zusammenhängt? Wie kann ich erkennen, ob es so niedrig ist, dass die Leute denken, dass nichts spielt?
Für den Nachweis möchte ich in erster Linie etwas wie folgt aus:
var isInSilence = function(){
return !audible;
}
var tries = 0;
var checker = function() {
tries = isInSilence() ? tries + 1 : 0;
if(tries >= 5) playNext();
setTimeout(checker, 1000);
}
checker();
Der einzige fehlende Teil Erfassen, wenn der Song zur Zeit still ist oder nicht, jede mögliche Hilfe würde geschätzt.
Edit:
basierend auf william Antwort ich es geschafft, es zu lösen, indem es auf diese Weise tun:
var context, compressor, gain, source, audio;
context = new (window.AudioContext || window.webkitAudioContext)();
compressor = context.createDynamicsCompressor();
gain = context.createGain();
audio = new Audio();
source = context.createMediaElementSource(audio)
// Connecting source directly
source.connect(context.destination);
// Connecting source the the compresor -> muted gain
source.connect(compressor);
compressor.connect(gain);
gain.connect(context.destination);
gain.gain.value = 0; // muting the gain
compressor.threshold.value = -100;
var playNext = function() {
var pickedSong;
// chooses a song from an api with several
// thousands of songs and store it in pickedSong
audio.src = pickedSong;
audio.play();
}
audio.addEventListener('ended', playNext);
playNext();
var isInSilence = function(){
return compressor.reduction.value >= -50;
}
var tries = 0;
var checker = function() {
tries = isInSilence() ? tries + 1 : 0;
if(tries >= 5) playNext();
setTimeout(checker, 1000);
}
checker();
Sie können ctx.source.stop (0) oder so ähnlich verwenden – Akxe
context.source ist undefined –
Sie können http://toys.eise.cz/Equaliser versuchen, gibt es Funktionsstopp, der die Musik stoppt versuche es dort zu finden, wenn du versagst Ich werde versuchen, es mir selbst zu besorgen – Akxe