2013-01-18 41 views
8

मैं एनएसपीएक्स का उपयोग करके रिकॉर्ड किए गए ऑडियो को एन्कोड करने की कोशिश कर रहा हूं और फिर इसे इंटरनेट पर स्थानांतरित कर सकता हूं और दूसरे छोर पर डीकोड कर सकता हूं। मैं यह सब विंडोज फोन 7/8 में कर रहा हूं। एन्कोड और डीकोड करने के लिए मैं निम्नलिखित कोड का उपयोग कर रहा हूं। लेकिन डीकोडिंग के दौरान मुझे परिणाम सही तरीके से वापस नहीं मिल रहा है जिसे मैं फिर से खेल सकता हूं। किसी को भी मुझे एन्कोडिंग और डिकोडिंग कोड जो WP7/8 रिकॉर्ड किए गए ऑडियो पर चलाता है के साथ प्रदान कर सकते हैं:एनएसपीएक्स का उपयोग कर विंडोज फोन एन्कोडिंग और डिकोडिंग ऑडियो। डिकोडिंग के साथ समस्या है?

private static Microphone mic = Microphone.Default; 

     private static byte[] EncodeSpeech(byte[] buf, int len) 
     { 
      BandMode mode = GetBandMode(mic.SampleRate); 
      SpeexEncoder encoder = new SpeexEncoder(mode); 

      // set encoding quality to lowest (which will generate the smallest size in the fastest time) 
      encoder.Quality = 1; 
      int inDataSize = len/2; 

      // convert to short array 
      short[] data = new short[inDataSize]; 
      int sampleIndex = 0; 
      for (int index = 0; index < len; index += 2, sampleIndex++) 
      { 
       data[sampleIndex] = BitConverter.ToInt16(buf, index); 
      } 

      // note: the number of samples per frame must be a multiple of encoder.FrameSize 
      inDataSize = inDataSize - inDataSize % encoder.FrameSize; 
      var encodedData = new byte[len]; 
      int encodedBytes = encoder.Encode(data, 0, inDataSize, encodedData, 0, len); 
      if (encodedBytes != 0) 
      { 
       // each chunk is laid out as follows: 
       // | 4-byte total chunk size | 4-byte encoded buffer size | <encoded-bytes> | 
       byte[] inDataSizeBuf = BitConverter.GetBytes(inDataSize); 
       byte[] sizeBuf = BitConverter.GetBytes(encodedBytes + inDataSizeBuf.Length); 
       byte[] returnBuf = new byte[encodedBytes + sizeBuf.Length + inDataSizeBuf.Length]; 
       sizeBuf.CopyTo(returnBuf, 0); 
       inDataSizeBuf.CopyTo(returnBuf, sizeBuf.Length); 
       Array.Copy(encodedData, 0, returnBuf, sizeBuf.Length + inDataSizeBuf.Length, encodedBytes); 
       return returnBuf; 
      } 
      else 
       return buf; 
     } 


     private byte[] DecodeSpeech(byte[] buf) 
     { 
      BandMode mode = GetBandMode(mic.SampleRate); 
      SpeexDecoder decoder = new SpeexDecoder(mode); 

      byte[] inDataSizeBuf = new byte[4]; 
      byte[] sizeBuf = new byte[4]; 
      byte[] encodedBuf = new byte[buf.Length - 8]; 
      Array.Copy(buf, 0, sizeBuf, 0, 4); 
      Array.Copy(buf, 4, inDataSizeBuf, 0, 4); 
      Array.Copy(buf, 8, encodedBuf, 0, buf.Length - 8); 

      int inDataSize = BitConverter.ToInt32(inDataSizeBuf, 0); 
      int size = BitConverter.ToInt32(sizeBuf, 0); 
      short[] decodedBuf = new short[inDataSize]; 
      int decodedSize = decoder.Decode(encodedBuf, 0, encodedBuf.Length, decodedBuf, 0, false); 

      byte[] returnBuf = new byte[inDataSize * 2]; 
      for (int index = 0; index < decodedBuf.Length; index++) 
      { 
       byte[] temp = BitConverter.GetBytes(decodedBuf[index]); 
       Array.Copy(temp, 0, returnBuf, index * 2, 2); 
      } 

      return returnBuf; 
     } 


     private static BandMode GetBandMode(int sampleRate) 
     { 

      if (sampleRate <= 8000) 

       return BandMode.Narrow; 

      if (sampleRate <= 16000) 

       return BandMode.Wide; 

      return BandMode.UltraWide; 

     } 

उत्तर

0

मैं अपनी समस्या हो सकती है कि आप एक नया SpeexEncoder हर बार जब आप ऑडियो एन्कोड करने के लिए चाहते हैं Newing हैं लगता है। आपको इसे अपनी कक्षा के लिए सदस्य बनाने और इसे फिर से उपयोग करने का प्रयास करना चाहिए।

मैं Nspeex के लिए कोड को देखा मैंने देखा है कि SpeexEncoder का उपयोग करता है संकीर्ण बैंड के लिए NbEncoder। उस वर्ग में ऐसा लगता है कि यह एन्कोडिंग करने के क्रम में कुछ पिछले ऑडियो डेटा का इतिहास रखता है। इसका मतलब यह होना चाहिए कि एन्कोडर्स के विभिन्न उदाहरणों के लिए उत्पादन एक साथ नहीं होगा।

private static Microphone mic = Microphone.Default; 
private static SpeexEncoder encoder = CreateEncoder(); 

    private static SpeexEncoder CreateEncoder() 
    { 
     BandMode mode = GetBandMode(mic.SampleRate); 
     SpeexEncoder encoder = new SpeexEncoder(mode); 

     // set encoding quality to lowest (which will generate the smallest size in the fastest time) 
     encoder.Quality = 1; 
     return encoder; 
    } 

    private static byte[] EncodeSpeech(byte[] buf, int len) 
    { 
     int inDataSize = len/2; 

     ...