作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 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/
我是一名优秀的程序员,十分优秀!