C# 录制/捕获当前正在播放的音频

C# 录制/捕获当前正在播放的音频,c#,windows-phone-8.1,uwp,audio-capture,C#,Windows Phone 8.1,Uwp,Audio Capture,我想在UWP或Windows Phone 8.1中捕获/录制当前播放的音频。任何应用程序中的“MEE dj”UWP应用程序都可以执行相同的操作,该应用程序能够捕获应用程序中当前播放的音频。 任何知道的人都可以分享您的答案。您可以使用名称空间中的API为音频路由、混合和处理场景创建音频图。有关如何创建音频图,请参考 音频图是一组相互连接的音频节点。要录制的音频文件提供“音频输入节点”,“音频输出节点”是图形处理的音频的目标,音频可以从图形路由到目标音频文件。在“MeeDJ”windows应用商店应

我想在UWP或Windows Phone 8.1中捕获/录制当前播放的音频。任何应用程序中的“MEE dj”UWP应用程序都可以执行相同的操作,该应用程序能够捕获应用程序中当前播放的音频。
任何知道的人都可以分享您的答案。

您可以使用名称空间中的API为音频路由、混合和处理场景创建音频图。有关如何创建音频图,请参考

音频图是一组相互连接的音频节点。要录制的音频文件提供“音频输入节点”,“音频输出节点”是图形处理的音频的目标,音频可以从图形路由到目标音频文件。在“MeeDJ”windows应用商店应用程序中,它可以混合两个音频并录制成一个。在这种情况下,我们可以使用“submix节点”,它从一个或多个节点获取音频,并将它们组合成单个输出

对于开始和停止录制,我们可以尝试使用来实现。你也可以试着像“MeeDJ”那样做

更多功能和示例代码请参考

如何设置输入节点播放音乐而不是麦克风

包含
AudioDeviceInputNode
AudioDeviceOutputNode
AudioFileInputNode
AudioFileOutputNode
等。用于输入的麦克风是
AudioDeviceInputNode
,但用于播放音乐文件,您需要使用
AudioFileInputNode


好的,但是我怎样才能捕获音频并将其保存到存储器中呢

如前所述,为了保存到存储,我们需要使用
AudioFileOutputNode
。这是一个简单的演示,您可以加载一个文件进行录制,并从存储器中选择一个文件来保存录制结果。代码如下:

XAML代码

<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Padding="50">
    <TextBlock x:Name="txtresult" ></TextBlock>
    <Button x:Name="fileButton" Content="Load audio File for recording" Click="File_Click" MinWidth="120" MinHeight="45" Margin="0,20,0,0"/>
    <Button x:Name="OutpuyfileButton" Content="Load output File for save the recording result" Click="OutpuyfileButton_Click" MinWidth="120" MinHeight="45" Margin="0,20,0,0"/>
    <Button x:Name="graphButton" Content="Start playing" Click="Graph_Click" MinWidth="120" MinHeight="45" Margin="0,50,0,20"/>
    <Button x:Name="graphrecord" Content="Begin recording" Click="graphrecord_Click" ></Button>
</StackPanel>

代码隐藏

  private AudioFileInputNode fileInput;
  private AudioFileOutputNode fileOutputNode;
  private AudioDeviceOutputNode deviceOutput;
  private AudioGraph graph;

  StorageFile outputfile;

  public MainPage()
  {
      this.InitializeComponent();
  }
  protected override async void OnNavigatedTo(NavigationEventArgs e)
  {
      await CreateAudioGraph();
  }
  private async Task CreateAudioGraph()
  {
      // Create an AudioGraph with default settings
      AudioGraphSettings settings = new AudioGraphSettings(AudioRenderCategory.Media);
      CreateAudioGraphResult result = await AudioGraph.CreateAsync(settings);
      if (result.Status != AudioGraphCreationStatus.Success)
      {
          // Cannot create graph
          await new MessageDialog(String.Format("AudioGraph Creation Error because {0}", result.Status.ToString())).ShowAsync();
          return;
      }
      graph = result.Graph;
      // Create a device output node
      CreateAudioDeviceOutputNodeResult deviceOutputNodeResult = await graph.CreateDeviceOutputNodeAsync();
      if (deviceOutputNodeResult.Status != AudioDeviceNodeCreationStatus.Success)
      {
          // Cannot create device output node
        txtresult.Text+="\n"+ String.Format("Device Output unavailable because {0}", deviceOutputNodeResult.Status.ToString());
          return;
      }
      deviceOutput = deviceOutputNodeResult.DeviceOutputNode;
      txtresult.Text += "\n" + "Device Output Node successfully created";
  }
  private async void File_Click(object sender, RoutedEventArgs e)
  {
      // If another file is already loaded into the FileInput node
      if (fileInput != null)
      {
          fileInput.Dispose();
      }
      FileOpenPicker filePicker = new FileOpenPicker();
      filePicker.SuggestedStartLocation = PickerLocationId.MusicLibrary;
      filePicker.FileTypeFilter.Add(".mp3");
      filePicker.FileTypeFilter.Add(".wav");
      filePicker.FileTypeFilter.Add(".wma");
      filePicker.FileTypeFilter.Add(".m4a");
      filePicker.ViewMode = PickerViewMode.Thumbnail;
      StorageFile file = await filePicker.PickSingleFileAsync();
      // File can be null if cancel is hit in the file picker
      if (file == null)
      {
          return;
      }
      CreateAudioFileInputNodeResult fileInputResult = await graph.CreateFileInputNodeAsync(file);
      if (AudioFileNodeCreationStatus.Success != fileInputResult.Status)
      {
          // Cannot read input file
          await new MessageDialog(String.Format("Cannot read input file because {0}", fileInputResult.Status.ToString())).ShowAsync();
          return;
      }

      fileInput = fileInputResult.FileInputNode;
      txtresult.Text += "\n" + "File load successfully,input nodes created";
  }

  private void Graph_Click(object sender, RoutedEventArgs e)
  {
      if (graphButton.Content.Equals("Start playing"))
      {
          fileInput.AddOutgoingConnection(deviceOutput);
          graph.Start();            
          graphButton.IsEnabled = false;
      }
  }

  private async void OutpuyfileButton_Click(object sender, RoutedEventArgs e)
  {
      FileSavePicker saveFilePicker = new FileSavePicker();
      saveFilePicker.FileTypeChoices.Add("Pulse Code Modulation", new List<string>() { ".wav" });
      saveFilePicker.FileTypeChoices.Add("Windows Media Audio", new List<string>() { ".wma" });
      saveFilePicker.FileTypeChoices.Add("MPEG Audio Layer-3", new List<string>() { ".mp3" });
      saveFilePicker.SuggestedFileName = "New Audio Track";
      outputfile = await saveFilePicker.PickSaveFileAsync();
      // File can be null if cancel is hit in the file picker
      if (outputfile == null)
      {
          return;
      }

      txtresult.Text +="\n"+ String.Format("Recording to {0}", outputfile.Name.ToString());
  }
  private MediaEncodingProfile CreateMediaEncodingProfile(StorageFile file)
  {
      switch (file.FileType.ToString().ToLowerInvariant())
      {
          case ".wma":
              return MediaEncodingProfile.CreateWma(AudioEncodingQuality.High);
          case ".mp3":
              return MediaEncodingProfile.CreateMp3(AudioEncodingQuality.High);
          case ".wav":
              return MediaEncodingProfile.CreateWav(AudioEncodingQuality.High);
          default:
              throw new ArgumentException();
      }
  }

  private async void graphrecord_Click(object sender, RoutedEventArgs e)
  {
      if (graphrecord.Content.Equals("Begin recording"))
      {
          MediaEncodingProfile fileProfile = CreateMediaEncodingProfile(outputfile);
          CreateAudioFileOutputNodeResult fileOutputNodeResult = await graph.CreateFileOutputNodeAsync(outputfile, fileProfile);
          if (fileOutputNodeResult.Status != AudioFileNodeCreationStatus.Success)
          {
              // FileOutputNode creation failed
              await new MessageDialog(String.Format("Cannot create output file because {0}", fileOutputNodeResult.Status.ToString())).ShowAsync();
              return;
          }
          fileOutputNode = fileOutputNodeResult.FileOutputNode;
          fileInput.AddOutgoingConnection(fileOutputNode);
          graphrecord.Content = "Stop recording";
      }
      else
      {
          graph.Stop();
          TranscodeFailureReason finalizeResult = await fileOutputNode.FinalizeAsync();
          if (finalizeResult != TranscodeFailureReason.None)
          {
              // Finalization of file failed. Check result code to see why
              await new MessageDialog(String.Format("Finalization of file failed because {0}", finalizeResult.ToString())).ShowAsync();
              return;
          }
          txtresult.Text += "\n" + "Recording completed";
          graphrecord.IsEnabled = false;
      }
  }
私有音频文件输入节点文件输入;
专用音频文件输出节点文件输出节点;
专用音频设备输出节点设备输出;
私人听力图;
存储文件输出文件;
公共主页()
{
this.InitializeComponent();
}
受保护的覆盖异步无效OnNavigatedTo(NavigationEventArgs e)
{
等待CreateAudioGraph();
}
专用异步任务CreateAudioGraph()
{
//使用默认设置创建听力图
AudioGraphSettings设置=新的AudioGraphSettings(AudioRenderCategory.Media);
CreateAudioGraphResult=await AudioGraph.CreateAsync(设置);
if(result.Status!=AudioGraphCreationStatus.Success)
{
//无法创建图形
等待新的MessageDialog(String.Format(“听力图创建错误,因为{0}”)、result.Status.ToString()).ShowAsync();
返回;
}
图=结果。图;
//创建设备输出节点
CreateAudioDeviceOutputNodeResult设备OutputNodeResult=Wait graph.CreateDeviceOutputNodeAsync();
if(deviceOutputNodeResult.Status!=音频设备DecreationStatus.Success)
{
//无法创建设备输出节点
txtreult.Text+=“\n”+String.Format(“设备输出因{0}”而不可用,deviceOutputNodeResult.Status.ToString());
返回;
}
deviceOutput=deviceOutputNodeResult.DeviceOutputNode;
txtresult.Text+=“\n”+“已成功创建设备输出节点”;
}
私有异步无效文件\u单击(对象发送方,路由目标)
{
//如果另一个文件已加载到FileInput节点中
if(fileInput!=null)
{
Dispose();
}
FileOpenPicker filePicker=新的FileOpenPicker();
filePicker.SuggestedStartLocation=PickerLocationId.MusicLibrary;
filePicker.FileTypeFilter.Add(“.mp3”);
filePicker.FileTypeFilter.Add(“.wav”);
filePicker.FileTypeFilter.Add(“.wma”);
filePicker.FileTypeFilter.Add(“.m4a”);
filePicker.ViewMode=PickerViewMode.缩略图;
StorageFile file=Wait filePicker.PickSingleFileAsync();
//如果在文件选择器中单击“取消”,则文件可以为空
if(file==null)
{
返回;
}
CreateAudioFileInputNodeResult fileInputResult=Wait graph.CreateFileInputNodeAsync(文件);
if(AudioFileNodeCreationStatus.Success!=fileInputResult.Status)
{
//无法读取输入文件
等待新的MessageDialog(String.Format(“无法读取输入文件,因为{0}”)、fileInputResult.Status.ToString()).ShowAsync();
返回;
}
fileInput=fileInputResult.FileInputNode;
txtresult.Text+=“\n”+“文件加载成功,已创建输入节点”;
}
私有无效图\u单击(对象发送者,路由目标e)
{
if(graphButton.Content.Equals(“开始播放”))
{
fileInput.AddOutgoingConnection(设备输出);
graph.Start();
graphButton.IsEnabled=false;
}
}
私有异步void OutpuyfileButton\u单击(对象发送方,RoutedEventTargets e)
{
FileSavePicker saveFilePicker=新FileSavePicker();
saveFilePicker.FileTypeChoices.Add(“脉冲编码调制”,新列表(){.wav});
saveFilePicker.FileTypeChoices.Add(“Windows Media Audio”,新列表(){.wma});
saveFilePicker.FileTypeChoices.Add(“MPEG音频层-3”,新列表(){.mp3});
saveFilePicker.SuggestedFileName=“新建音频曲目”;
outputfile=wait saveFilePicker.PickSaveFileAsync();
//如果在文件选择器中单击“取消”,则文件可以为空
if(outputfile==null)
{
返回;
}
txtreult.Text+=“\n”+String.Format(“录制到{0}”,outputfile.Name.ToString());
}
专用MediaEncodingProfile创建MediaEncodingProfile(存储文件)
{
开关(file.FileType.ToString().ToLowerInvariant())
{
案例“.wma”:
返回MediaEncodingProfile.CreateWma(AudioEncodingQuality.High);
大小写“.mp3”:
返回MediaEncodingProfile.CreateMp3(音频编码质量高);