C# 捕获和播放音频(WP8.1 XAML)

C# 捕获和播放音频(WP8.1 XAML),c#,windows-phone-8,windows-phone-8.1,C#,Windows Phone 8,Windows Phone 8.1,我正试图掌握从手机捕获音频然后允许播放的基本知识。 目前我有一个“开始”按钮和一个“结束”按钮。 “开始”按钮调用异步“CaptureAudio”方法,“结束”按钮调用“StopCapture”异步方法: private async void CaptureAudio() { _mediaCaptureManager = new MediaCapture(); var settings = new MediaCaptureInitializationSettings();

我正试图掌握从手机捕获音频然后允许播放的基本知识。
目前我有一个“开始”按钮和一个“结束”按钮。
“开始”按钮调用异步“CaptureAudio”方法,“结束”按钮调用“StopCapture”异步方法:

private async void CaptureAudio()
{
    _mediaCaptureManager = new MediaCapture();
    var settings = new MediaCaptureInitializationSettings();
    settings.StreamingCaptureMode = StreamingCaptureMode.Audio;
    settings.MediaCategory = MediaCategory.Other;
    settings.AudioProcessing = (_rawAudioSupported && _userRequestedRaw) 
        ? AudioProcessing.Raw 
        : AudioProcessing.Default;

    await _mediaCaptureManager.InitializeAsync(settings);
}

private async void StopCapture()
{
    await _mediaCaptureManager.StopRecordAsync();
}
我通过MSDN查看了一些示例,但不幸的是,这些示例和文档似乎没有提供完整的用于捕获音频的示例代码(MSDN文档给出了一个通过MediaCapture类捕获视频的示例,我在MSDN上看到了一个示例代码项目,我下载了该项目,但由于没有构建,该项目似乎不起作用)

我希望能在用户请求时再次播放录制的音频。
我的一个疑问是,我是否必须保存录制的音频并将其保存到手机的磁盘上,或者我是否可以将其保存在内存中,然后从内存中播放音频。
我应该如何处理这个问题

我不是在寻找确切的答案,即使是其他样本或文档的链接也会对我有所帮助

谢谢

我一直在学习如何录制和播放音频,这对我来说真的很有用

事实证明,项目没有为我构建的原因是因为一个无关的VS2013 bug,我在线修复了以下说明(细节与本次讨论无关)

为了回答我自己的问题,“MediaCapture”类是正确使用的类。需要注意的是,该类是新API的一部分,该API可用于Windows 8.1和Windows Phone 8.1上的Windows应用商店应用程序

由于目前还没有太多的代码示例,我将分享我自己在WP8.1上录制和播放音频的粗略代码。这些代码被剥离到最基本的部分,这里没有真正的错误处理或任何东西。在前端(XAML),我只有两个带有OnClick事件的按钮,用于启动和停止音频录制

以下是我的全局变量:

    private MediaCapture _mediaCaptureManager;
    private StorageFile _recordStorageFile;
    private bool _recording;
    private bool _suspended;
    private bool _userRequestedRaw;
    private bool _rawAudioSupported;
    private TypedEventHandler
        <SystemMediaTransportControls, SystemMediaTransportControlsPropertyChangedEventArgs> _mediaPropertyChanged;
在UI上发生单击事件后,我调用此代码开始录音:

private async void CaptureAudio()
{
    try
    {
        Debug.WriteLine("Starting record");
        String fileName = AUDIO_FILE_NAME;

        _recordStorageFile = await KnownFolders.VideosLibrary.CreateFileAsync(fileName, CreationCollisionOption.GenerateUniqueName);

        Debug.WriteLine("Create record file successfully");

        MediaEncodingProfile recordProfile = MediaEncodingProfile.CreateM4a(AudioEncodingQuality.Auto);

        await _mediaCaptureManager.StartRecordToStorageFileAsync(recordProfile, this._recordStorageFile);

        Debug.WriteLine("Start Record successful");
    }
    catch(Exception e)
    {
        Debug.WriteLine("Failed to capture audio");
    }
}
        /// <summary>
    /// Stop recording and play it back
    /// </summary>
    private async void StopCapture()
    {
        Debug.WriteLine("Stopping recording");
        await _mediaCaptureManager.StopRecordAsync();
        Debug.WriteLine("Stop recording successful");

        var stream = await _recordStorageFile.OpenAsync(FileAccessMode.Read);
        Debug.WriteLine("Recording file opened");

        playbackElement1.AutoPlay = true;
        playbackElement1.SetSource(stream, _recordStorageFile.FileType);
        playbackElement1.Play();
    }
这利用了.NET 4.5的新功能,因此初始化和启动录制以及停止和播放录制的调用是异步的,这样UI就不会被阻塞,同时我们还可以继续执行其他任务

在发生停止录制的单独单击事件时,我调用此代码,将音频录制保存到“VideosLibrary”文件夹中的一个文件中,然后立即播放录制:

private async void CaptureAudio()
{
    try
    {
        Debug.WriteLine("Starting record");
        String fileName = AUDIO_FILE_NAME;

        _recordStorageFile = await KnownFolders.VideosLibrary.CreateFileAsync(fileName, CreationCollisionOption.GenerateUniqueName);

        Debug.WriteLine("Create record file successfully");

        MediaEncodingProfile recordProfile = MediaEncodingProfile.CreateM4a(AudioEncodingQuality.Auto);

        await _mediaCaptureManager.StartRecordToStorageFileAsync(recordProfile, this._recordStorageFile);

        Debug.WriteLine("Start Record successful");
    }
    catch(Exception e)
    {
        Debug.WriteLine("Failed to capture audio");
    }
}
        /// <summary>
    /// Stop recording and play it back
    /// </summary>
    private async void StopCapture()
    {
        Debug.WriteLine("Stopping recording");
        await _mediaCaptureManager.StopRecordAsync();
        Debug.WriteLine("Stop recording successful");

        var stream = await _recordStorageFile.OpenAsync(FileAccessMode.Read);
        Debug.WriteLine("Recording file opened");

        playbackElement1.AutoPlay = true;
        playbackElement1.SetSource(stream, _recordStorageFile.FileType);
        playbackElement1.Play();
    }
//
///停止录音并播放
/// 
私有异步void StopCapture()
{
Debug.WriteLine(“停止录制”);
等待_mediaCaptureManager.StopRecordAsync();
Debug.WriteLine(“停止录制成功”);
var stream=await\u recordStorageFile.OpenAsync(FileAccessMode.Read);
Debug.WriteLine(“记录文件已打开”);
playbackElement1.AutoPlay=true;
playbackElement1.SetSource(流,_recordStorageFile.FileType);
playbackElement1.Play();
}
我应该注意到,要播放录音,我必须在我的应用程序中的XAML中添加一个

    <Canvas x:Name="playbackCanvas1">
        <MediaElement x:Name="playbackElement1" />
    </Canvas>


另一个从Microsoft文档和代码示例中看不明显的注意点是,您还需要在应用程序清单文件中启用“麦克风”和“视频库”权限。要做到这一点,请单击解决方案资源管理器中的.appmanifest文件,该文件将位于项目的根级别。从那里,单击“C”“功能”选项卡,从那里您可以启用麦克风和视频库。

这些是Silverlight API。您是否尝试在通用应用程序中使用它?我不确定它们之间的区别,但我只是尝试开发一个常规的WP8.1应用程序。我遵循了dev.windowsphone.com的链接。您需要区分不同的应用程序iversal应用程序和Silverlight应用程序。检查你的代码,这应该是相当明显的。实际上,从Windows Phone文档中,HTML和XAML应用程序之间的区别似乎是存在的,我实际上没有看到任何对Silverlight的引用。因此,实际上我的应用程序是一个XAML应用程序。不,Silverlight和Universal应用程序之间有很大的区别。谢谢我在很多地方都知道:)API支持后台双向调用记录吗?