2016-01-25 28 views
1

我如何製作一個沒有聲音播放的本地.mp4文件,因此它只佔用屏幕的一部分並且沒有用戶控制。只是一個循環視頻,有點像一個GIF。我正在使用xcodeswift2我如何製作一個快速循環的視頻

class ViewController: UIViewController { 

    var playerViewController = AVPlayerViewController() 
    var playerView = AVPlayer() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

    } 

    override func viewDidAppear(animated: Bool) { 
     var fileURL = NSURL(fileURLWithPath: "/Users/Mantas/Desktop/123/123/video-1453562323.mp4.mp4") 
     playerView = AVPlayer(URL: fileURL) 

     playerViewController.player = playerView 

     self.presentViewController(playerViewController, animated: true){ 

      self.playerViewController.player?.play() 

     } 
    } 
} 

我做這個,它播放視頻,但在全屏幕,我不知道如何使它只佔據屏幕的一部分,如何使它循環

回答

4

添加觀察者時視頻要完成你可以重播視頻

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear() 

    var fileURL = NSURL(fileURLWithPath: "/Users/Mantas/Desktop/123/123/video-1453562323.mp4.mp4") 
    playerView = AVPlayer(URL: fileURL) 

    NSNotificationCenter.defaultCenter().addObserver(self, 
    selector: "playerItemDidReachEnd:", 
    name: AVPlayerItemDidPlayToEndTimeNotification, 
    object: self.playerView.currentItem) // Add observer 

    playerViewController.player = playerView 

    //amend the frame of the view 
    self.playerViewController.player.frame = CGRectMake(0, 0, 200, 200) 
    //reset the layer's frame, and re-add it to the view 
    var playerLayer: AVPlayerLayer = AVPlayerLayer.playerLayerWithPlayer(self.playerView) 
    playerLayer.frame = videoHolderView.bounds 
    videoHolderView.layer.addSublayer(playerLayer) 

    /* Full Screen 
    self.presentViewController(playerViewController, animated: true){ 

     self.playerViewController.player?.play() 

    } */ 
} 

func playerItemDidReachEnd(notification: NSNotification) { 
    self.playerView.seekToTime(kCMTimeZero) 
    self.playerView.play() 
} 
+0

謝謝,我將如何去添加一個框架,而不是全屏播放? – snukumas

+0

更新了ans你可以accpet如果如果有幫助 –

+0

它有一個竅門!但循環不是無縫的。它與播放之間有一定差距 –

2

替代版本雨燕3.0:

添加這些屬性:

fileprivate var player: AVPlayer? { 
    didSet { player?.play() } 
} 

fileprivate var playerObserver: Any? 

添加到您的DEINIT:

deinit { 
    guard let observer = playerObserver else { return } 
    NotificationCenter.default.removeObserver(observer) 
} 

添加此功能:

func videoPlayerLayer() -> AVPlayerLayer { 
    let fileURL = URL(fileURLWithPath: mediaPath) 
    let player = AVPlayer(url: fileURL) 
    let resetPlayer = { 
     player.seek(to: kCMTimeZero) 
     player.play() 
    } 
    playerObserver = NotificationCenter.default.addObserver(forName: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: nil) { notification in 
     resetPlayer() 
    } 
    self.player = player 
    return AVPlayerLayer(player: player) 
} 

那麼無論你覺得自己(的viewDidLoad,viewDidAppear,viewDidFinishLayingOutSubviews)添加到您的層:

let playerLayer = videoPlayerLayer() 
playerLayer.frame = view.bounds 
view.layer.insertSublayer(playerLayer, at: 0) 
+0

這真是太棒了,謝謝!我認爲我們應該把fileURL作爲參數。 func videoPlayerLayer(fileURL:URL) - > AVPlayerLayer –

+0

這不是正確的答案 –

0

對於沒有黑色背景的無暇重複視頻SH。使用AVPlayerLooper像這樣:

private var player: AVQueuePlayer! 
private var playerLayer: AVPlayerLayer! 
private var playerItem: AVPlayerItem! 
private var playerLooper: AVPlayerLooper! 

override func viewDidLoad(){ 
    super.viewDidLoad() 

    let path = Bundle.main.path(forResource: "background_cloudy", ofType: "mov") 
    let pathURL = URL(fileURLWithPath: path!) 
    let duration = Int64(((Float64(CMTimeGetSeconds(AVAsset(url: pathURL).duration)) * 10.0) - 1)/10.0) 

    player = AVQueuePlayer() 
    playerLayer = AVPlayerLayer(player: player) 
    playerItem = AVPlayerItem(url: pathURL) 
    playerLooper = AVPlayerLooper(player: player, templateItem: playerItem, 
            timeRange: CMTimeRange(start: kCMTimeZero, end: CMTimeMake(duration, 1))) 
    playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill 
    playerLayer.frame = view.layer.bounds 
    view.layer.insertSublayer(playerLayer, at: 1) 
}