Преобразование аудиоформата
У меня возникли проблемы с преобразованием аудиоформата файла WAV.
Я записываю звук с микрофона, и звук записывается в следующем формате: PCM_SIGNED 44100.0 Hz, 16 бит, моно, 2 байта / кадр
Я хочу преобразовать вышеуказанный формат в, ULAW 8000,0 Гц, 8 бит, моно, 1 байт / кадр
Я использую следующий код
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
и я получаю следующее ошибка,
java.ленг.IllegalArgumentException: неподдерживаемое преобразование: ULAW 8000,0 Гц, 8 бит, моно, 1 байт / кадр, от PCM_SIGNED 44100.0 Гц, 16 бит, моно, 2 байта / кадр, мало-endian
может кто-то пожалуйста, помогите мне решить эту проблему!!!
Спасибо за тонну!!!
2 ответов
вы взглянули на документация?
закидываем: IllegalArgumentException-если преобразование не поддерживается #см. #getTargetEncodings (AudioFormat)
Не в каждой системе будет установлено достаточно кодеков для преобразования в конкретный формат, который вы просили. Вы предположили, что ваш делает, но он бросает исключение, потому что он не может преобразоваться в этот формат.
можно использовать getTargetEncodings
чтобы проверить пригодность данного формата программно, не полагаясь на исключение, а затем может предпринять соответствующие действия, если нужный формат вывода недоступен (например, вернуться к другому, представить пользователю обратную связь, что это невозможно и т. д.).
этот класс может помочь вам. Я нашел его здесь:
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;
}
}