在 Windows Phone 8.1 中录制音频
这是一个在 Windows Phone 8.1 中录制音频的基本指南。
开篇
本文介绍了一种在 Windows Phone 8.1 中录制音频的简单快捷的方法。由于旧的 Microphone 类不再可用,Windows Phone 8.1 引入了新的 MediaCapture
类,用于整合音频和视频的媒体录制部分。 所以,还等什么,让我们看看如何做吧!
开始工作吧
我为这个设计了一个非常简单的 GUI,它有三个简单的按钮,分别命名为“Capture Audio”(捕获音频)、“Stop Capture”(停止捕获)和“Play Capture”(播放捕获)。 它的外观如下
如果你们想仔细看看背后的 XAML,请看这里
<Page
x:Class="CaptureSoundTest.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:CaptureSoundTest"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid>
<MediaElement x:Name="playbackElement1" ></MediaElement>
<Button x:Name="CaptureButton" Content="Capture Audio" HorizontalAlignment="Center" Margin="0,184,0,0" VerticalAlignment="Top" Click="CaptureButton_Click" Width="145"/>
<Button x:Name="StopCaptureButton" Content="Stop Capture" HorizontalAlignment="Center" Margin="0,284,0,0" VerticalAlignment="Top" Click="StopCaptureButton_Click" Width="145"/>
<Button x:Name="PlayRecordButton" Content="Play Capture" HorizontalAlignment="Center" Margin="0,380,0,0" VerticalAlignment="Top" Click="PlayRecordButton_Click" Width="145"/>
</Grid>
</Page>
它非常基础,我没有做太多事情,只是把按钮放在了合适的位置。 有一个名为 playbackElement1 的 MediaElement 用于播放录制的视频。
现在,是时候填充名为 CaptureButton_Click
、StopCaptureButton_Click
和 PlayRecordButton_Click
的按钮事件了
初始化和捕获音频
要捕获音频,首先需要初始化录制。 在深入研究之前,让我们先初始化一些我们在旅途中可能需要的变量。
private MediaCapture _mediaCaptureManager;
private StorageFile _recordStorageFile;
private bool _recording;
private bool _userRequestedRaw;
private bool _rawAudioSupported;
这里的 MediaCapture
类负责捕获音频和视频。 StorageFile
实例将帮助我们存储、定位和播放设备上录制的媒体。
让我们看看我们的录音初始化方法是什么样的
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);
}
因此,这里做的第一件事是初始化 MediaCapture 类。 每个媒体捕获都与一个 MediaCaptureInitializationSettings
实例相关联。 我们将 StreamingCaptureMode 设置为 Audio,以确保这只是音频录制而不是视频。 之前声明了两个布尔变量,名为 _rawAudioSupported
和 _userRequestedRaw
。 虽然我没有从 GUI 连接它们,但你们绝对可以尝试从 GUI 连接它们,这样你们就可以让应用程序选择录制原始音频还是指向默认音频处理。
接下来要做的是使用提供的设置初始化 _mediaCaptureManager
。 我为 RecordingLimitExceeded 和 Failed 包含了两个事件处理程序。 当然,你们可以在这些情况下编写自己的处理程序。
现在,通常你可以将 InitializeAudioRecording
方法放在你的应用程序初始化的地方。 我把它放在 MainPage 构造函数中。
现在,让我们捕获音频,MediaCapture 类确实让它变得非常容易。
private async void CaptureAudio()
{
try
{
Debug.WriteLine("Starting record");
String fileName = "record.m4a";
_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");
_recording = true;
}
catch (Exception e)
{
Debug.WriteLine("Failed to capture audio");
}
}
如果你仔细查看代码,你会发现我们首先声明了一个文件名。 然后,我们使用 KnownFolders.VideosLibrary.CreateFileAsync
在我们的 VideosLibrary 中创建了一个文件,该文件实际上指向带有给定文件名的 Windows Phone 8.1 的媒体和视频库,我们还给出了一个 CreationCollisionOption.GenerateUniqueName
,它表示如果发生冲突,它将创建一个唯一的名称。 接下来要做的是使用 MediaEncodingProfile
类创建一个录制配置文件,你可以从这里获取所有可能的视频和音频录制配置文件。 我使用 MediaEncodingProfile.CreateM4a(recordProfile, this._recordStorageFile)
方法创建了一个 M4a 音频配置文件。
我们剩下要做的就是开始录制,所以让我们开始录制。 使用 _mediaCaptureManager.StartRecordToStorageFileAsync(recordProfile, this._recordStorageFile)
很容易。
停止录制
停止录制也很容易。 你要做的就是调用 _mediaCaptureManager.StopRecordAsync()
private async void StopCapture()
{
if (_recording)
{
Debug.WriteLine("Stopping recording");
await _mediaCaptureManager.StopRecordAsync();
Debug.WriteLine("Stop recording successful");
_recording = false;
}
}
播放录音
播放录音有点包括两个任务。 首先,我们必须打开录制的文件,然后播放它。 如果你还记得,我们使用 StorageFile _recordStorageFile
来定义我们的文件,它将保存录音。
private async void PlayRecordedCapture()
{
if (!_recording)
{
var stream = await _recordStorageFile.OpenAsync(FileAccessMode.Read);
Debug.WriteLine("Recording file opened");
playbackElement1.AutoPlay = true;
playbackElement1.SetSource(stream, _recordStorageFile.FileType);
playbackElement1.Play();
}
}
所以,让我们打开文件并将结果流分配给 XAML 上 MediaElement 的源。 在这种情况下,它是 playBackElement1
瞧! 你完成了,现在你可以播放你的录音了。 现在你所要做的就是将这三个方法分配给正确的按钮事件。 有关完整源代码,请下载上面的演示项目。