2016-09-23 114 views
1

我想通過AudioGraph與音頻幀輸出節點獲得音量級別。這篇文章uwp AudioGraph audio processing有一些很好的信息;但我無法獲得良好的閱讀。如何使用AudioGraph獲取音量 - UWP

代碼:

AudioGraph audioGraph; 
AudioDeviceInputNode deviceInputNode; 
AudioFrameOutputNode frameOutputNode; 

    private async Task InitAudioGraph() 
    { 
     AudioGraphSettings settings = new AudioGraphSettings(Windows.Media.Render.AudioRenderCategory.Media); 

     CreateAudioGraphResult result = await AudioGraph.CreateAsync(settings); 
     if (result.Status != AudioGraphCreationStatus.Success) 
     { 
      Debug.WriteLine("AudioGraph creation error: " + result.Status.ToString()); 
     } 
     audioGraph = result.Graph; 
     CreateAudioDeviceInputNodeResult result1 = await audioGraph.CreateDeviceInputNodeAsync(Windows.Media.Capture.MediaCategory.Media); 

     if (result1.Status != AudioDeviceNodeCreationStatus.Success) 
     { 
      // Cannot create device output node 
      Debug.WriteLine(result.Status.ToString()); 
      return; 
     } 
     deviceInputNode = result1.DeviceInputNode; 
     frameOutputNode = audioGraph.CreateFrameOutputNode(); 
     frameOutputNode.Start(); 
     audioGraph.QuantumProcessed += AudioGraph_QuantumProcessed; 
    } 
    private void AudioGraph_QuantumProcessed(AudioGraph sender, object args) 
    { 
     Debug.WriteLine("event called"); 
     AudioFrame frame = frameOutputNode.GetFrame(); 
     ProcessFrameOutput(frame); 
    } 
    unsafe private void ProcessFrameOutput(AudioFrame frame) 
    { 
     using (AudioBuffer buffer = frame.LockBuffer(AudioBufferAccessMode.Write)) 
     using (IMemoryBufferReference reference = buffer.CreateReference()) 
     { 
      byte* dataInBytes; 
      uint capacityInBytes; 
      float* dataInFloat; 

      // Get the buffer from the AudioFrame 
      ((IMemoryBufferByteAccess)reference).GetBuffer(out dataInBytes, out capacityInBytes); 

      dataInFloat = (float*)dataInBytes; 
    } 

    [ComImport] 
    [Guid("5B0D3235-4DBA-4D44-865E-8F1D0E4FD04D")] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
     unsafe interface IMemoryBufferByteAccess 
    { 
     void GetBuffer(out byte* buffer, out uint capacity); 
    } 

前面的文章解釋,因爲許多輸入通道的在量子元件的數量。但即使假設一個頻道,如果我打印這些元素,它們仍然沒有意義。大多數值是0,有些大於1。 代碼:

for (int i = 0; i < audioGraph.SamplesPerQuantum; i++) 
      Debug.WriteLine(dataInFloat[i]); 

謝謝。

+0

我正在爲此工作 –

回答

2

但即使假設一個通道,如果我打印元素,它們仍然沒有意義。大多數的值是0,有些是大於一個

您需要在開始的音頻圖形之前使用AudioDeviceInputNode.AddOutgoingConnection方法來鏈接輸入和輸出節點連接在一起:

deviceInputNode = result1.DeviceInputNode; 
frameOutputNode = audioGraph.CreateFrameOutputNode(); 
deviceInputNode.AddOutgoingConnection(frameOutputNode); 
audioGraph.Start(); 
audioGraph.QuantumProcessed += AudioGraph_QuantumProcessed; 

enter image description here

frameOutputNode = audioGraph.CreateFrameOutputNode(); frameOutputNode.Start();

爲什麼你啓動輸出節點?請致電AudioGraph.Start()方法啓動音頻圖形,否則將不會調用QuantumProcessed事件。

+0

Thx! AudioDeviceInputNode.AddOutgoingConnection工作。 – rur2641