效果圖
效果圖
<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())
}
}
所有代碼都已經粘貼上來了!