在watchOS Xamarin中录制声音

时间:2018-08-02 23:54:46

标签: c# xamarin watchkit

我对使用Xamarin进行开发非常陌生,所以我用C#编写它,因为这是我所知道的。我正在尝试制作一个简单的Watch应用程序,该应用程序将记录音频,然后返回分贝值。我知道这是可能的,因为有一个手表应用程序已经在做类似的事情,但在App Store中却更加复杂。我找到了有关如何在iOS上使用AVAudioRecorder录制音频的示例,但在WatchOS上却找不到任何示例。我没有尝试过任何其他方法,因为我对此并不陌生,并且AVAudioRecorder似乎是最常用的方法。

这是我面临的两个问题:

  1. 我已经从avaudiosession开始了音频会话,当我使用AVAudioRecorder.Create()时,它说Create()不是AVAudioRecorder的一部分。有什么需要导入的吗?

  2. 当我去调用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);
    }

0 个答案:

没有答案