2016-11-08 2 views
1

J'essaie de parcourir un fichier wave et d'envoyer 20ms à chaque itération. En supposant que j'utilise un 8khz, 1 canal, 16bit fichier audio, j'ai le code ci-dessous à l'aide NAudio:Fichier Wave - traitement spécifique d'un bloc de données audio

WaveFileReader wHeader = new WaveFileReader(fullFileName); 

byte[] data = new byte[wHeader.Length]; 
int read = wHeader.Read(data, 0, data.Length); 
short[] sampleBuffer = new short[read/2]; 
short[] InpBuf; 

for (int i = 0; i < read; i += 2) 
{ 
InpBuf = new short[159]; //20ms? 

Buffer.BlockCopy(data, 0, sampleBuffer, 0, read); 
InpBuf = sampleBuffer; 

Process20(InpBuf); //Send 20ms of audio data which inside InpBuf 

} 

je peux voir que les données audio complète est à l'intérieur SampleBuffer maintenant (onde générée sinus) mais je ne peux pas diviser ces 20ms en InpBuf et je vois que InpBuf contient l'ensemble des données audio. Une fois que je comprendrai ce problème, je serai en mesure de passer à des formats audio stéréo et différents.

Toute aide est appréciée, merci.

Répondre

0

Le problème est lié à l'opération blockcopy

Buffer.BlockCopy(data, 0, sampleBuffer, 0, read); 

vous copiez le tampon ensemble d'entrée de démarrage à chaque fois que vous avez défini aucun décalage

voir BlockCopy documentation

+0

Merci. Quelle est la meilleure chose à faire ici? Est-ce que ce devrait être quelque chose comme ceci ou y at-il un autre moyen efficace? Code int offst = 0; pour (int i = 0; i

+0

c'est bon pour la première approche ... probablement il peut être ajusté un peu dès que vous êtes sûr qu'il fonctionne comme prévu – cristallo

+0

Malheureusement, cela amène un résultat très confus ... Mon les données audio d'origine sont à l'intérieur de 'byte [] data = new byte [wHeader.Length];' Quand je boucle les données audio, il ressemble à ceci: « for (int i = 0; i