【问题标题】:Setting MMDevice WaveFormat设置 MMDevice WaveFormat
【发布时间】:2019-08-05 16:01:02
【问题描述】:

我正在尝试使用此代码设置用于录制音频设备“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# windows naudio


    【解决方案1】:

    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- 它必须以管理员身份运行

    【讨论】:

      猜你喜欢
      • 2015-09-25
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      相关资源
      最近更新 更多