使用 AudioGraph (UWP) 混合波形文件
Mixing wave files using AudioGraph (UWP)
我正在尝试在 UWP 中使用 AudioGraph api 混合两个波形文件。我创建了以下代码,用于打开两个已录制的波形文件,创建一个 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();
编辑:源波形文件的长度相同(这应该无关紧要),比特率相同,并且都有两个通道。
感谢 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();
}
}
但是,请注意此事件处理程序中的线程安全措施。
我正在尝试在 UWP 中使用 AudioGraph api 混合两个波形文件。我创建了以下代码,用于打开两个已录制的波形文件,创建一个 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();
编辑:源波形文件的长度相同(这应该无关紧要),比特率相同,并且都有两个通道。
感谢 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();
}
}
但是,请注意此事件处理程序中的线程安全措施。