8

NAudioを使ってWAVファイルを8KHz8bitに変換したいです。

            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) に設定すると、正常に動作します。

ありがとう。

4

3 に答える 3

19

いくつかの指針:

  • あるサンプルレート/ビット深度から別のサンプルレート/ビット深度に実際に変換するには、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);
    } 
}
于 2011-07-11T10:46:02.577 に答える
3

次のコードは、wav ファイルへの vox ファイル拡張子を持つ G.711 Mu-Law を扱う私の問題を解決しました。それ以外の場合、WaveFileReader で「RIFF ヘッダーがありません」というエラーが発生し続けました。

 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();
于 2013-05-23T16:55:46.713 に答える
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!");
            }
于 2013-09-04T11:05:53.620 に答える