c# - 同时录制音频和播放声音 - C# - Windows Phone 8.1

标签 c# windows-phone-8.1 windows-applications

我正在尝试录制音频并直接播放(我想在耳机中听到我的声音而不保存它)但是 MediaElement 和 MediaCapture 似乎无法同时工作。 我这样初始化了我的 MediaCapture:

    _mediaCaptureManager = new MediaCapture();
    var settings = new MediaCaptureInitializationSettings();
    settings.StreamingCaptureMode = StreamingCaptureMode.Audio;
    settings.MediaCategory = MediaCategory.Other;
    settings.AudioProcessing = AudioProcessing.Default;
    await _mediaCaptureManager.InitializeAsync(settings);

但是我真的不知道如何进行;我想知道这些方法中的一种是否可行(我尝试实现它们但没有成功,而且我还没有找到示例):

  1. 有没有办法使用 StartPreviewAsync() 录制音频,或者它只适用于视频?我注意到在设置我的 CaptureElement 源时出现以下错误:“指定的对象或值不存在”;只有当我写“settings.StreamingCaptureMode = StreamingCaptureMode.Audio;”时才会发生而一切都适用于 .Video。
  2. 如何使用 StartRecordToStreamAsync() 录制到流中;我的意思是,我如何初始化 IRandomAccessStream 并从中读取?我可以在阅读的同时在流上写作吗?
  3. 我了解到,将 MediaElement 的 AudioCathegory 和 MediaCapture 的 MediaCathegory 更改为 Communication 可能会奏效。但是,虽然我的代码可以使用以前的设置(它只需要记录并保存在一个文件中),但如果我写“settings.MediaCategory = MediaCategory.Communication;”,它就不起作用了。而不是“settings.MediaCategory = MediaCategory.Other;”。你能告诉我为什么吗? 这是我当前的程序,只记录、保存和播放:

    private async void CaptureAudio()
    {
        try
        {
           _recordStorageFile = await KnownFolders.VideosLibrary.CreateFileAsync(fileName, CreationCollisionOption.GenerateUniqueName);                      
          MediaEncodingProfile recordProfile = MediaEncodingProfile.CreateWav(AudioEncodingQuality.Auto);
          await _mediaCaptureManager.StartRecordToStorageFileAsync(recordProfile, this._recordStorageFile);
          _recording = true;
         }
         catch (Exception e)
         {
            Debug.WriteLine("Failed to capture audio:"+e.Message);
         }
    }
    
    private async void StopCapture()
    {
       if (_recording)
       {
          await _mediaCaptureManager.StopRecordAsync();
          _recording = false;
       }
    }
    
    private async void PlayRecordedCapture()
    {
       if (!_recording)
       {
          var stream = await   _recordStorageFile.OpenAsync(FileAccessMode.Read);
          playbackElement1.AutoPlay = true;
          playbackElement1.SetSource(stream, _recordStorageFile.FileType);
          playbackElement1.Play();
       }
    }
    

如果您有任何建议,我将不胜感激。 祝你有美好的一天。

最佳答案

您会考虑改用 Windows 10 吗?新的 AudioGraph API 让您可以做到这一点,Scenario 2 (Device Capture) in the SDK sample很好地证明了这一点。

首先,示例将所有输出设备填充到一个列表中:

private async Task PopulateDeviceList()
{
    outputDevicesListBox.Items.Clear();
    outputDevices = await DeviceInformation.FindAllAsync(MediaDevice.GetAudioRenderSelector());
    outputDevicesListBox.Items.Add("-- Pick output device --");
    foreach (var device in outputDevices)
    {
        outputDevicesListBox.Items.Add(device.Name);
    }
}

然后开始构建 AudioGraph:

AudioGraphSettings settings = new AudioGraphSettings(AudioRenderCategory.Media);
settings.QuantumSizeSelectionMode = QuantumSizeSelectionMode.LowestLatency;

// Use the selected device from the outputDevicesListBox to preview the recording
settings.PrimaryRenderDevice = outputDevices[outputDevicesListBox.SelectedIndex - 1];

CreateAudioGraphResult result = await AudioGraph.CreateAsync(settings);

if (result.Status != AudioGraphCreationStatus.Success)
{
    // TODO: Cannot create graph, propagate error message
    return;
}

AudioGraph graph = result.Graph;

// Create a device output node
CreateAudioDeviceOutputNodeResult deviceOutputNodeResult = await graph.CreateDeviceOutputNodeAsync();
if (deviceOutputNodeResult.Status != AudioDeviceNodeCreationStatus.Success)
{
    // TODO: Cannot create device output node, propagate error message
    return;
}

deviceOutputNode = deviceOutputNodeResult.DeviceOutputNode;

// Create a device input node using the default audio input device
CreateAudioDeviceInputNodeResult deviceInputNodeResult = await graph.CreateDeviceInputNodeAsync(MediaCategory.Other);

if (deviceInputNodeResult.Status != AudioDeviceNodeCreationStatus.Success)
{
    // TODO: Cannot create device input node, propagate error message
    return;
}

deviceInputNode = deviceInputNodeResult.DeviceInputNode;

// Because we are using lowest latency setting, we need to handle device disconnection errors
graph.UnrecoverableErrorOccurred += Graph_UnrecoverableErrorOccurred;

// Start setting up the output file
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";
StorageFile file = await saveFilePicker.PickSaveFileAsync();

// File can be null if cancel is hit in the file picker
if (file == null)
{
    return;
}

MediaEncodingProfile fileProfile = CreateMediaEncodingProfile(file);

// Operate node at the graph format, but save file at the specified format
CreateAudioFileOutputNodeResult fileOutputNodeResult = await graph.CreateFileOutputNodeAsync(file, fileProfile);

if (fileOutputNodeResult.Status != AudioFileNodeCreationStatus.Success)
{
    // TODO: FileOutputNode creation failed, propagate error message
    return;
}

fileOutputNode = fileOutputNodeResult.FileOutputNode;

// Connect the input node to both output nodes
deviceInputNode.AddOutgoingConnection(fileOutputNode);
deviceInputNode.AddOutgoingConnection(deviceOutputNode);

完成所有这些后,您可以录制到文件,同时播放录制的音频,如下所示:

private async Task ToggleRecordStop()
{
    if (recordStopButton.Content.Equals("Record"))
    {
        graph.Start();
        recordStopButton.Content = "Stop";
    }
    else if (recordStopButton.Content.Equals("Stop"))
    {
        // Good idea to stop the graph to avoid data loss
        graph.Stop();
        TranscodeFailureReason finalizeResult = await fileOutputNode.FinalizeAsync();
        if (finalizeResult != TranscodeFailureReason.None)
        {
            // TODO: Finalization of file failed. Check result code to see why, propagate error message
            return;
        }

        recordStopButton.Content = "Record";
    }
}

关于c# - 同时录制音频和播放声音 - C# - Windows Phone 8.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32428000/

相关文章:

windows-phone - 在Windows Phone 8.1上压缩并保存base64图像

c# - 在 Windows Phone 8.1 中使用什么进行 Paypal 付款

c# - 使用 C# 编辑 TFS 团队构建定义

c# - 以编程方式关闭 MessageDialog

c# - 在 C# Windows 应用程序中停止线程应用程序?

c# - 如何禁用 dataGridView 中不可点击的按钮(c# windows 应用程序)

c# - 调整 Datagridview 上的行标题属性

c# - 使用 Response.TransmitFile() 下载 .xlsx 文件

c# - 在 Windows 8 Metro 应用程序上实现 Google Analytics

c# - 使用 3 个整数的值创建饼图