0

NAudio を使用して C# で 2 チャンネルのサウンドを正常に出力するメソッドを作成しましたが、6 チャンネルのサウンドでは失敗します。

WaveOut を使用すると、「MmException was unhandled: InvalidParameter calling waveOutOpen」というメッセージが表示されます

これが私のコードです:

    public class AudioOutput {
    private WaveOut latestAudioOut = null;
    private WaveMemoryStream latestMemoryStream = null;
    public void PlayAudio (byte[][] buffers, WaveFormat format) {
        if (latestAudioOut != null) {
            latestAudioOut.Stop();
            latestAudioOut.Dispose();
        }
        latestAudioOut = new WaveOut();
        if (latestMemoryStream != null) {
            latestMemoryStream.Dispose();
        }
        int longestChannelLength = 0;
        foreach (byte[] b in buffers) {
            if (b != null) if (b.Length > longestChannelLength) longestChannelLength = b.Length;
        }
        byte[][] finalisedbuffers = new byte[buffers.Length][];
        for (int i = 0; i < buffers.Length; i ++) {
            finalisedbuffers[i] = new byte[longestChannelLength];
            if (buffers[i] != null) buffers[i].CopyTo(finalisedbuffers[i], 0);
        }
        buffers = finalisedbuffers;
        byte[] interLeavedBuffer = new byte[longestChannelLength * buffers.Length];
        int bytesPerSample  = format.BitsPerSample / 8;
        int frameLength = buffers.Length * bytesPerSample;
        int numberOfFrames = longestChannelLength / bytesPerSample;
        int position = 0;
        int frameStart = 0;
        for (int f = 0; f < numberOfFrames; f ++) {
            for (int c = 0; c < buffers.Length; c ++) {
                for (int b = 0; b < bytesPerSample; b ++) {
                    interLeavedBuffer[position] = buffers[c][frameStart + b];
                    position ++;
                }
            }
            frameStart += bytesPerSample;
        }
        MemoryStream bufferStream = new MemoryStream(interLeavedBuffer);
        latestMemoryStream = new WaveMemoryStream(bufferStream, format);
        latestAudioOut.Init(latestMemoryStream);
        latestAudioOut.Play();
    }
4

2 に答える 2

1

WaveFormatExtensibleの代わりに使用する必要があると思いますWaveFormat

于 2013-05-21T09:56:56.713 に答える
0

これは、実際にはあなたの特定の問題に取り組んでいないぎこちない応答のように見えるかもしれませんが、数年前に自分のプロジェクトで広範なオーディオサポートを提供する必要がありました.

私が見つけたすべての C# 互換ライブラリ (NAudio を含む) を評価した後、Un4seen Developments の BASS ライブラリを使用することにしました。このライブラリは素晴らしく、C# を完全かつ広範囲にサポートしています。

私がこれまでに投げてきたすべてを処理でき、豊富なプラグイン環境と VST サポートもサポートしています。BASS を使用して必要なものを達成することは非常に簡単で、サポート フォーラムは非常に優れています。

于 2013-05-21T09:34:14.933 に答える