使用AudioGraph(UWP)

时间:2016-04-27 22:38:34

标签: c# audio win-universal-app windows-10-universal

我正在尝试在UWP中使用AudioGraph api混合两个wave文件。我创建了以下代码,它打开了两个已经记录的wave文件,创建了一个AudioGraph,一个AudioSubmixNode,两个AudioFileInputNode和一个AudioFileOutputNode对象。

我调用graph.Start()使图形混合两个文件并将它们存储到AudioFileOutputNode中。然而,发生的事情是AudioGraph永远不会停止并继续扩展输出文件。我让它运行了一段时间,结束文件变成了1.1GB,直到我关闭了应用程序!

我尝试处理AudioGraph的QuantumProcessed事件,我注意到在调用graph.start()之后无休止地调用了这个事件。我尝试在此事件中停止图形,但事件会一次又一次地被调用,最终结果文件变得越来越大。

我想知道是否有人可以帮助解决这个问题。

非常感谢。

        AudioGraphSettings setting;
        AudioGraph graph;
        AudioFileInputNode input1;
        AudioFileInputNode input2;
        AudioFileOutputNode output;
        AudioSubmixNode submix;

        IStorageFile musicFile1 = await folder.GetFileAsync("1.wav");
        IStorageFile musicFile2 = await folder.GetFileAsync("2.wav");
        IStorageFile finalFile = await folder.CreateFileAsync("Final.wav", CreationCollisionOption.ReplaceExisting);

        setting = new AudioGraphSettings(Windows.Media.Render.AudioRenderCategory.Media);
        CreateAudioGraphResult graphResult = await AudioGraph.CreateAsync(setting);
        graph = graphResult.Graph;

        CreateAudioFileInputNodeResult inputResult1 = await graph.CreateFileInputNodeAsync(musicFile1);
        CreateAudioFileInputNodeResult inputResult2 = await graph.CreateFileInputNodeAsync(musicFile2);
        CreateAudioFileOutputNodeResult outputResult = await graph.CreateFileOutputNodeAsync(finalFile);

        input1 = inputResult1.FileInputNode;
        input2 = inputResult2.FileInputNode;
        output = outputResult.FileOutputNode;

        submix = graph.CreateSubmixNode();
        input1.AddOutgoingConnection(submix);
        input2.AddOutgoingConnection(submix);
        submix.AddOutgoingConnection(output);

        graph.Start();

编辑:源波文件长度相同(无关紧要),比特率相同,且都有两个通道。

1 个答案:

答案 0 :(得分:0)

感谢Mike Taulty,我终于修复了它。请参阅下面的解决方案:

  this.remainingFiles = 2;
  this.input1.FileCompleted += OnFileCompleted;
  this.input2.FileCompleted += OnFileCompleted;

然后我们按如下方式处理OnFileCompleted:

async void OnFileCompleted(AudioFileInputNode sender, object args)
{
  if(--this.remainingFiles == 0)
  {
    this.graph.Stop();
    await this.output.FinalizeAsync();
    this.graph.Dispose();
  }
}

但是,请注意此事件处理程序中的线程安全措施。