2011-07-11 51 views
6

NAudioを使ってWAVファイルを8KHzと8bitに変更したい。NAudioを使ってwavファイルを(16KHzと8bitに)変更する

  WaveFormat format1 = new WaveFormat(8000, 8, 1); 
      byte[] waveByte = HelperClass.ReadFully(File.OpenRead(wavFile)); 
      Wave 
      using (WaveFileWriter writer = new WaveFileWriter(outputFile, format1)) 
      { 
       writer.WriteData(waveByte, 0, waveByte.Length); 
      } 

出力ファイルを再生すると、音が鳴りません。コードが正しいのか、何が間違っていますか?

WaveFormatをWaveFormat(44100,16、1)に設定すると、正常に動作します。

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

答えて

13

いくつかのポインタ:

  • あなたが実際に別のサンプルレート/ビット深度から変換するにはWaveFormatConversionStreamを使用する必要があります - あなただけの間違った波の形式を使用して新しいファイルに元のオーディオを入れています。
  • また、サンプルレートを変更してから、ビット深度/チャンネル数を変更する2つの手順で変換する必要があります。これは、基盤となるACMコーデックでは、1ステップで必要な変換を常に実行できるわけではないためです。
  • WaveFileReaderを使用して入力ファイルを読み込む必要があります。ファイルの実際のオーディオデータ部分のみを変換したいのですが、現在、RIFFチャンクを含むすべてのものをオーディオデータであるかのように新しいファイルにコピーしています。
  • 8ビットのPCMオーディオは通常恐ろしい音です。 16ビットを使用するか、8ビットを使用する必要がある場合は、G.711 u-lawまたはa-lawを使用してください。
  • オーディオをダウンサンプリングするとエイリアシングが発生する可能性があります。それをうまく行うには、まずローパスフィルターを実装する必要があります。これは残念ながら簡単ではありませんが、特定のダウンサンプリングのためのチェビシェフローパスフィルタの係数を生成するのに役立つサイトがあります。

ここでは、あるフォーマットから別のフォーマットへの変換方法を示すコードの例を示します。あなたは、入力ファイルの形式に応じて、複数のステップで変換を行うために必要がある場合がありますことを忘れないでください:

using (var reader = new WaveFileReader("input.wav")) 
{ 
    var newFormat = new WaveFormat(8000, 16, 1); 
    using (var conversionStream = new WaveFormatConversionStream(newFormat, reader)) 
    { 
     WaveFileWriter.CreateWaveFile("output.wav", conversionStream); 
    } 
} 
3

次のコードは、WAVファイルにVOXファイル拡張子をG.711μ法を扱う私の問題を解決しました。私はWaveFileReaderを使用しているなら「No RIFF Header」エラーが出ていました。

FileStream fileStream = new FileStream(fileName, FileMode.Open); 
      var waveFormat = WaveFormat.CreateMuLawFormat(8000, 1); 
      var reader = new RawSourceWaveStream(fileStream, waveFormat); 
      using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)) 
      { 
       WaveFileWriter.CreateWaveFile(fileName.Replace("vox", "wav"), convertedStream); 
      } 
      fileStream.Close(); 
1
  openFileDialog openFileDialog = new openFileDialog(); 
      openFileDialog.Filter = "Wave Files (*.wav)|*.wav|All Files (*.*)|*.*"; 
      openFileDialog.FilterIndex = 1; 


      WaveFileReader reader = new NAudio.Wave.WaveFileReader(dpmFileDestPath); 

      WaveFormat newFormat = new WaveFormat(8000, 16, 1); 

      WaveFormatConversionStream str = new WaveFormatConversionStream(newFormat, reader); 

      try 
      { 
       WaveFileWriter.CreateWaveFile("C:\\Konvertierten_Dateien.wav", str); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(String.Format("{0}", ex.Message)); 
      } 
      finally 
      {    
       str.Close(); 
      } 

       MessageBox.Show("Konvertieren ist Fertig!"); 
      } 
関連する問題