我对使用Xamarin进行开发非常陌生,所以我用C#编写它,因为这是我所知道的。我正在尝试制作一个简单的Watch应用程序,该应用程序将记录音频,然后返回分贝值。我知道这是可能的,因为有一个手表应用程序已经在做类似的事情,但在App Store中却更加复杂。我找到了有关如何在iOS上使用AVAudioRecorder录制音频的示例,但在WatchOS上却找不到任何示例。我没有尝试过任何其他方法,因为我对此并不陌生,并且AVAudioRecorder似乎是最常用的方法。
这是我面临的两个问题:
我已经从avaudiosession开始了音频会话,当我使用AVAudioRecorder.Create()时,它说Create()不是AVAudioRecorder的一部分。有什么需要导入的吗?
当我去调用AVAudioRecorder(变量记录=新的AVAudioRecorder)并且尝试调试时,此刻总是使应用程序崩溃。如果我不使用“ new”,而只是调用例如(_recorder.isMeteringEnabled),则会引发空引用异常。
所有这些代码都在手表的主界面控制器中以及其自身功能内。
我基本上遵循以下示例:https://github.com/xamarin/recipes/tree/master/Recipes/ios/media/sound/record_sound
以下是我的一些录制代码:
// initializing my variables for recording
public partial class InterfaceController : WKInterfaceController
{
public AVAudioPlayer _player;
public AVAudioRecorder _recorder;
}
//my function calling the recording
public void Listen() {
var audioSession = AVAudioSession.SharedInstance();
audioSession.SetCategory(AVAudioSessionCategory.PlayAndRecord);
audioSession.SetActive(true);
string fileName = string.Format("myfile.caf");
string audioFilePath = Path.Combine(Path.GetTempPath(), fileName);
Console.WriteLine("Audio File Path: " + audioFilePath);
NSUrl url = NSUrl.FromFilename(audioFilePath);
Console.WriteLine("Audio File Path: " + url);
//creating values that will be combined with keys to create the dictionary
NSObject[] values = new NSObject[]
{
NSNumber.FromFloat(44100.0f),
NSNumber.FromInt32((int)AudioToolbox.AudioFormatType.LinearPCM),
NSNumber.FromInt32(2),
NSNumber.FromInt32(16),
NSNumber.FromBoolean(false),
NSNumber.FromBoolean(false)
};
NSObject[] keys = new NSObject[]
{
AVAudioSettings.AVSampleRateKey,
AVAudioSettings.AVFormatIDKey,
AVAudioSettings.AVNumberOfChannelsKey,
AVAudioSettings.AVLinearPCMBitDepthKey,
AVAudioSettings.AVLinearPCMIsBigEndianKey,
AVAudioSettings.AVLinearPCMIsFloatKey
};
//set settings with the values and keys to create the dictionary
settings = NSDictionary.FromObjectsAndKeys(values, keys);
try {
_recorder = new AVAudioRecorder(); //CRASHES HERE
}
catch (Exception ex) {
Console.WriteLine("{0} Exception", ex);
}
//_recorder.MeteringEnabled = true;
//_recorder.Record();
//_recorder.UpdateMeters();
//var decibels = _recorder.AveragePower(0);
//Console.WriteLine(decibels);
}