是否可以在 UWP 应用程序中提供原始音频(字节流)数据?
Is it possible to supply raw audio (byte stream) data in UWP application?
我有一个自定义音频 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 我没有这样的问题。另外,如果我获得对我的设备的 独占访问权限 会更好。 系统 sounds/alerts/notifications 与我的音频流混合是非常不受欢迎的。
提前致谢!
我注意到您的音频数据使用 44.1 kHz 采样率。许多音频设备支持 48 kHz,这是用作设备 "mix format" 的采样率。在这种情况下,AudioGraph 将重新采样您的音频数据以匹配 "mix format",以便您的数据可以与系统声音和来自其他应用程序的声音混合。
AudioGraph 无法将数据 as-is 发送到音频设备,因为这需要以独占模式打开音频设备,这会阻止任何系统声音,会干扰 Cortana 等。AudioGraph 不支持打开音频设备处于独占模式。
作为可能 work-around,如果您可以强制您的音频设备仅支持 44.1 kHz,那么这将成为新的 "mix format",并且 AudioGraph 不会对音频重新采样。某些音频设备通过控制 low-level 音频设置的 属性 页面支持此功能。
另一种work-around是使用IAudioClientAPI(WASAPI)以独占模式打开音频设备
我有一个自定义音频 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 我没有这样的问题。另外,如果我获得对我的设备的 独占访问权限 会更好。 系统 sounds/alerts/notifications 与我的音频流混合是非常不受欢迎的。
提前致谢!
我注意到您的音频数据使用 44.1 kHz 采样率。许多音频设备支持 48 kHz,这是用作设备 "mix format" 的采样率。在这种情况下,AudioGraph 将重新采样您的音频数据以匹配 "mix format",以便您的数据可以与系统声音和来自其他应用程序的声音混合。
AudioGraph 无法将数据 as-is 发送到音频设备,因为这需要以独占模式打开音频设备,这会阻止任何系统声音,会干扰 Cortana 等。AudioGraph 不支持打开音频设备处于独占模式。
作为可能 work-around,如果您可以强制您的音频设备仅支持 44.1 kHz,那么这将成为新的 "mix format",并且 AudioGraph 不会对音频重新采样。某些音频设备通过控制 low-level 音频设置的 属性 页面支持此功能。 另一种work-around是使用IAudioClientAPI(WASAPI)以独占模式打开音频设备