2011-10-14 7 views
7

Estoy usando Speex para codificar los datos brutos, pero después de decodificar los datos el audio se reproduce a un ritmo más rápido porque te hace sonar como una ardilla. Estoy usando NSpeex y Silverlight 4.Silverlight Speex reproduciendo a velocidad rápida

8kHz Sampling

función de codificación:

JSpeexEnc encoder = new JSpeexEnc(); 
    int rawDataSize = 0; 
    public byte[] EncodeAudio(byte[] rawData) 
    { 
     var encoder = new SpeexEncoder(BandMode.Narrow); 
     var inDataSize = rawData.Length/2; 
     var inData = new short[inDataSize]; 

     for (var index = 0; index < rawData.Length; index += 2) 
     { 
      inData[index/2] = BitConverter.ToInt16(rawData, index); 
     } 
     inDataSize = inDataSize - inDataSize % encoder.FrameSize; 

     var encodedData = new byte[rawData.Length]; 
     var encodedBytes = encoder.Encode(inData, 0, inDataSize, encodedData, 0, encodedData.Length); 

     byte[] encodedAudioData = null; 
     if (encodedBytes != 0) 
     { 
      encodedAudioData = new byte[encodedBytes]; 
      Array.Copy(encodedData, 0, encodedAudioData, 0, encodedBytes); 
     } 
     rawDataSize = inDataSize; // Count of encoded shorts, for debugging 
     return encodedAudioData; 
    } 

decodificación Función:

SpeexDecoder decoder = new SpeexDecoder(BandMode.Narrow); 
    public byte[] Decode(byte[] encodedData) 
    { 
     try 
     { 
      short[] decodedFrame = new short[8000]; // should be the same number of samples as on the capturing side 
      int decoderBytes = decoder.Decode(encodedData, 0, encodedData.Length, decodedFrame, 0, false); 

      byte[] decodedData = new byte[encodedData.Length]; 
      byte[] decodedAudioData = null; 

      decodedAudioData = new byte[decoderBytes * 2]; 
      for (int shortIndex = 0, byteIndex = 0; byteIndex < decoderBytes; shortIndex++) 
      { 
       BitConverter.GetBytes(decodedFrame[shortIndex + byteIndex]).CopyTo(decodedAudioData, byteIndex * 2); 
       byteIndex++; 
      } 

      // todo: do something with the decoded data 
      return decodedAudioData; 
     } 
     catch (Exception ex) 
     { 
      ShowMessageBox(ex.Message.ToString()); 
      return null; 
     } 

    } 

Reproducción de audio:

void PlayWave(byte[] PCMBytes) 
    { 
     byte[] decodedBuffer = Decode(PCMBytes); 
     MemoryStream ms_PCM = new MemoryStream(decodedBuffer); 
     MemoryStream ms_Wave = new MemoryStream(); 

     _pcm.SavePcmToWav(ms_PCM, ms_Wave, 16, 8000, 1); 

     WaveMediaStreamSource WaveStream = new WaveMediaStreamSource(ms_Wave); 
     mediaElement1.SetSource(WaveStream); 
     mediaElement1.Play(); 
    } 
+0

No es claro cuál es la pregunta. ¿Podrías por favor editar tu pregunta? – gioele

+0

¿Puedes agregar la fuente de tu método 'SavePcmToWav'? Si el archivo WAV resultante de alguna manera tiene una frecuencia de muestreo de 44.1kHz en lugar de 8kHz, eso produciría el sonido de la ardilla (que es la información de audio que se reproduce demasiado rápido). – MusiGenesis

Respuesta

0

Lo siento muchachos por la respuesta tardía, pero descubrí cuál era el problema.

Dentro de mi función de decodificación recorro la matriz decodificada short pero solo estoy copiando la mitad de los bytes en mi nueva matriz byte.

Tiene que ser algo como esto:

decodedAudioData = new byte[decoderBytes * 2]; 
for (int shortIndex = 0, byteIndex = 0; shortIndex < decodedFrame.Length; shortIndex++, byteIndex += 2) 
{ 
    byte[] temp = BitConverter.GetBytes(decodedFrame[shortIndex]); 
    decodedAudioData[byteIndex] = temp[0]; 
    decodedAudioData[byteIndex + 1] = temp[1]; 
} 
Cuestiones relacionadas