10.2 . 5 编辑视频 采用与通过UIImagePickerController编辑图像相同的方式,在记录或选取视频时也可以将AllowEditing属性设置为true 。这样,从图像选取器中选取了视频以后,就能够有一个接口对视频进行裁剪。与编辑图像时不同,在完成编辑时,只会使用NSDictionary中的UIImagePickerCon-trollerMediaURL键获得临时裁剪或编辑的视频(而不是原始视频),该键在选择或记录视频后可用。临时创建的视频最终会被设备自动地清除。UIImagePickerControllerMediaURL对象属于NSUrl类型,需要将该视频对象强制转换为NSUrl类型来提取定位该文件所需的Path属性。图 10 - 19 显示了图像选取器视频编辑器的外观。 图 10 - 19 但是,视频选取器不是编辑视频最值得推荐的方式。对于编辑视频而言,最好使用专门的UIVideoEditorController类作为替代。该视频编辑器控制器为您提供了一个编辑窗口,它类似于图像选取器所使用的编辑窗口。然而,注意到用户有两个选项可以选择:Cancel和Save。UIVideoEditorController类对此提供了 3 个不同的事件: UserCancelled 当用户单击Cancel按钮时处理这个事件。 Saved 当用户单击Save按钮时处理该事件。 Failed 当产生无法预料的错误时会引发该事件,例如视频的格式无法编辑这样的错误。 Saved事件返回编辑好的视频文件的路径,Failed事件返回一个NSError对象,UserCancelled事件不会返回任何额外的信息。如果希望获得原始文件的路径,那么可以将发送方强制转换为UIVideoEditorController对象,然后使用该对象的VideoPath属性。 视频编辑器只能用在直屏模式中 有了视频编辑器以后,通过分别设置VideoQuality和VideoMaximumDuration属性,就可以将编辑好的视频设置为较低的质量和强制编辑好的视频具有最大时间长度。 创建视频编辑界面是相当直观的。实例化一个新的UIVideoEditorController,将VideoPath设置为希望编辑的视频的路径,然后将视频编辑器作为一个模态视图展示。因为无法知道运行该应用程序的iPhone是否支持对视频进行编辑,所以需要使用视频编辑器的静态方法CanEditVideoAtPath。传入视频路径,如果该视频可以编辑,那么该方法就返回 true 。程序清单 10 - 14 给出了一个创建专用视频编辑器界面的示例,图 10 - 20 给出了UIVideoEditorController界面的显示外观。 程序清单 10 - 14 使用专用视频编辑器界面 if (UIVideoEditorController.CanEditVideoAtPath(ChosenVideoPath)) { var videoEditor = new UIVideoEditorController(); videoEditor.VideoPath = ChosenVideoPath; videoEditor.Saved += delegate(object sender, UIPathEventArgs e) { this .DismissModalViewControllerAnimated( true ); // Handle edited video with e.Path }; videoEditor.Failed += delegate(object sender, NSErrorEventArgs e) { this .DismissModalViewControllerAnimated( true ); // Handle error here with e.Error }; videoEditor.UserCancelled += delegate(object sender, EventArgs e) { this .DismissModalViewControllerAnimated( true ); // Handle cancel }; this .PresentModalViewController(videoEditor, true ); } 图 10 - 20 10.2 . 6 将视频保存到相册 在将图像保存到相册时,要使用UIImage类上的静态方法保存文件。因为对视频文件的所有引用都使用路径而不是内存中的对象,所以UIVideo静态类提供了将视频保存到相册中所需的方法。视频功能仅限于特定的设备,因此在将视频保存到相册之前,需要检查一下该设备是否能够真正将视频保存到其相册中。静态方法IsCompatibleWithSavedPhotosAlbum提供了这种功能,如果传入可以保存到相册的视频的路径,那么该方法就会返回 true 。 为了将视频保存到相册中,一旦通过检查确定该设备确实可以保存视频,那么就可以使用UIVideo类上的静态方法SaveToPhotosAlbum。将希望保存的视频的路径传入该方法,当保存视频以后会触发一个回调函数。程序清单 10 - 15 给出了完成这些任务的代码。 程序清单 10 - 15 将视频保存到相册 var videoPath = videoSavePath; if (UIVideo.IsCompatibleWithSavedPhotosAlbum(videoPath)) { UIVideo.SaveToPhotosAlbum(videoPath, delegate (string path, NSError errors) { using (var alert = new UIAlertView( "Success" , "Video saved!" , null , "Ok!" , null )) { alert.Show(); } }); }