首页 > 解决方案 > 设置 MMDevice WaveFormat

问题描述

在此处输入图像描述

我正在尝试使用此代码设置用于录制音频设备“MMDevice”的 WaveFormat 我正在使用 NAudio:

// Getting The WaveFormat for the device
    var value = selectedRecordingDevices.Properties[PropertyKeys.PKEY_AudioEngine_DeviceFormat].Value as byte[];
                IntPtr unmanagedPointer = Marshal.AllocHGlobal(value.Length);
                Marshal.Copy(value, 0, unmanagedPointer, value.Length);
                Marshal.FreeHGlobal(unmanagedPointer);
                var waveFormat = WaveFormat.MarshalFromPtr(unmanagedPointer);


// Setting The WaveFormat for the device
                WaveFormat w = new WaveFormat(44100, 16, 2);
                PropVariant p = new PropVariant();
                p.pointerValue = WaveFormatToPointer(w);
                selectedRecordingDevices.Properties.SetValue(PropertyKeys.PKEY_AudioEngine_DeviceFormat, p);



    public static IntPtr WaveFormatToPointer(WaveFormat format)
        {
            IntPtr formatPointer = Marshal.AllocHGlobal(Marshal.SizeOf(format));
            Marshal.StructureToPtr(format, formatPointer, false);
            return formatPointer;
        }

我得到了这个例外:

System.UnauthorizedAccessException
  HResult=0x80070005
  Message=Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
  Source=NAudio
  StackTrace:
   at NAudio.CoreAudioApi.Interfaces.IPropertyStore.SetValue(PropertyKey& key, PropVariant& value)
   at NAudio.CoreAudioApi.PropertyStore.SetValue(PropertyKey key, PropVariant value)

标签: c#windowsnaudio

解决方案


1-在设置值之前,您需要设置 StorageAccessMode:

selectedRecordingDevice.GetPropertyInformation(StorageAccessMode.ReadWrite);

所以它看起来像这样:

      // Setting The WaveFormat for the device
                        WaveFormat w = new WaveFormat(44100, 16, 2);
                        PropVariant p = new PropVariant();
                        p.pointerValue = WaveFormatToPointer(w);


    selectedRecordingDevice.GetPropertyInformation(StorageAccessMode.ReadWrite);




  selectedRecordingDevices.Properties.SetValue(PropertyKeys.PKEY_AudioEngine_DeviceFormat, p);

2-它必须以管理员身份运行


推荐阅读