我有自定义音频DAC设备。它内部有自己的控制器,知道如何使用某个字节流。有一个我试图使用的图书馆: Audio Graph。我在内存中生成一些数据并像这样发送:
private unsafe AudioFrame GenerateAudioData(byte[] data)
{
uint bufferSize = 7000000;
AudioFrame frame = new Windows.Media.AudioFrame(bufferSize);
using (AudioBuffer buffer = frame.LockBuffer(AudioBufferAccessMode.Write))
using (IMemoryBufferReference reference = buffer.CreateReference())
{
byte* dataInBytes;
uint capacityInBytes;
((IMemoryBufferByteAccess)reference).GetBuffer(out dataInBytes, out capacityInBytes);
for (int i = 0; i < bufferSize; i += 4)
{
dataInBytes[i] = data[i];
dataInBytes[i + 1] = data[i + 1];
dataInBytes[i + 2] = data[i + 2];
dataInBytes[i + 3] = data[i + 3];
}
}
return frame;
}
这是我的音频图表设置:
AudioGraphSettings settings = new AudioGraphSettings(AudioRenderCategory.Other)
{
EncodingProperties = AudioEncodingProperties.CreatePcm(44100, 2, 16),
AudioRenderCategory = AudioRenderCategory.Other,
DesiredRenderDeviceAudioProcessing = AudioProcessing.Raw
};
问题在于修改我的流和物理设备的东西并没有收到完全相同的数据。在声音上它不明显,但我需要向端点设备提供相同的字节。使用WASAPI我没有遇到这样的问题。如果我的设备获得独占访问权限,那也会更好。非常不希望系统声音/警报/通知与我的音频流混合。
提前致谢!
答案 0 :(得分:1)
我注意到您的音频数据使用44.1 kHz的采样率。许多音频设备支持48 kHz,这是用作设备“混合格式”的采样率。在这种情况下,AudioGraph将重新采样您的音频数据以匹配“混合格式”,以便您的数据可以与来自其他应用程序的系统声音和声音混合。
AudioGraph无法按原样将数据发送到音频设备,因为这需要以独占模式打开音频设备,这会阻止任何系统声音,会干扰Cortana等.AudioGraph不支持打开音频设备独家模式。
作为一种可能的解决方法,如果您可以强制您的音频设备仅支持44.1 kHz,那么这将成为新的“混合格式”,而AudioGraph将不会重新采样音频。某些音频设备通过控制低级音频设置的属性页支持此功能。 另一种解决方法是使用IAudioClient API(WASAPI)以独占模式打开音频设备。