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

本文关键字:WP8 XAML 音频 播放 | 更新日期: 2023-09-27 17:58:19

我正在尝试掌握从手机捕获音频然后允许播放的基本知识
目前我有一个"开始"按钮和一个"结束"按钮
"开始"按钮调用我的异步"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上看到了一个我下载的示例代码项目,它似乎不起作用,因为它没有构建)。

我想做的是根据用户的要求再次播放录制的音频
我的一个问题是,我是否必须保存录制的音频并将其保存到手机的磁盘上,或者我是否可以简单地将其保存在内存中,然后从内存中播放音频
我应该如何处理?

我不是在寻找确切的答案,即使链接到其他样品或文件也会帮助我。

感谢

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

我一直用来学习如何录制和播放音频的使用捕获设备示例的媒体捕获实际上对我很有用。

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

为了回答我自己的问题,"MediaCapture"类是正确的类。需要注意的一点是,这个类是新的多媒体API的一部分,它既适用于Windows 8.1上的Windows应用商店应用程序,也适用于Windows Phone 8.1。

由于目前还没有大量的代码示例,我将分享我自己在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;

为了初始化设备以录制音频,我在应用程序初始化中使用了这种方法:

private async void InitializeAudioRecording()
{
    _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);
    Debug.WriteLine("Device initialised successfully");
    _mediaCaptureManager.RecordLimitationExceeded += new RecordLimitationExceededEventHandler(RecordLimitationExceeded);
    _mediaCaptureManager.Failed += new MediaCaptureFailedEventHandler(Failed);
}

在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");
    }
}

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

        /// <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();
    }

我应该注意到,为了回放录音,我必须在我的应用程序中的XAML中添加一个,例如

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

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