IOS 视频播放、剪辑(一)

23、视频播放、编辑
 
 
 
 
  
 
转载: http://www1.huachu.com.cn/read/readbookinfo.asp?sectionid=1000006772
 
 
对于不同的设备,视频功能是各不相同的。所有的设备都能够回放视频,但是仅有iPhone 3GS设备有记录视频的能力。对于每个设备而言,都存在API能够让您检测哪些功能是可用的和哪些功能是不可用的,这样就能够针对使用视频功能的所有用户创建优秀的用户体验。这一节内容讨论如何才能将视频集成到应用程序中,以及如何才能使用特定的设备记录视频。
 
10.2.1  播放视频
 
iPhone SDK提供了一个简单的控制器来在应用程序中播放视频。MPMoviePlayerController类位于MonoTouch.MediaPlayer名称空间中,它提供了播放影片、准备播放影片和停止播放影片的功能。程序清单10-9说明了如何开始播放视频。第一行代码显示的是实例化一个新的影片播放器对象,并将视频内容文件路径传入其构造函数内。第二行代码简单地调用了Play方法,该方法显示影片播放器并开始播放视频。
 
程序清单10-9  播放视频文件
 
var player = new MPMoviePlayerController(NSUrl.FromFilename("video.mp4"));
 
player.Play();
 
如果希望使用外部视频,并以渐进方式下载视频,而不是直接播放设备上的视频,那么就要使用NSUrl的FromString方法,而不是使用FromFilename,并将视频的URL地址传入其中。当然,需要使用自己的外部视频替换这里的URL字符串。
 
var videoUrl = NSUrl.FromString("http://example.com/video.mp4")
 
var player = new MPMoviePlayerController(videoUrl);
 
player.Play();
 
您也许会注意到,在视频开始播放之前有一个短暂的缓冲周期。这就是所谓的预加载过程。可以设置视频播放器上的通知,在视频已经开始预加载时让其引发一条消息,这样就能够显示加载屏幕,然后在预加载完成后开始显示视频。当视频完成播放或者用户改变视频的缩放比例时,也可以使用通知引发消息。
 
使用NSNotificationCenter类的DefaultCenter属性添加观察者,从而在通知产生时引发这些消息。可以将观察者看作将事件添加到特定动作上的一种方式,使用字符串作为创建这些事件的方式,而不是使用您也许已经熟悉的C#内的强类型事件。对于本示例而言,只需要使用通知MPMoviePlayerContentPreloadDidFinishNotification和MPMoviePlayerPlaybackDid- FinishNotification。另一个通知名为MPMoviePlayerScalingModeDidChangeNotification。还要添加两个NSObject类型的类变量,它们可以作为预加载和回放完成的观察者。使用AddObserver方法,为每个观察者传入一个动作方法,当通知被调用时这些动作方法就会运行。可以使用Lambda表达式以内联方式放置这段代码。当预加载通知被激活以后,只需要开始播放视频,因此可以调用MPMoviePlayerController上的Play方法;当回放通知激活以后,需要移除观察者,并清除影片播放器实例。可以使用活动指示器确保让用户知道当应用程序启动时正在预加载视频。程序清单10-10给出了完成这项工作的示例代码。同样,需要确保改变第8行代码中的URL,让其指向选择的外部视频。
 
程序清单10-10  使用影片播放器观察者
 
MPMoviePlayerController moviePlayer;
 
NSObject didFinishPreload, didFinishPlayback;
 
 
public override void ViewDidLoad()
 
{
 
  base.ViewDidLoad ();
 
  
 
  var videoUrl = NSUrl.FromString("http://example.com/video.mp4");
 
  moviePlayer = new MPMoviePlayerController(videoUrl);
 
  
 
  activityIndicator.StartAnimating();
 
 
  var centre = NSNotificationCenter.DefaultCenter;
 
  var preloadFinish = "MPMoviePlayerContentPreloadDidFinishNotification";
 
  didFinishPreload = centre.AddObserver(preloadFinish,
 
     (notify) => {
 
        Console.WriteLine ("Start playing movie");
 
        activityIndicator.StopAnimating();
 
        moviePlayer.Play();
 
     });
 
 
  var playbackFinished = "MPMoviePlayerPlaybackDidFinishNotification";
 
  didFinishPlayback = centre.AddObserver(playbackFinished,
 
     (notify) => {
 
        Console.WriteLine ("Movie finished, Clean up");
 
 
        centre.RemoveObserver(didFinishPreload);
 
        centre.RemoveObserver(didFinishPlayback);
 
 
        activityIndicator.Hidden = true;
 
 
        moviePlayer.Dispose();
 
        moviePlayer = null;
 
     }); }
 
}
 
10.2.2  定制视频播放器
 
影片播放器提供的功能是相当有限的,仅允许对两个属性根据需要进行调整,这两个属性是ScalingMode和MovieControlMode。
 
缩放模式对播放影片的长宽比进行设置。可用的长宽比选项为Fill、AspectFill、AspectFit和None。
 
Fill选项用于让视频填满整个屏幕,这样视频的边缘会与屏幕吻合,但是可能无法保持原有的长宽比。
 
AspectFill选项在视频填满整个屏幕时不会扭曲视频,但是确实会对视频进行裁剪,这样视频才能够无缝地填满这个屏幕。
 
AspectFit选项会保留视频原有的长宽比,并让视频的边缘尽可能地与屏幕吻合,但如果视频不是完全吻合,那么可能会露出背景视图。
 
None选项不会调整视频,而是按照视频自身的大小进行播放。
 
使用MPMovieScalingMode枚举,可以将ScalingMode设置为这个列表中的任何选项。参见图10-10~图10-13,其中给出了每一种缩放模式的示例。播放器的背景设置为蓝色(在这些图中,背景是以浅灰色打印版本进行显示的),因此可以看到视频大小和播放器大小之间的差异。注意,在这个示例中,Aspect Fit和Fill视频是一样的。这是因为视频的当前长宽比允许视频的边缘与屏幕吻合,而无须改变长宽比。
 
 
图  10-10                                      图  10-11 
 
 
图  10-12                                    图  10-13 
 
另外一个可以针对视频播放器修改的属性是MovieControlMode。使用MPMovieControlMode枚举,可以将控件模式设置为Default、Hidden或VolumeOnly。图10-14和图10-15给出了Default和VolumeOnly控件模式。Hidden模式隐藏了屏幕上所有默认的动作;如果希望让自己提供的用户界面位于视频的上方,那么该模式就很有用。
 
 
图  10-14                                     图  10-15 
 
影片播放器本身是作为一个关键窗口出现在屏幕上的。为了将自定义界面添加到影片播放器关键窗口的上方,可以从应用程序中具有的窗口列表内获取该关键窗口的引用(关键窗口在本质上是窗口框架内可以获得的最顶层的可见视图)。然后可以简单地将子视图添加到影片播放器关键窗口中。因为影片播放器是以横屏模式出现的,所以必须对叠加视图进行变换,从而使其能够与横屏模式匹配。程序清单10-11说明了如何使用代码实现此处提到的所有内容。
 
程序清单10-11  在视频播放器上叠加视图
 
public MPMoviePlayerController mPlayer;
 
 
public override void ViewDidLoad ()
 
{
 
  base.ViewDidLoad ();
 
 
  var button = UIButton.FromType(UIButtonType.RoundedRect);
 
  button.Frame = new RectangleF(0f, 20f, 320f, 40f);
 
  button.SetTitle("Play Video", UIControlState.Normal);
 
  button.TouchUpInside += delegate(object sender, EventArgs e)
 
  {
 
     PlayMovie ();
 
 
     var windows = UIApplication.SharedApplication.Windows;
 
     if(windows.Count() > 1)
 
     {
 
        var moviePlayerWindow = UIApplication.SharedApplication.KeyWindow;
 
        var customView = new MyOverlayView(this);
 
        moviePlayerWindow.AddSubview(customView);
 
     }
 
  };
 
  this.View.AddSubview(button);
 
}
 
 
void PlayMovie ()
 
{
 
  var url = NSUrl.FromFilename("video.mp4");
 
  mPlayer = new MPMoviePlayerController(url);
 
  mPlayer.Play();
 
}
 
 
...
 
 
public class MyOverlayView : UIView
 
{
 
  public MyOverlayView (MainViewController mvc)
 
  {
 
     this.Frame = new RectangleF(0f, 0f, 320f, 480f);
 
     this.Transform = CGAffineTransform.MakeRotation((float)(Math.PI / 2));
 
 
     UIButton button = UIButton.FromType(UIButtonType.RoundedRect);
 
     button.SetTitle("Pause", UIControlState.Normal);
 
     button.Frame = new RectangleF(65f, 360f, 190f, 32f);
 
     button.TouchUpInside += delegate(object sender, EventArgs e) {
 
        Console.WriteLine ("Paused the video");
 
        mvc.mPlayer.Pause();
 
     };
 
 
     this.AddSubview(button);
 
  }
 
}
 
图10-16显示的是在程序清单10-11中创建的叠加视图。
 
 
图  10-16 
 
10.2.3  选取视频
 
为了让用户可以从存储在设备上的视频列表中选取视频,可以使用UIImagePickerController,在本章前面已经使用过该类。因为面向iPhone的视频功能非常类似于摄像头功能,所以看到视频功能属于UIImagePickerController类的组成部分并不令人感到惊奇。在程序清单10-6中,我们使用IsSourceTypeAvailable方法来确定设备是否具有摄像头。因为视频功能仅限于iPhone3GS模型,所以只是弄清楚是否存在摄像头并不足够。这时就需要使用UIImagePickerController类上的AvailableMediaTypes静态方法。
 
AvailableMediaTypes方法以源类型作为输入,返回设备上可用媒体类型的数组。图像的媒体类型为public.image,而视频的媒体类型为public.movie。如果该方法返回public.movie类型,那么可以将UIImagePickerController实例的MediaTypes属性设置为仅有public.movie媒体类型。程序清单10-12给出了以这种方式设置的选取器。
 
程序清单10-12  使用图像选取器控制器选取视频
 
if (HasVideoSupport())
 
{
 
  UIImagePickerController picker = new UIImagePickerController();
 
  picker.SourceType = UIImagePickerControllerSourceType.PhotoLibrary;
 
  picker.MediaTypes = new []{"public.movie"};
 
  picker.Delegate = new MyImagePickerDelegate(this);
 
  this.PresentModalViewController(picker, true);
 
}
 
else
 
{
 
  using (var alert = new UIAlertView("Whoops", "No video support found",
 
                                      null, "Ok!", null))
 
  {
 
     alert.Show();
 
  }
 
}
 
 
...
 
 
bool HasVideoSupport()
 
{
 
  var cameraType = UIImagePickerControllerSourceType.Camera;
 
  var cameraSupport =
 
                 UIImagePickerController.IsSourceTypeAvailable(cameraType);
 
  return (!cameraSupport) ? false :
 
         UIImagePickerController.AvailableMediaTypes(cameraType)
 
                                       .Contains("public.movie");
 
}
 
在显示该选取器时,注意到您只看到了视频,因为视频是可以选取的唯一的媒体类型。图10-17说明了如何显示只选取视频的选取器。
 
 
图  10-17 
 
在选取视频以后,该选取器使用与图像选取器相同的回调:FinishedPickingMedia。NSDictionary带有两个键:UIImagePickerControllerMediaURL和UIImagePickerControllerMediaType。媒体URL包含一个指向所选择视频的临时位置的NSUrl对象。这就是您可以处理视频的地方—— 要么将视频移动到Documents文件夹中,要么通过其他方式使用视频。临时视频存储在应用程序的tmp文件夹中,OS在认为合适的时候会将其清除。
 
10.2.4  记录视频
 
使用iPhone记录视频非常类似于使用iPhone进行拍照。在前一个示例中,可以仅将源类型设置为摄像头而不是图片库的默认源类型,所有这些设置都是为了记录视频而不是拍摄照片。当然,这就是假设您已经使用AvailableMediaTypes方法验证了该设备可以记录视频。注意,摄像头控件会发生变化,从而反映出是记录视频而不是拍摄照片。作为可选项,可以选择通过将ShowsCameraControls设置为false来隐藏摄像头控件;然而,在编写本书的时候,如果不使用默认的摄像头控件,那么还没有方式可以通过编程来记录视频。程序清单10-13是设置UIImagePickerController以记录视频的一个示例。图10-18显示的是视频记录屏幕。
 
程序清单10-13  记录视频
 
public override void ViewDidLoad ()
 
{
 
  base.ViewDidLoad ();
 
 
  UIButton button = UIButton.FromType(UIButtonType.RoundedRect);
 
  button.Frame = new RectangleF(0f, 30f, 320, 40f);
 
  button.SetTitle("Record Video", UIControlState.Normal);
 
  button.TouchUpInside += delegate(object sender, EventArgs e) {
 
 
     var cameraType = UIImagePickerControllerSourceType.Camera;
 
     if(HasVideoSupport())
 
     {
 
        UIImagePickerController picker = new UIImagePickerController();
 
        picker.SourceType = cameraType;
 
        picker.MediaTypes = new []{"public.movie"};
 
        picker.Delegate = new MyImagePickerDelegate(this);
 
        this.PresentModalViewController(picker, true);
 
     }
 
     else
 
     {
 
        using (var alert = new UIAlertView("Whoops",
 
                          "No video support found", null, "Ok!", null))
 
        {
 
           alert.Show();
 
        }
 
     }
 
  };
 
  this.View.AddSubview(button);
 
}
 
 
...
 
 
bool HasVideoSupport()
 
{
 
  var cameraType = UIImagePickerControllerSourceType.Camera;
 
  var cameraSupport =
 
                 UIImagePickerController.IsSourceTypeAvailable(cameraType);
 
  return (!cameraSupport) ? false :
 
         UIImagePickerController.AvailableMediaTypes(cameraType)
 
                                       .Contains("public.movie");
 
}
 
 
图  10-18 
 
在记录视频时,还可以设置视频记录的质量。质量越低,那么得到的视频文件越小。可以像下面的代码这样使用UIImagePickerControllerQualityType枚举设置图像选取器的VideoQuality属性:
 
picker.VideoQuality =  UIImagePickerControllerQualityType.Low;
 
该枚举提供3个质量选项:High、Medium和Low。视频记录中使用的默认设置是Medium。在记录视频时可以使用的另外一个属性是VideoMaximumDuration,这个属性用于设置记录视频的最长持续时间(单位为秒)。视频最长可以是10分钟,记录视频的默认时间值也是10分钟。

转载于:https://my.oschina.net/hantianyu/blog/368547

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值