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
    评论
### 回答1: 前端的uinapp是一种跨平台的移动应用开发框架,可以用于实现iOS视频剪辑功能。 要使用uinapp实现iOS视频剪辑,可以采用以下步骤: 1. 首先,需要使用uinapp框架的相关组件来构建界面,包括按钮、文本框、进度条等。可以使用调试工具将这些组件放置在合适的位置,并为它们添加相应的事件处理函数。 2. 接下来,需要在界面上添加视频选择的功能。可以使用组件或者原生API来实现。用户可以通过点击按钮或者拖拽方式选择视频文件。 3. 一旦选择了视频文件,需要先将视频文件上传到服务器进行处理。可以使用HTTP请求将视频文件发送到服务器,并在前端界面上显示上传的进度。 4. 上传完成后,服务器会返回一个视频处理的任务ID。前端需要通过定时轮询或者WebSocket等方式向服务器查询任务的状态。可以在界面上显示任务的进度,并提供取消任务的功能。 5. 当视频处理任务完成时,服务器会将处理后的视频文件发送回前端。前端可以将视频文件保存到本地,并在界面上显示视频的封面和时长信息。 6. 最后,需要添加视频剪辑的功能。可以使用组件或者原生API来实现。用户可以通过拖拽方式选择需要剪辑的区域,并通过界面上的按钮来确认和保存剪辑结果。 综上所述,使用前端的uinapp框架可以实现iOS视频剪辑功能。通过界面的构建、视频选择、上传和处理、任务查询、视频剪辑等步骤,可以完成视频剪辑的操作,并在前端界面上显示相关信息和进度。 ### 回答2: 前端uinapp是一种开发工具,可用于实现iOS视频剪辑功能。iOS视频剪辑的主要目标是允许用户在手机上编辑和修改视频内容,包括裁剪、旋转、添加滤镜和转场效果、调整音频等操作。 在前端uinapp中实现iOS视频剪辑可以按照以下步骤进行: 1. 创建界面:使用前端uinapp的界面组件,设计一个用户友好的界面,包括视频预览窗口、时间轴、编辑工具栏等。 2. 导入视频:提供用户导入视频的功能,可以通过调用iOS原生接口,让用户选择要编辑的视频文件,并将其导入前端uinapp中。 3. 裁剪视频:允许用户在时间轴上选择起始和结束时间点,然后对视频进行裁剪。可以使用前端uinapp的视频处理组件,调整视频播放范围,剔除不需要的部分。 4. 添加滤镜和转场效果:提供一系列滤镜和转场效果供用户选择,并应用到视频中。这可以通过调用您选择的滤镜和效果的API来实现。 5. 调整音频:允许用户对视频的音频进行调整,包括音量、混音等参数的调整。可以使用前端uinapp的音频处理组件,使用户能够更改视频的音频部分。 6. 预览和导出:在界面中提供预览功能,用户可以预览编辑后的视频,确保满足预期效果。一旦满意,用户可以选择导出编辑后的视频,可以使用iOS原生接口导出视频文件。 总结起来,前端uinapp可以通过界面设计、视频导入、裁剪、滤镜和效果应用、音频调整、预览和导出等功能,实现iOS视频剪辑的要求。通过这些步骤,用户可以自由地编辑和修改自己的视频内容,制作出满意的剪辑作品。 ### 回答3: 前端 UINAPP 是一种用于移动应用开发的前端框架,可以用于实现 iOS 视频剪辑功能。 首先,在 iOS 系统中,可以使用 AVFoundation 框架来处理视频和音频。我们可以通过 UINAPP 的前端界面来获取用户选择的视频文件,并将其传递给后端进行处理。 在 UINAPP 中,可以使用 HTML5 的 video 元素来显示视频内容,并通过 JavaScript 控制视频播放。用户可以通过点击界面上的剪辑按钮选择视频的起始和结束时间,并通过 JavaScript 将剪辑的时间参数传递给后端。 接下来,后端可以使用 AVFoundation 框架来剪辑视频。通过 AVAsset 和 AVAssetExportSession 类,我们可以实现视频剪辑和导出功能。根据前端传递的剪辑时间参数,可以使用 AVAsset 类的 timeRange 属性对视频进行裁剪,然后使用 AVAssetExportSession 类将裁剪后的视频导出为新的文件。 最后,后端可以将处理好的剪辑视频文件返回给前端,前端通过 UINAPP 的界面将剪辑后的视频显示给用户。 总结起来,前端 UINAPP 可以实现 iOS 视频剪辑功能的具体步骤如下: 1. 在前端界面中显示视频,并通过 JavaScript 控制视频播放。 2. 用户通过界面按钮选择视频的起始和结束时间。 3. 前端将选择的时间参数传递给后端。 4. 后端使用 AVFoundation 框架对视频进行剪辑。 5. 后端将剪辑后的视频返回给前端。 6. 前端通过 UINAPP 的界面将剪辑后的视频显示给用户。 通过这样的步骤,可以实现在前端 UINAPP 中实现 iOS 视频剪辑的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值