gpt4 book ai didi

c# - 音频的捕获和播放 (WP8.1 XAML)

转载 作者:行者123 更新时间:2023-11-30 19:40:32 25 4
gpt4 key购买 nike

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

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

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

谢谢

最佳答案

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

事实证明项目没有为我构建的原因是因为一个不相关的 VS2013 错误,我按照在线说明修复了该错误(详细信息与本次讨论无关)。

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

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

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

关于c# - 音频的捕获和播放 (WP8.1 XAML),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23048661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com