效果图

效果图
<br />
1、UI布局
新建一个ImageView和两个按钮,分别设置背景、字体颜色

结构图如图
2、新建一个父类UIViewController,用来处理视频加载,播放等相关属性
因为文中的注释写的还算详细了,就不做方法介绍了
//
// PQLoginVideoViewController.swift
// VideoLoginPage
//
// Created by ios on 16/9/13.
// Copyright © 2016年 ios. All rights reserved.
//
import UIKit
import AVFoundation
import MediaPlayer
import AVKit
//三种填充方式
public enum PQVideoScalingMode{
case Resize
case ResizeAspect
case ResizeAspectFill
}
class PQLoginVideoViewController: UIViewController {
//播放器
private let pq_moviePlayer = AVPlayerViewController()
//声音级别
private var pq_moviePlayerSoundLevel: Float = 1.0
//视频路径
var pq_contentURL :NSURL = NSURL(){
didSet{
setMoviePlayer(pq_contentURL)
}
}
//视频大小
var pq_videoFrame = CGRect()
//开始时间
var pq_startTime : CGFloat = 0.0
//时长
var pq_duration : CGFloat = 0.0
//把view的背景颜色设置为默认黑色
var pq_backgroundColor : UIColor = UIColor.blackColor(){
didSet{
view.backgroundColor = pq_backgroundColor
}
}
//是否能听到声音
var pq_sound : Bool = true{
didSet{
if pq_sound {
pq_moviePlayerSoundLevel = 1.0
}
else{
pq_moviePlayerSoundLevel = 0.0
}
}
}
//透明度
var pq_alpha : CGFloat = CGFloat(){
didSet{
pq_moviePlayer.view.alpha = pq_alpha
}
}
//是不是重复播放
var pq_alwaysRepeat :Bool = true{
didSet{
if pq_alwaysRepeat {
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(PQLoginVideoViewController.pqLoginVideoPlayEnd), name: AVPlayerItemDidPlayToEndTimeNotification, object: pq_moviePlayer.player?.currentItem)
}
}
}
//填充模式
var pq_fillModel : PQVideoScalingMode = .ResizeAspectFill{
didSet{
switch pq_fillModel {
case .Resize:
pq_moviePlayer.videoGravity = AVLayerVideoGravityResize
case .ResizeAspect:
pq_moviePlayer.videoGravity = AVLayerVideoGravityResizeAspect
case .ResizeAspectFill:
pq_moviePlayer.videoGravity = AVLayerVideoGravityResizeAspectFill
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
//设置视频页面大小,插入到最底层
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
pq_moviePlayer.view.frame = pq_videoFrame
pq_moviePlayer.showsPlaybackControls = false
view.insertSubview(pq_moviePlayer.view, atIndex: 0)
}
//视图移除要把观察者移除
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
NSNotificationCenter.defaultCenter().removeObserver(self)
}
// MARK - method
//设置地址:然后把视频拷贝到Doucument文件夹在,在进行播放
private func setMoviePlayer(url : NSURL){
//创建一个对象
let videoCutter = PQVideoCutter()
//使用子线程的方式把视频拷贝到Doucments文件夹下
videoCutter.cropVideoWithURL(videoURL: url, startTime: pq_startTime, duration: pq_duration) { (videoPath, error) in
if let path = videoPath as NSURL?{
//视频拷贝完成了
//1、设置播放地址
//2、开始播放
//3、设置声音
self.pq_moviePlayer.player = AVPlayer(URL: path)
self.pq_moviePlayer.player?.play()
self.pq_moviePlayer.player?.volume = self.pq_moviePlayerSoundLevel
}
}
}
//监听播放完成了,再次播放
//1、时间归零
//2、开始播放
@objc private func pqLoginVideoPlayEnd(){
pq_moviePlayer.player?.seekToTime(kCMTimeZero)
pq_moviePlayer.player?.play()
}
}
3、写一个类专门用来把视频拷贝到Documents目录下
//
// PQVideoCutter.swift
// VideoLoginPage
//
// Created by ios on 16/9/14.
// Copyright © 2016年 ios. All rights reserved.
//
import UIKit
import AVFoundation
extension String{
var convert : NSString { return (self as NSString) }
}
class PQVideoCutter: NSObject {
func cropVideoWithURL(videoURL url : NSURL,startTime :CGFloat,duration : CGFloat,completion:((videoPath : NSURL? ,error : NSError?) -> Void)?){
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
let asset = AVURLAsset(URL: url, options: nil)
let exportSession = AVAssetExportSession(asset: asset, presetName: "AVAssetExportPresetHighestQuality")
let paths :NSArray = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, .UserDomainMask, true)
var outputURL = paths.objectAtIndex(0) as! String
let manager = NSFileManager.defaultManager()
do{
try manager.createDirectoryAtPath(outputURL, withIntermediateDirectories: true, attributes: nil)
}catch{
}
outputURL = outputURL.convert.stringByAppendingPathComponent("output.mp4")
do{
try manager.removeItemAtPath(outputURL)
}catch{
}
if let exportSession = exportSession as AVAssetExportSession?{
exportSession.outputURL = NSURL(fileURLWithPath: outputURL)
exportSession.shouldOptimizeForNetworkUse = true
exportSession.outputFileType = AVFileTypeMPEG4
let start = CMTimeMakeWithSeconds(Float64(startTime), 600)
let time = CMTimeMakeWithSeconds(Float64(duration), 600)
let range = CMTimeRangeMake(start, time)
exportSession.timeRange = range
exportSession.exportAsynchronouslyWithCompletionHandler({
switch exportSession.status{
case .Completed:
completion?(videoPath: exportSession.outputURL,error: nil)
case .Failed:
print("Failed - \(exportSession.error)")
case .Cancelled:
print("Cancelled - \(exportSession.error)")
default :
print("other error")
}
})
}
}
}
}
4、然后在ViewController中继承刚才写的父类
//
// ViewController.swift
// VideoLoginPage
//
// Created by ios on 16/9/13.
// Copyright © 2016年 ios. All rights reserved.
//
import UIKit
class ViewController: PQLoginVideoViewController {
@IBOutlet weak var registerBtn: UIButton!
@IBOutlet weak var loginBtn: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.blackColor()
setupVideoBackground()
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
registerBtn.layer.cornerRadius = 5
loginBtn.layer.cornerRadius = 5
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
private func setupVideoBackground() {
let url = NSURL.fileURLWithPath(NSBundle.mainBundle().pathForResource("moments", ofType: "mp4")!)
pq_videoFrame = view.frame
pq_fillModel = .ResizeAspectFill
pq_alwaysRepeat = true
pq_sound = true
pq_startTime = 2.0
pq_alpha = 0.8
pq_contentURL = url
view.userInteractionEnabled = false
print(NSHomeDirectory())
}
}
所有代码都已经粘贴上来了!