2017-04-11 1 views
2

J'apprends/je joue avec l'API Web Audio et c'est génial. J'ai du code qui analyse la FFT du flux audio et fait des calculs en temps réel. Il fonctionne dans le navigateur.PhantomJS analyse les données FFT du fichier mp3 et enregistrez-le

Mais maintenant je dois faire la même chose, mais traiter l'ensemble du fichier audio et obtenir un tableau de données, au lieu de le jouer et analyser en temps réel, et le meilleur des cas dans Phantomjs. S'il est impossible, votre navigateur est compatible aussi ..

Exemple de code:

var audioElement = document.getElementById("player"); 
var audioContext = new AudioContext(); 
var source = audioContext.createMediaElementSource(audioElement); 

analyserNode = audioContext.createAnalyser(); 
analyserNode.fftSize = 2048; 

source.connect(analyserNode); 
source.connect(audioContext.destination); 

analyserNode.connect(audioContext.destination); 

et la fonction boucle:

var freqByteData = new Uint8Array(analyserNode.frequencyBinCount); 
analyserNode.getByteFrequencyData(freqByteData); 
//do processing FFT data 

Maintenant je dois charger un fichier mp3, et traiter une fonction en boucle pour obtenir un tableau de données de résultats. Donc, ne pas attendre pendant le jeu, mais le traiter immédiatement.

Le problème est que je n'ai jamais essayé les fantômes. J'ai besoin de résultats exacts comme le fait le navigateur, aussi j'utilise les algorithNode.smoothingTimeConstant dans mes calculs. L'exigence est d'obtenir des données 30 fois par seconde.

Si c'est possible, comment réécrire ce code et l'exécuter comme ./phantomapp file.mp3 qui enregistre des données dans un fichier txt ou stdout?

Si ce n'est pas possible avec phantomjs, comment adopter ce code pour fonctionner dans le navigateur?

Merci

+0

PhantomJS ne prend pas en charge l'audio et la vidéo actuellement. Peut-être jeter un oeil à Electron et/ou NW.js? – Vaviloff

+0

Donc, vous êtes serveur côté droit? Commencez par décompresser votre mp3 en wav cru grâce à ffmpeg. Ensuite, l'analyse de ce wav brut est plus facile. Quelques paquets de noeuds: https://www.npmjs.com/browse/keyword/fft – Kaiido

Répondre

2

Il y a un projet sur Github: https://github.com/sebpiq/node-web-audio-api

qui revendique "la mise en œuvre Node.js de l'API Web Audio".

Attention: "Et ce n'est même pas alpha, utilisez cette librairie uniquement si vous êtes aventureux."

Voici une question liée SO: Why Web Audio API isn't supported in nodejs?

+0

Merci. J'ai compris que ce n'est pas possible avec nodejs. J'ai mis à jour ma question et ai changé nodejs en phantomjs comme exigence. – Ural

0

Je ne sais rien au sujet de PhantomJS, mais si vous pouvez charger tout le fichier en mémoire à l'aide decodeAudioData, vous pouvez utiliser un OfflineAudioContext pour traiter le fichier. Cela fonctionnera aussi vite que possible. Utilisez OfflineAudioContext.suspend(time) pour arrêter le traitement afin que vous puissiez appeler AnalyserNode.getByteFrequencyData(freqByteData) au bon moment pour obtenir vos données de fréquence. Puis planifier une suspension à un moment approprié, et resume() de cette suspension.