gpt4 book ai didi

.net - 如何在.net中实现多声道音频预混器

转载 作者:行者123 更新时间:2023-12-01 19:34:43 24 4
gpt4 key购买 nike

我想使用 C# 来实现一个可以同时播放多个音频流的应用程序。花生 - 现在是有趣的部分:假设每个流都是单声道(单声道),我想分别调整每个流的每个扬声器(5.1 甚至 7.1)的音量。我可以使用 windows 混合器来做到这一点,但问题是,只有一个混合器,我想分别为每个流调整它。任何想法如何实现这一点?

我的第一个猜测是将流复用八次 (7.1),为每个“ channel ”应用音量级别,然后将其发送到 Windows 混音器,例如,所有 channel 的音量级别都为 80%。您知道任何可能支持此类用例的库吗?

AFAIK 低音和 fmod 不能做到这一点,但如果我错了,请纠正我。作为替代方案,我正在考虑为此破解 XNA:使用一个向量来描述与监听器相关的流的位置,并使用它来应用音量补偿......只是散漫。

(并且请不要向我指出一些关于此的 C++/WinAPI 想法,这个项目现在不值得学习另一种语言。)

最佳答案

终于搞定了:bass.dll 允许使用 BassMix.BASS_Mixer_ChannelSetMatrix(int streamHandle, float[,] volumeMatrix) 方法分别为每个扬声器应用矩阵作为音量设置。 .您可以查看样本 here ,他们正在使用它来将立体声流上混到四个扬声器。在我为解决我的问题而创建的完整类(class)之下。

public class SeparateVolumeLevelPlayer : IDisposable
{
private readonly int outputMixerStream;
private readonly int inputStream;
private readonly int numberOfSpeakers;

public SeparateVolumeLevelPlayer(string fileName, int numberOfSpeakers)
{
this.numberOfSpeakers = numberOfSpeakers;
outputMixerStream = BassMix.BASS_Mixer_StreamCreate(44100, numberOfSpeakers, BASSFlag.BASS_MIXER_MATRIX);
ThrowOnError();

// create a stream from the media file
inputStream = Bass.BASS_StreamCreateFile(fileName, 0L, 0L, BASSFlag.BASS_STREAM_DECODE | BASSFlag.BASS_MIXER_MATRIX | BASSFlag.BASS_SAMPLE_MONO);
ThrowOnError();

// add the stream to the mixer
BassMix.BASS_Mixer_StreamAddChannel(outputMixerStream, inputStream, BASSFlag.BASS_MIXER_MATRIX);
ThrowOnError();
}

public void Play()
{
// start playback of the mixed streams
Bass.BASS_ChannelPlay(outputMixerStream, false);
ThrowOnError();
}

public void SetVolume(float[] volumeValues)
{
if (volumeValues == null)
{
throw new ArgumentNullException("volumeValues");
}

if (volumeValues.Length != numberOfSpeakers)
{
string message =
string.Format("You must pass a volume level for every speaker. You provided {0} values for {1} speakers",
volumeValues.Length, numberOfSpeakers);
throw new ArgumentException(message);
}

var volumeMatrix = new float[numberOfSpeakers, 1];

for (int i = 0; i < numberOfSpeakers; i++)
{
volumeMatrix[i, 0] = volumeValues[i];
}

// adjust the volume using the matrix
BassMix.BASS_Mixer_ChannelSetMatrix(inputStream, volumeMatrix);
ThrowOnError();

}

private static void ThrowOnError()
{
BASSError err = Bass.BASS_ErrorGetCode();
if (err != BASSError.BASS_OK)
{
throw new ApplicationException(string.Format("bass.dll reported {0}.", err));
}
}

public void Dispose()
{
Bass.BASS_StreamFree(inputStream);
Bass.BASS_StreamFree(outputMixerStream);
}
}

关于.net - 如何在.net中实现多声道音频预混器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1624985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com