录制/捕获当前播放的音频

我想在UWP或Windows Phone 8.1中捕获/记录当前播放的音频,同样的事情是通过其应用程序中的“MEE dj”UWP应用程序完成,该应用程序能够捕获应用程序中当前正在播放的音频。 任何人都知道,请分享你的答案。

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

Windows.Media.Audio namespace包含AudioDeviceInputNodeAudioDeviceOutputNodeAudioFileInputNodeAudioFileOutputNode等。 输入的麦克风是AudioDeviceInputNode ,但是对于播放音乐文件,您需要使用AudioFileInputNode

好的,但是如何捕获该音频并将其保存到存储中

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

XAML代码

        

代码背后

  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() { ".wav" }); saveFilePicker.FileTypeChoices.Add("Windows Media Audio", new List() { ".wma" }); saveFilePicker.FileTypeChoices.Add("MPEG Audio Layer-3", new List() { ".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; } } 

对于其他复杂function,请参考官方样本。

您可以使用Windows.Media.Audio命名空间中的API为音频路由,混合和处理方案创建音频图。 有关如何创建音频图表,请参阅此文章 。

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

对于开始和停止录制,我们可以尝试使用启动和停止音频图节点来实现。 你也可以尝试像“MeeDJ”那样添加音频效果 。

更多function和示例代码请参考官方样本 。

Interesting Posts