我试图掌握从手机中捕获音频然后允许播放的基本知识。
目前我有一个'开始'按钮和结束'按钮。
“开始”按钮调用我的异步' 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上看到了一个示例代码项目,我下载了它,它似乎没有工作,因为它没有构建)。
我要做的就是根据用户要求再次播放录制的音频
我的一个问题是我是否必须保存录制的音频并将其保存到手机磁盘,或者我是否可以将其保存在内存中然后从内存中播放音频。
我该怎么做呢?
我没有找到确切的答案,即使是其他样本或文档的链接也会对我有所帮助。
由于
答案 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;选项卡,然后您可以启用麦克风和视频库。