我正在尝试在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();
编辑:源波文件长度相同(无关紧要),比特率相同,且都有两个通道。
答案 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();
}
}
但是,请注意此事件处理程序中的线程安全措施。