Audio 录制音频的插件
我正在开发一个插件,为Droid、Touch和Phone项目录制音频。我在.Droid项目中做的,它是完美的,100%工作 在.Touch中,我必须实现我的ViewController,这一个将录制音频,很快完成,它必须返回媒体文件 到目前为止,我所做的是: 插件接口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
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