5

WAV ファイル (PCM、48kHz、4 チャンネル、16 ビット) をモノチャンネルの WAV ファイルに変換しようとしています。

この回答のようにWAVファイルを4つのバイト配列に分割しようとしましたが、以下に示すようにWaveMemoryStreamを作成しましたが、機能しません。

byte[] chan1ByteArray = new byte[channel1Buffer.Length];
Buffer.BlockCopy(channel1Buffer, 0, chan1ByteArray, 0, chan1ByteArray.Length);
WaveMemoryStream chan1 = new WaveMemoryStream(chan1ByteArray, sampleRate, (ushort)bitsPerSample, 1);

WAVE ヘッダーの作成に何か不足していますか? それとも、WAV をモノチャンネルの WAV ファイルに分割する方法はありますか?

4

3 に答える 3

6

基本的な考え方は、ソース ウェーブ ファイルにはインターリーブされたサンプルが含まれているということです。1 つは最初のチャネル用、もう 1 つは 2 番目のチャネル用などです。これを行う方法のアイデアを提供するために、テストされていないコード例をいくつか示します。

var reader = new WaveFileReader("fourchannel.wav");
var buffer = new byte[2 * reader.WaveFormat.SampleRate * reader.WaveFormat.Channels];
var writers = new WaveFileWriter[reader.WaveFormat.Channels];
for (int n = 0; n < writers.Length; n++) 
{
    var format = new WaveFormat(reader.WaveFormat.SampleRate,16,1);
    writers[n] = new WaveFileWriter(String.Format("channel{0}.wav",n+1), format);
}
int bytesRead;
while((bytesRead = reader.Read(buffer,0, buffer.Length)) > 0) 
{
    int offset=  0;
    while (offset < bytesRead) 
    {
        for (int n = 0; n < writers.Length; n++) 
        {
            // write one sample
            writers[n].Write(buffer,offset,2);
            offset += 2;
        }           
    }
}
for (int n = 0; n < writers.Length; n++) 
{
    writers[n].Dispose();
}
reader.Dispose();
于 2012-08-27T21:11:32.037 に答える