Audio 录制音频的插件

Audio 录制音频的插件,audio,plugins,touch,mvvmcross,viewcontroller,Audio,Plugins,Touch,Mvvmcross,Viewcontroller,我正在开发一个插件,为Droid、Touch和Phone项目录制音频。我在.Droid项目中做的,它是完美的,100%工作 在.Touch中,我必须实现我的ViewController,这一个将录制音频,很快完成,它必须返回媒体文件 到目前为止,我所做的是: 插件接口 public interface IMvxAudioChooserService { void RecordAudio(Action<Stream> audioAvailable, Action assumeC

我正在开发一个插件,为Droid、Touch和Phone项目录制音频。我在.Droid项目中做的,它是完美的,100%工作

在.Touch中,我必须实现我的ViewController,这一个将录制音频,很快完成,它必须返回媒体文件

到目前为止,我所做的是:

插件接口

public interface IMvxAudioChooserService
{
    void RecordAudio(Action<Stream> audioAvailable, Action assumeCancelled);
}
谢谢你,
Gabriel

既然您的录制ViewController没有使用任何绑定,也没有ViewModel,那么为什么不直接从
UIViewController
继承,而不是从
MvxViewController
——这意味着MvvmCross不会尝试为其查找MvxViewModelRequest或ViewModel

public class MvxAudioChooserService: MvxTouchTask, IMvxMultimediaChooserService
{
    public MvxAudioChooserService()
    {
        modalHost = Mvx.Resolve<IMvxTouchModalHost>();
    }
    public void RecordAudio(Action<Stream> audioAvailable, Action assumeCancelled)
    {
        var recordAudioViewController = new MvxRecordAudioViewController ();
        recordAudioViewController.AudioAvailable = ProcessAudio;
        modalHost.PresentModalViewController (recordAudioViewController, true);
    }
    public void ProcessAudio(object sender, MvxRecordAudioViewController e)
    {
        //getaudiofromMediaFile
    }
}
public partial class MvxRecordAudioViewController : MvxViewController
{
    private AVAudioRecorder audioRecorder;
    private NSDictionary mediaSettings;
    private NSError audioError = new NSError ();
    private NSUrl mediaURL;
    private Stopwatch stopWatch;
    public string FolderName;
    public EventHandler<MvxAudioRecorderEventArgs> AudioAvailable;


    public MvxRecordAudioViewController () : base ("MvxRecordAudioViewController", null)
    {
        SetDictionarySettingsForAudio ();
    }


    private void SetDictionarySettingsForAudio()
    {
        //Set up the NSObject Array of keys that will be combined with the values to make the NSDictionary
        NSObject[] keys = new NSObject[]
        {
            AVAudioSettings.AVSampleRateKey,
            AVAudioSettings.AVFormatIDKey,
            AVAudioSettings.AVNumberOfChannelsKey,
            AVAudioSettings.AVLinearPCMBitDepthKey,
            AVAudioSettings.AVLinearPCMIsBigEndianKey,
            AVAudioSettings.AVLinearPCMIsFloatKey
        };

        NSObject[] values = new NSObject[]
        {
            NSNumber.FromFloat (44100.0f), //Sample Rate
            NSNumber.FromInt32 ((int)MonoTouch.AudioToolbox.AudioFormatType.MPEG4AAC), //AVFormat
            NSNumber.FromInt32 (2), //Channels
            NSNumber.FromInt32 (16), //PCMBitDepth
            NSNumber.FromBoolean (false), //IsBigEndianKey
            NSNumber.FromBoolean (false) //IsFloatKey
        };

        mediaSettings = NSDictionary.FromObjectsAndKeys (values, keys);
    }

    public override void DidReceiveMemoryWarning ()
    {
        // Releases the view if it doesn't have a superview.
        base.DidReceiveMemoryWarning ();

        // Release any cached data, images, etc that aren't in use.
    }

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        // Perform any additional setup after loading the view, typically from a nib.
    }

    partial void Record (MonoTouch.Foundation.NSObject sender)
    {
        var session = AVAudioSession.SharedInstance();

        NSError error = null;
        session.SetCategory(AVAudioSession.CategoryRecord, out error);
        if(error != null)
        {
            Console.WriteLine(error);
            return;
        }

        session.SetActive(true, out error);
        if(error != null)
        {
            Console.WriteLine(error);
            return;
        }

        if(!PrepareAudioRecording())
        {
            isRecording.Text = "Error preparing";
            return;
        }

        if(!audioRecorder.Record())
        {
            isRecording.Text = "Error preparing";
            return;
        }

        this.stopWatch = new Stopwatch();
        this.stopWatch.Start();
        this.isRecording.Text = "Recording";
        this.recordButton.Enabled = false;
        this.stopButton.Enabled = true;
    }

    partial void Stop (MonoTouch.Foundation.NSObject sender)
    {
        audioRecorder.Stop ();
        AudioAvailable.Invoke (this, new MvxAudioRecorderEventArgs(this.mediaURL));
        DismissViewController (true, () => {});
    }

    bool PrepareAudioRecording()
    {
        //Declare string for application temp path and tack on the file extension
        this.mediaURL =  NSUrl.FromFilename(NSBundle.MainBundle.BundlePath + ((FolderName != "") ? "/" + FolderName : "") + "/AUD" + Guid.NewGuid() + ".aac");

        //Set recorder parameters
        NSError error;
        audioRecorder = AVAudioRecorder.ToUrl(mediaURL, mediaSettings, out error);
        if((audioRecorder == null) || (error != null))
        {
            Console.WriteLine(error);
            return false;
        }

        //Set Recorder to Prepare To Record
        if(!audioRecorder.PrepareToRecord())
        {
            audioRecorder.Dispose();
            audioRecorder = null;
            return false;
        }

        audioRecorder.FinishedRecording += delegate (object sender, AVStatusEventArgs e) {
            audioRecorder.Dispose();
            audioRecorder = null;
            Console.WriteLine("Done Recording (status: {0})", e.Status);
        };

        return true;
    }

    public class MvxAudioRecorderEventArgs : EventArgs
    {
        public NSUrl MediaUrl;

        public MvxAudioRecorderEventArgs(NSUrl mediaUrl)
        {
            this.MediaUrl = mediaUrl;
        }
    }
}
 Request is null - assuming this is a TabBar type situation where ViewDidLoad is called during construction... patching the request now - but watch out for problems with virtual calls during construction