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

时间:2014-04-13 21:28:28

标签: c# windows-phone-8 windows-phone-8.1

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

我要做的就是根据用户要求再次播放录制的音频 我的一个问题是我是否必须保存录制的音频并将其保存到手机磁盘,或者我是否可以将其保存在内存中然后从内存中播放音频。
我该怎么做呢?

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

由于

1 个答案:

答案 0 :(得分:8)

我用来学习如何录制和播放音频的Media capture using capture device sample实际上对我有用。

事实证明,项目不适合我的原因是由于VS2013无关的错误,我在线修复了以下说明(细节与此讨论无关)。

为了回答我自己的问题,媒体采访' class是正确使用的类。需要注意的一点是,此类是新Multimedia 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;

为了初始化设备以便录制音频,我在app初始化时使用了这种方法:

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

这利用了.NET 4.5的新await and async功能,因此初始化和开始录制以及停止和播放录制的调用是异步的,因此UI不是被阻止了,所以我们可以在此期间继续执行其他任务。

在单独的点击事件停止录制时,我调用此代码,将录音保存到&#39; VideosLibrary&#39;文件夹,然后我立即播放录音:

        /// <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>

微软的文档和代码示例中没有明显的另一点需要注意的是,您还需要启用麦克风&#39;和&#39;视频库&#39;应用清单文件中的权限。为此,请单击解决方案资源管理器中的.appmanifest文件,该文件位于项目的根级别。从那里,点击“功能”&#39;选项卡,然后您可以启用麦克风和视频库。