Comment puis-je tirer des données audio à partir de mon fichier wav?
Tout d'abord c'est pour les devoirs ou... de projet.
Je vais avoir du mal à comprendre l'idée derrière la façon de dessiner les données du son des vagues sur un graphique en Java pour un projet.
Je dois faire ce travail entièrement à partir de zéro avec une INTERFACE utilisateur et tout donc en gros, faire un .wav fichier de l'éditeur.
La principale question que je vais avoir est d'obtenir les données audio dans le graphe d'être dessiné. Actuellement, j'ai généré de façon aléatoire une matrice de valeurs, juste être établi dès maintenant.
Pour l'instant j'ai un mini-programme en cours d'exécution et à la validation du fichier wav vraiment être un fichier wav.
Je suis en train de lire avec un FileInputStream et de la validation: le RIFF octets(0-3), FileLength(4-7), VAGUE octets(8-11), puis le format de morceau format(à partir de la fin du RIFF morceau; et le positionnement de l'index à la fin de celui-ci et de donner le format de 0 à 3, longueur de format de bloc de 4 à 7, puis les 16 octets pour toutes les spécifications de la vague de fichiers et le stockage de celles de leurs variables nommées.
Une fois que je reçois pour le segment de DONNÉES et sa longueur un passé toutes mes données audio et c'est ce que je ne suis pas sûr de la façon de stocker chaque octet de données audio ou même de le traduire à la valeur qui est liée à l'amplitude du son. Je pensais que la validation a été similaire de sorte qu'il serait le même, mais elle ne semble pas être de cette façon... ou alors j'ai compliqué un truc super simple, depuis que j'ai commencé à regarder cette depuis quelques jours maintenant.
Toute aide est très appréciée grâce.
- fermer les doublons: stackoverflow.com/questions/11017283/...
- Êtes-vous autorisé à utiliser Java API Sound pour ce devoirs? D'accord avec @Denis, cela semble un doublon.
- Vous pouvez prendre un coup d'oeil à stackoverflow.com/questions/12066698/... ou stackoverflow.com/questions/12035799/...
- "la valeur qui est liée à l'amplitude du son." C'est un concept difficile à transmettre, mais la le son amplitude ne vient jamais de groupes des valeurs de l'échantillon. Si toutes les valeurs de l'échantillon ont été " 128 "l'individu de l'échantillon de valeurs que peut impliquer plein volume" pourtant, le résultat serait le silence le plus complet.
- oui, je suis autorisé à utiliser quoi que ce soit. mais le professeur nous a dit, comme à chaque échantillon sera pratiquement un tableau de l'index et la valeur va être son amplitude qui avait plus de nous confondre, je ai fait cela pendant 36 heures non-stop et se sentait comme je n'ai pas encore vu l'herbe à l'extérieur pour une semaine. merci beaucoup jusqu'à présent pour tous les conseils et les liens de tout le monde, je pense que je devrais en avoir assez pour le comprendre, à bientôt. Je pense que @AndrewThompson votre explication est plus claire. je ne savais pas de fichier wave échantillons sonores des groupes.
- "je suis autorisé à utiliser n'importe quoi" Alors vous allez certainement vouloir vérifier Java sound.
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas un programmeur Java, mais je sais un peu juste sur le rendu audio j'espère donc que la suite peut-être d'un peu d'aide...
Donné que vous aurez presque toujours avoir un beaucoup plus grand nombre d'échantillons de pixels disponibles la meilleure chose à faire serait de dessiner à partir d'une mise en cache de réduction ou de "résumé" de l'échantillon de données. C'est généralement la façon dont les éditeurs audio (tels que Audacity) de rendre les données audio. En fait la stratégie la plus courante consiste à calculer le nombre d'échantillons par pixel, puis de trouver le maximum et le minimum des échantillons pour chaque bloc de taille
SamplesPerPixel
, puis tracez une ligne verticale entre chaque max-min paire. Vous pourriez cache cette réduction, ou peut-être une série de réductions pour différents niveaux de zoom. L'audace des caches pour les fichiers temporaires ('bloquer les fichiers') sur le disque.Ci-dessus n'est peut-être quelque chose d'une simplification excessive, cependant, parce que dans la réalité, vous voulez calculer l'initiale max-min paires à partir d'un bloc de taille fixe - dire 256 échantillons plutôt que de partir d'une taille
SamplesPerPixel
. Ensuite, vous pouvez calculer plus "à la volée" des réductions à partir de cette mise en cache de réduction. Le point est queSamplesPerPixel
s'agit d'une dynamique à la quantité, car l'utilisateur peut redimensionner la zone de travail à tout moment (l'espoir qui fait sens...).Rappelez-vous aussi que lorsque vous dessinez sur votre toile, vous aurez besoin à l'échelle les valeurs de l'échantillon par la largeur et la hauteur de la toile. La meilleure façon de le faire (dans le sens vertical, au moins) est de normaliser les échantillons, puis multiplier par la toile en hauteur. 16-bit audio se compose d'échantillons dans la gamme [-32768, 32767], afin de normaliser il suffit de faire une division flottante par 32768. Puis d'inverser le signe (pour inverser la forme d'onde de la toile coordonnées), ajouter 1 (pour compenser pour les valeurs négatives) et de le multiplier par la moitié la toile hauteur. C'est comment je fais, de toute façon.
Cette page montre comment construire un rudimentaire affichage de forme d'onde avec Java Swing. Je n'ai pas regardé en détail, mais je pense qu'il downsamples les données, plutôt que le calcul du max-min paires. Ce sera, bien sûr, de ne pas fournir aussi précis que la réduction de la max-min de la méthode, mais il est plus facile à calculer.
Si vous voulez savoir comment faire les choses correctement, vous devez creuser dans le code source d'Audacity (être mis en garde, cependant - il est assez ardu C++). Pour obtenir un aperçu général vous pourriez regarder "Un Rapide Structure de Données pour les Disques à Base de Montage Audio', par l'auteur original de l'Audace, Dominic Mazzoni. Vous aurez besoin d'acheter que de CMJ, cependant.
Pour des fichiers WAV standard, il est en fait assez facile. Une fois que vous avez passé les en-têtes, vous venez d'interpréter tous les 16 bits comme un complément à deux entier. Je vous recommande d'utiliser un DataInputStream, depuis lors, c'est aussi simple que d'appeler readShort().
Ce sont les valeurs d'amplitude à chaque point de l'échantillon. Vous pouvez faire des moyennes ou quelque chose, parce que la plupart du temps il n'y aura plus de façon échantillons de pixels horizontaux. En essayant de tracer tous les échantillons sur une sorte de ligne graphique peut ne pas être le meilleur moyen.
Première chose que vous devez faire est de lire les données brutes. L'écriture d'un fichier Wav analyseur n'est pas trop dur, mais vous pouvez également utiliser le javasound API. Il y a quelques grands conseils sur et exemple de code pour l'utilisation de cette api ici:
http://www.jsresources.org/
Si vous souhaitez écrire votre propre analyseur, vous pouvez commencer ici:
https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
Une fois que vous avez les données brutes, vous pouvez l'afficher en fonction du temps. Ceci est appelé la forme d'onde.
Toutefois, l'affichage de la forme d'onde est beaucoup de temps lorsque l'utilisateur a "zoom" sur un lot de données: une heure vaut la peine de données peut prendre beaucoup de temps pour rendre de cette manière. La plupart des applications, par conséquent, précalculer les quelques données pour faire le dessin le zoom de données plus rapide. La "bonne" façon de le faire est comme suit:
Quand je dis "correct", je veux dire, c'est ce que tout le monde le fait, alors il en résulte un affichage qui ressemble à ce que les gens attendent. Si vous faites quelque chose de différent (par exemple, le calcul de journaux ou de moyenne au lieu de chercher la crête), vous obtiendrez quelque chose qui ne regarde pas à droite, comme cet homme a découvert:
dessin de la forme d'onde de conversion de la DB courges il