2016-09-23 30 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); 
    } 

前の記事なぜなら、多くの入力チャネルの量子内の要素の数を説明しています。しかし、1つのチャンネルを想定していても、要素を印刷すると、まだ意味をなさない。ほとんどの値は0であり、いくつかは1より大きい値です。 コード:

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

はありがとうございます。

+0

私はこれに取り組んでいます –

答えて

2

しかし、1つのチャンネルを想定していても、要素を印刷すると、それでも意味をなさない。ほとんどの値は0であり、いくつかはあなたがオーディオグラフを開始する前に、入力と出力のノードを一緒にリンクするAudioDeviceInputNode.AddOutgoingConnectionメソッドを使用する必要が1

より大きい:

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

関連する問題