2012-05-09 24 views
5

Bir WAV dosyasının ses formatını dönüştürmede sorun yaşıyorum.Ses Biçiminin Dönüştürülmesi

benim mikrofondan ses kayıt am ve ses aşağıdaki biçimde kaydedilir: PCM_SIGNED 44100,0 Hz, 16 bit, mono-, 2 bayt/kare I Yukarıdaki biçimi dönüştürme için

, uLaw 8000,0 Hz, 8 bit, mono-, 1 bayt/kare

aşağıdaki kod kullanıyorum,

InputStream is = request.getInputStream(); 
      AudioInputStream ais = AudioSystem.getAudioInputStream(is); 
      AudioFormat oldFormat = ais.getFormat(); 
      AudioFormat newFormat = new AudioFormat(AudioFormat.Encoding.ULAW, 8000, 8, 1, 1, 8000, false) ; 
AudioInputStream lowResAIS = AudioSystem.getAudioInputStream(newFormat, ais); //Getting the below Exception on this line 

Ve aşağıdaki hata alıyorum,

java.lang.IllegalArgumentException: desteklenmeyen dönüşüm: ulaw 8000,0 Hz, 8 bit, mono-, 1 bayt/kare, küçük endian PCM_SIGNED 44100,0 Hz, 16 bit, mono, 2 bayt/çerçevesinden

Can birisi lütfen Bu sorunu çözmeme yardım et!

Teşekkürler!

cevap

3

documentation'a bir göz attınız mı? IllegalArgumentException - Dönüşüm #see #getTargetEncodings her sistem yeterli codec Sorduğunuz belirli biçimine dönüştürmeye yüklü olacak değil

(AudioFormat) desteklenmiyorsa:

Atar için. Seninki yaptığını varsaydın, ama istisna atıyor çünkü bu formata dönüşemiyor.

Belirli bir formata dayanarak, belirli bir formata dayanmadan, uygun bir formatın uygunluğunu kontrol etmek için getTargetEncodings'u kullanabilir ve daha sonra istediğiniz çıktı formatı mevcut değilse uygun işlemi gerçekleştirebilirsiniz (örn. Bir başkasına geri dönme, kullanıcıyı sunma bunun imkansız olduğuna dair geri bildirim ile, vb.).

+0

Hey Andrzej! Cevap için teşekkürler. Belgeleri kısmen geçtim. GetTargetEncodings() yöntemini şu şekilde kullandım: 'code' Kodlama [] encArr = AudioSystem.getTargetEncodings (oldFormat); \t \t \t \t için (int i = 0; i " + encArr [i]); \t \t \t \t} 'code' Ve şu çıktıyı var: 0 -> PCM_SIGNED 1 -> PCM_UNSIGNED 2 -> ALAW 3 -> uLaw, bu konuda söylenecek ne var? Teşekkürler!! –

+0

Yukarıdaki çıktıyı aldığımdan beri, sistemimin kod çözücülere ULAW formatına dönüştüğünü tahmin ediyorum. İstisna için diğer sebep ne olabilir? Herhangi bir fikir? –

+1

Örnekleme oranı veya bit sayısı gibi, dönüşümün başka bir yönünü desteklemeyebilir. Tamamen bu konuda değilim, ama "altörnekleme" olduğun gerçeği benim için bir bayrak kaldırıyor. (44100'den 8000'e kadar).Bu genellikle zor olur, çünkü 4000 ve 22050 Hz arasındaki frekanslara sahip veri bilgileri, verilerin dışında filtrelenmedikçe takma addır. Bu yüzden benim tahminim standart destekli bir dönüşüm değil. Ama bahse girerim, verdiğiniz verilere göre 44100 Hz ile ULAW'a dönüştürebilirsiniz. (En iyi tahminim.) –

0

Bu sınıf size yardımcı olabilir. Ben onu buldum here:

package uk.co.mmscomputing.sound; 

import java.io.*; 

public class CompressInputStream extends FilterInputStream{ 

    /* 
    Convert mono PCM byte stream into A-Law u-Law byte stream 

    static AudioFormat alawformat= new AudioFormat(AudioFormat.Encoding.ALAW,8000,8,1,1,8000,false); 
    static AudioFormat ulawformat= new AudioFormat(AudioFormat.Encoding.ULAW,8000,8,1,1,8000,false); 

    PCM 8000.0 Hz, 16 bit, mono, SIGNED, little-endian 
    static AudioFormat pcmformat = new AudioFormat(8000,16,1,true,false); 

    */ 

    static private Compressor alawcompressor=new ALawCompressor(); 
    static private Compressor ulawcompressor=new uLawCompressor(); 

    private Compressor compressor=null; 

    public CompressInputStream(InputStream in, boolean useALaw)throws IOException{ 
    super(in); 
    compressor=(useALaw)?alawcompressor:ulawcompressor; 
    } 

    public int read()throws IOException{ 
    throw new IOException(getClass().getName()+".read() :\n\tDo not support simple read()."); 
    } 

    public int read(byte[] b)throws IOException{ 
    return read(b,0,b.length); 
    } 

    public int read(byte[] b, int off, int len)throws IOException{ 
    int  i,sample; 
    byte[] inb; 

    inb=new byte[len<<1];   // get 16bit PCM data 
    len=in.read(inb); 
    if(len==-1){return -1;}; 

    i=0; 
    while(i<len){ 
     sample = (inb[i++]&0x00FF); 
     sample |= (inb[i++]<<8); 
     b[off++]=(byte)compressor.compress((short)sample); 
    } 
    return len>>1; 
    } 
} 

abstract class Compressor{ 
    protected abstract int compress(short sample);  
} 

/* 
    Mathematical Tools in Signal Processing with C++ and Java Simulations 
     by Willi-Hans Steeb 
      International School for Scientific Computing 
*/ 

class ALawCompressor extends Compressor{ 

    static final int cClip = 32635; 

    static final int[] ALawCompressTable ={ 
    1,1,2,2,3,3,3,3, 
    4,4,4,4,4,4,4,4, 
    5,5,5,5,5,5,5,5, 
    5,5,5,5,5,5,5,5, 
    6,6,6,6,6,6,6,6, 
    6,6,6,6,6,6,6,6, 
    6,6,6,6,6,6,6,6, 
    6,6,6,6,6,6,6,6, 
    7,7,7,7,7,7,7,7, 
    7,7,7,7,7,7,7,7, 
    7,7,7,7,7,7,7,7, 
    7,7,7,7,7,7,7,7, 
    7,7,7,7,7,7,7,7, 
    7,7,7,7,7,7,7,7, 
    7,7,7,7,7,7,7,7, 
    7,7,7,7,7,7,7,7 
    }; 

    protected int compress(short sample){ 
    int sign; 
    int exponent; 
    int mantissa; 
    int compressedByte; 

    sign = ((~sample) >> 8) & 0x80; 
    if(sign==0){ sample *= -1;} 
    if(sample > cClip){ sample = cClip; } 
    if(sample >= 256){ 
     exponent = ALawCompressTable[(sample >> 8) & 0x007F]; 
     mantissa = (sample >> (exponent + 3)) & 0x0F; 
     compressedByte = 0x007F & ((exponent << 4) | mantissa); 
    }else{ 
     compressedByte = 0x007F & (sample >> 4); 
    } 
    compressedByte ^= (sign^0x55); 
    return compressedByte; 
    } 
} 

class uLawCompressor extends Compressor{ 

    static final int cClip = 32635; 
    static final int cBias = 0x84; 

    int[] uLawCompressTable ={ 
    0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3, 
    4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, 
    5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 
    5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 
    6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 
    6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 
    6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 
    6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 
    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 
    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 
    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 
    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 
    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 
    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 
    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 
    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 
    }; 

    protected int compress(short sample){ 
    int sign; 
    int exponent; 
    int mantissa; 
    int compressedByte; 

    sign = (sample >> 8) & 0x80; 
    if(sign!=0){ sample *= -1;} 
    if(sample > cClip){ sample = cClip; } 
    sample += cBias; 

    exponent = uLawCompressTable[(sample >> 7) & 0x00FF]; 
    mantissa = (sample >> (exponent + 3)) & 0x0F; 
    compressedByte = ~(sign | (exponent << 4) | mantissa); 
    return compressedByte&0x000000FF; 
    } 
} 
+0

Bu ne yapar? Aşağıdaki hatayı bana yardımcı olacak mı? PCM_SIGNED 44100.0 Hz, 16 bit, mono, 2 bayt/kare, küçük-endian desteklenmeyen ' – trusktr

+0

formatını kullanmıyorum, ama' A-Law u-Law byte akışına mono PCM bayt akışını dönüştürdüğünü iddia ediyor ." Yapmaya çalıştığın şeye benziyor. Bu dönüşümün doğrudan Java'da desteklenmediği anlaşılıyor, kendi sıkıştırmanızı yapmalısınız (bu sınıfta olduğu gibi). – 11101101b

+1

Hatam, kullanılmakta olan bir veri hattını kullanamadığım için hata oluşturuyordu (bu nedenle hata yanıltıcıdır). Boncuk ses kütüphanesini kullanmak tüm sorunlarımı çözdü (http://beadsproject.net). – trusktr

İlgili konular