Day10 - 播放一段视频的登录页面

效果图

效果图

<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())
    }

}


所有代码都已经粘贴上来了!

Demo - VideoLoginPage

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,401评论 30 472
  • 1.OC里用到集合类是什么? 基本类型为:NSArray,NSSet以及NSDictionary 可变类型为:NS...
    轻皱眉头浅忧思阅读 5,234评论 0 3
  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 7,361评论 1 14
  • 当拿起笔想记录一些点点滴滴、令人感动而难忘的时候,心里总会有一些忐忑。是啊,谁没有故事,但不一定每个人都酒...
    稻九阅读 1,639评论 0 0
  • 北漂族之歌 20171112 我们都有一个美好的梦, 来自全国各地四面八方, 东西南北中, 为了追求崭新的...
    泥瓦匠长青阅读 2,338评论 0 0

友情链接更多精彩内容