2013-03-14 4 views
5

サードパーティライブラリを使用せずに.wavファイルをjavaで22050 khzから44100 khzにリサンプリングすることはできますか?サードパーティライブラリのないJavaリサンプル.wavサウンドファイル

おそらくAudioInputStreamを使用していますか?

編集:サードパーティライブラリがなければ、簡単には可能ではないので、リサンプラを行うにはサードパーティライブラリがありますか?

答えて

0

いいえ...隣接するサンプルから平均して計算された新しいサンプルを使って新しいwavファイルを書き込むことができます。原油、しかし多分それはあなたの目的のために十分である。

サードパーティのライブラリを受け入れる場合は、JSSRCが良い選択肢のようです。しかし、自分で.jarをビルドする必要があります。

1

オーディオの品質を向上させるかどうかにかかわらず、元のサンプルのサンプルを含む新しい.wavファイルを作成する必要があります。元のファイルの品質を維持したい場合は、すべてのサンプルを2回書き込むことができます。

しかし、品質を「向上させる」ためのアルゴリズムは非常に簡単です。3つの連続したサンプルを読み込み、それらの名前をa、b、cとしましょう。 zをaとbとの間の余分な出力サンプルとする。

z =(a + b)/ 2とします。ここで、bを(a + 2b + c)/ 4に置き換えます。 bの古い値を使ってzを計算することを忘れないでください!今度は、a、z、および新しいbを出力に書きます。

もう1つのサンプルを読み、それをdとしましょう。 (b + c)/ 2を使用して、次の余分な出力サンプルyを計算します。 bの古い値を使用します。 cを再計算し、(b + 2c + d)/ 4と等しくする。 bの新しい値とyを出力に書き出します。

あなたは推測を理解し、!EOFを読んで、繰り返すことができます。古い値を使用して計算し、新しい値を出力することを忘れないでください。

4

あなたは今、サードパーティのライブラリを受け入れているので、ここに私の提案は

であり私にとって、あなたはオーディオwavファイルをリサンプリングすることを可能にするサードパーティのライブラリの多くは、私の場合には、ある(そして、I最近使用されています)最も使いやすい第三者のライブラリはJave です。あなたがする必要があるのは、jarファイルだけです。他のライブラリのようなこれ以上面倒なインストールは

Javeは、あなたが与えられたビットレートとオーディオを再サンプリングすることができます

public void setSamplingRate(java.lang.Integer bitRate) 

という名前のメソッドを持っていません。

1

可能で、速く汚れています。ただ、javax.sound APIのいくつかのdigingを必要とします:

import java.io.File; 

import javax.sound.sampled.AudioFileFormat.Type; 
import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import com.sun.media.sound.WaveFileReader; 
import com.sun.media.sound.WaveFileWriter; 

public class Resample { 

public static void main(String[] argv) { 
    try { 
     File wavFile = new File("C:\\Temp\\test.wav"); 
     File dstFile = new File("C:\\Temp\\test_half.wav"); 
     WaveFileReader reader = new WaveFileReader(); 
     AudioInputStream audioIn = reader.getAudioInputStream(wavFile); 
     AudioFormat srcFormat = audioIn.getFormat(); 

     AudioFormat dstFormat = new AudioFormat(srcFormat.getEncoding(), 
       srcFormat.getSampleRate()/2, 
       srcFormat.getSampleSizeInBits(), 
       srcFormat.getChannels(), 
       srcFormat.getFrameSize(), 
       srcFormat.getFrameRate()/2, 
       srcFormat.isBigEndian()); 

     AudioInputStream convertedIn = AudioSystem.getAudioInputStream(dstFormat, audioIn); 

     WaveFileWriter writer = new WaveFileWriter(); 
     writer.write(convertedIn, Type.WAVE, dstFile); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 

} 

この短いハッキングの例では、ソースで指定されたファイルの半分のサンプルレートでコピーが作成されます。私はかなり自明だと思う。

+3

パッケージcom.sunは公式Java APIの一部ではありません。このプログラムは、さまざまなプラットフォームやバージョンで動作することは保証されていません。 http://www.oracle.com/technetwork/java/faq-sun-packages-142232.htmlを参照してください。 –

0

はい、AudioInputstreamを使用しています。あなたがここにいくつかのサンプルコードをキャッチすることができます:

http://www.jsresources.org/examples/SampleRateConverter.html

を情報は、もはやのJavaの新しいバージョンに関連していることを、Tritonius心配しないでください。* .wavファイルに固執している限り、サードパーティのライブラリを使用せずに、ネイティブJavaで再サンプリングできます。

また、Javaのオーディオに関する多くの質問には、このFAQが回答しています。それは最新ではないかもしれないが、情報の大部分はまだ関連している。

http://www.jsresources.org/faq.html