L'enregistrement d'un fichier wav à partir de l'entrée mic Android - problèmes
J'ai besoin d'être en mesure de créer un fichier WAV en utilisant le micro dans Android. Actuellement, je vais avoir beaucoup de mal. Jusqu'à présent, c'est ma situation. Je suis en utilisant des pièces de la micDroid projet de code d'enregistrement ainsi:
//read thread
int sampleRate = 44100;
int bufferSize = AudioRecord.getMinBufferSize(sampleRate,android.media.AudioFormat.CHANNEL_CONFIGURATION_MONO,android.media.AudioFormat.ENCODING_PCM_16BIT);
AudioRecord ar = new AudioRecord(AudioSource.MIC,sampleRate,android.media.AudioFormat.CHANNEL_CONFIGURATION_MONO,android.media.AudioFormat.ENCODING_PCM_16BIT,bufferSize);
short[] buffer = new short[bufferSize];
ar.startRecording();
while(isRunning){
try{
int numSamples = ar.read(buffer, 0, buffer.length);
queue.put(new Sample(buffer, numSamples));
} catch (InterruptedException e){
e.printStackTrace();
}
}
//write thread
int sampleRate = 44100;
WaveWriter writer = new WaveWriter("/sdcard","recOut.wav",sampleRate,android.media.AudioFormat.CHANNEL_CONFIGURATION_MONO,android.media.AudioFormat.ENCODING_PCM_16BIT);
try {
writer.createWaveFile();
} catch (IOException e) {
e.printStackTrace();
}
while(isRunning){
try {
Sample sample = queue.take();
writer.write(sample.buffer, sample.bufferSize);
} catch (IOException e) {
//snip
}
}
Qui semble fonctionner bien, mais le résultat final reconnaissable, contient tout ce que j'ai dit, mais c'est horriblement déformé. Voici une capture d'écran de l'audace (WMP refuse de jouer le fichier).
Toute aide serait grandement appréciée, laissez-moi savoir si vous avez besoin de plus de code /info.
Mise à jour
Suivantes markus suggestions, voici mon code mis à jour:
int sampleRate = 16000;
writer = new WaveWriter("/sdcard","recOut.wav",sampleRate,android.media.AudioFormat.CHANNEL_IN_MONO,android.media.AudioFormat.ENCODING_PCM_16BIT);
int bufferSize = AudioRecord.getMinBufferSize(sampleRate,android.media.AudioFormat.CHANNEL_IN_MONO,android.media.AudioFormat.ENCODING_PCM_16BIT);
AudioRecord ar = new AudioRecord(AudioSource.MIC,sampleRate,android.media.AudioFormat.CHANNEL_IN_MONO,android.media.AudioFormat.ENCODING_PCM_16BIT,bufferSize);
byte[] buffer = new byte[bufferSize]; //all references changed from short to byte type
...et une autre audace screencap:
OriginalL'auteur fredley | 2010-12-15
Vous devez vous connecter pour publier un commentaire.
CHANNEL_CONFIGURATION_MONO est obsolète pour autant que je sache, utilisez CHANNEL_IN_MONO. pensez regarder rehearsalassistant projet, autant que je sache, ils utilisent AudioRecord classe, trop. taux d'échantillonage doit être choisi de façon à s'adapter à la norme de taux d'échantillonnage, comme expliqué dans ce article de wikipedia.
ne sais pas, essayez un peu. mon code a travaillé avec 16 khz joliment. je n'ai pas essayer quoi que ce soit entre 16 khz - 22 khz, parce 16 khz a été assez pour moi.
Pas de chance avec cela, voir mise à jour et screencap...
Merci, je vais lui donner un aller.
ça fonctionne maintenant?
OriginalL'auteur mad
Vous pouvez définir un tampon à little-endian en utilisant les éléments suivants:
OriginalL'auteur netdragon
J'ai beaucoup de théories:
si pas de file d'attente de vérification.mettre et la file d'attente.prendre je pense que vous n'en avez pas besoin car vous avez stocké vos fichiers audio en gamme et c'est assez. Dans le premier, tandis que je voudrais remplacer la file d'attente.mis en fonction pour stocker la mémoire tampon dans un immense tableau d'octets avec tous les octets. Ensuite, vous pouvez mettre l'en-tête de la wav.
Rappelez-vous un wav a la tête et les octets de l'audio, vous avez peut-être oublié l'en-tête et le programme que vous utilisez est en train d'inventer un en-tête pour jouer.
L'autre option est la suivante: vous avez le problème sur les fichiers wav en-tête de 44 octets. vérifiez votre WaveWriter fonction. si vous écrivez un mauvais code, vous pouvez entendre beaucoup de différents sons de votre voix.
note: j'avais vu la fonction WaveWriter ou similaire sur le code source d'android, mais il n'avait pas été prêt à l'utiliser il y a trois mois. Quelques nouvelles à propos de waveheader?
OriginalL'auteur somebody
C'est assez clair, Audacity pense que votre fichier est en virgule flottante.
Le WAV en-tête est vissée ou d'autre, c'est comment vous l'avez ouvert.
Faire un enregistrement.
Dans Audacity, de l'ouvrir à l'aide Projet /Importer des Données Brutes
Définir les paramètres de la façon dont vous pensez que vous l'avez enregistré.
Je parie qu'il joue arrière ok.
OriginalL'auteur Renate