UWP:waveInOpen returns WAVERR_BADFORMAT
UWP: waveInOpen returns WAVERR_BADFORMAT
我正在尝试使用 Winmm.dll 在 UWP 中录制音频。在我执行 waveInOpen 方法 (https://msdn.microsoft.com/en-us/library/dd743847(v=vs.85).aspx) 之后,无论我使用什么数据,我总是得到 WAVERR_BADFORMAT(它也需要很长时间,大约 5 秒)。我的代码如下所示:
Recorder.cs:
Win32.WAVEFORMATEX waveFormatEx = new Win32.WAVEFORMATEX();
waveFormatEx.wFormatTag = (ushort)Win32.WaveFormatFlags.WAVE_FORMAT_PCM;
waveFormatEx.nChannels = 1;
waveFormatEx.nSamplesPerSec = 8000;
waveFormatEx.wBitsPerSample = 16;
waveFormatEx.nBlockAlign = 2;
waveFormatEx.nAvgBytesPerSec = 16000;
Win32.MMRESULT hr = Win32.waveInOpen(ref hWaveIn, deviceId, ref waveFormatEx, delegateWaveInProc, 0, (int)Win32.WaveProcFlags.CALLBACK_FUNCTION);
Win32.cs:
[StructLayout(LayoutKind.Sequential)]
public struct WAVEFORMATEX
{
public ushort wFormatTag;
public ushort nChannels;
public uint nSamplesPerSec;
public uint nAvgBytesPerSec;
public ushort nBlockAlign;
public ushort wBitsPerSample;
public ushort cbSize;
}
[DllImport("winmm.dll")]
public static extern MMRESULT waveInOpen(ref IntPtr hWaveIn, int deviceId, ref WAVEFORMATEX wfx, DelegateWaveInProc dwCallBack, int dwInstance, int dwFlags);
具有相同参数的相同代码在 Windows Forms 应用程序中工作得很好(并在瞬间执行),但在 UWP 应用程序中却没有,我不知道为什么。我可以在 UWP 中使用的正确格式是什么?
在处理 UWP 项目时,您可以记住:它是功能的有限子集(出于安全性和跨设备兼容性考虑)。因此,UWP 项目与 Win32 无关 API。即使您的代码在模拟器上是 compiling/running,它也会:
- 在 ARM 设备上失败(因为它们肯定没有 Win32 DLL)
- 向 Microsoft Store 提交应用程序失败
因此,如果我们谈论的是音频,您必须考虑 WASAPI,因为它 100% 兼容 UWP https://msdn.microsoft.com/en-us/library/windows/desktop/dd371455(v=vs.85).aspx
我正在尝试使用 Winmm.dll 在 UWP 中录制音频。在我执行 waveInOpen 方法 (https://msdn.microsoft.com/en-us/library/dd743847(v=vs.85).aspx) 之后,无论我使用什么数据,我总是得到 WAVERR_BADFORMAT(它也需要很长时间,大约 5 秒)。我的代码如下所示:
Recorder.cs:
Win32.WAVEFORMATEX waveFormatEx = new Win32.WAVEFORMATEX();
waveFormatEx.wFormatTag = (ushort)Win32.WaveFormatFlags.WAVE_FORMAT_PCM;
waveFormatEx.nChannels = 1;
waveFormatEx.nSamplesPerSec = 8000;
waveFormatEx.wBitsPerSample = 16;
waveFormatEx.nBlockAlign = 2;
waveFormatEx.nAvgBytesPerSec = 16000;
Win32.MMRESULT hr = Win32.waveInOpen(ref hWaveIn, deviceId, ref waveFormatEx, delegateWaveInProc, 0, (int)Win32.WaveProcFlags.CALLBACK_FUNCTION);
Win32.cs:
[StructLayout(LayoutKind.Sequential)]
public struct WAVEFORMATEX
{
public ushort wFormatTag;
public ushort nChannels;
public uint nSamplesPerSec;
public uint nAvgBytesPerSec;
public ushort nBlockAlign;
public ushort wBitsPerSample;
public ushort cbSize;
}
[DllImport("winmm.dll")]
public static extern MMRESULT waveInOpen(ref IntPtr hWaveIn, int deviceId, ref WAVEFORMATEX wfx, DelegateWaveInProc dwCallBack, int dwInstance, int dwFlags);
具有相同参数的相同代码在 Windows Forms 应用程序中工作得很好(并在瞬间执行),但在 UWP 应用程序中却没有,我不知道为什么。我可以在 UWP 中使用的正确格式是什么?
在处理 UWP 项目时,您可以记住:它是功能的有限子集(出于安全性和跨设备兼容性考虑)。因此,UWP 项目与 Win32 无关 API。即使您的代码在模拟器上是 compiling/running,它也会:
- 在 ARM 设备上失败(因为它们肯定没有 Win32 DLL)
- 向 Microsoft Store 提交应用程序失败
因此,如果我们谈论的是音频,您必须考虑 WASAPI,因为它 100% 兼容 UWP https://msdn.microsoft.com/en-us/library/windows/desktop/dd371455(v=vs.85).aspx