2012-05-09 13 views
5

WAVファイルのオーディオ形式の変換に問題があります。オーディオ形式の変換

私はマイクからの音を録音してい音が次の形式で記録されている: PCM_SIGNED 44100.0ヘルツ、16ビット、モノラル、2バイト/フレーム私は上記の形式を変換したい

、 ULAW 8000.0 Hzの、8ビット、モノラル、1バイト/フレーム

Iは、

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 

を次のコードを使用していると私は

0、次のエラーを取得してい

java.lang.IllegalArgumentExceptionが:サポートされていない変換:ULAW 8000.0 Hzの、8ビット、モノラル、1バイト/フレーム、リトルエンディアンPCM_SIGNED 44100.0ヘルツ、16ビット、モノラル、2バイト/フレーム、から

ことができる誰かください私はこの問題を解決するのに役立ちます!

ありがとうございました!

答えて

3

documentationを見ましたか?

を例外: 例外:IllegalArgumentException - 変換が#see #getTargetEncodings(のAudioFormat)

がサポートされていない場合、すべてのシステムは、あなたが求めてきました特定のフォーマットに変換するために十分なコーデックがインストールされているわけではありませんために。あなたはあなたのことを前提としていますが、その形式に変換できないため例外がスローされています。

getTargetEncodingsを使用すると、例外に頼ることなくプログラマチックに特定のフォーマットの適合性をチェックし、出力フォーマットが利用できないようにすることができます(たとえば、これが不可能であるというフィードバックを持つなど)。

+0

Hey Andrzej!返信いただきありがとうございます。私は部分的にドキュメントを通過しました。私は次のような方法でgetTargetEncodings()メソッドを使用しました。Encoding [] encArr = AudioSystem.getTargetEncodings(oldFormat); \t \t \t \t がため(INT i = 0; iは" + encArr [I])。 \t \t \t \t} 'code'と私は次の出力ました:0 - > PCM_SIGNED 1 - > PCM_UNSIGNED 2 - > ALAW 3 - > ULAW、何をこれについて言っているのですか?ありがとう!! –

+0

私は上記の出力を得ているので、私のシステムはULAWフォーマットに変換するコーデックを持っています。私は推測しています。例外のもう一つの理由は何でしょうか?何か案が? –

+1

サンプルレートやビット数など、変換の他の側面をサポートしていない可能性があります。私は完全にはこれではないが、あなたが "ダウンサンプリング"しているという事実は、私のために旗を掲げる。 (44100から8000へ)。これは、データからフィルタリングしない限り、4000〜22050Hzの周波数を持つデータ情報がエイリアスとなるため、通常は扱いにくいものです。だから私の推測は標準的な変換をサポートしていないということです。しかし、私はあなたの出力を与えられた44100 HzのULAWに変換できると確信しています。 (私の最高の推測。) –

0

このクラスはあなたを助けるかもしれません。私はそれを見つけた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

それは何をしますか?それは次のエラーで私を助けますか? 'PCM_SIGNED形式の行44100.0Hz、16ビット、モノ、2バイト/フレーム、リトルエンディアンはサポートされていません ' – trusktr

+0

私はそれを使用しませんでしたが、"モノPCMバイトストリームをA-Lawのu-Lawバイトストリーム"それはあなたがしようとしているように見えます。この変換はJavaで直接サポートされていないようですが、独自の圧縮を行う必要があります(このクラスのように)。 – 11101101b

+1

私のエラーは、すでに使用されていたデータラインを使用できなかったためです(誤解を招くように)。 Beadsのサウンドライブラリを使用すると、私のすべての問題(http://beadsproject.net)が解決されました。 – trusktr

関連する問題