ios - AVPlayer 播放更新标签会导致问题

标签 ios swift avplayer

我在 AVPlayer 播放和同时更新标签方面遇到问题。

我有一个计时器,可以根据播放器的进度更新标签,但这将我的视频卡在同一位置...检查下图。按钮单击计时器启动后会导致问题..

enter image description here

代码:

func playVideo() {
    let path = NSBundle.mainBundle().pathForResource("videoname", ofType:"mp4")
    let fileURL = NSURL(fileURLWithPath: path!)
    
    moviePlayer = AVPlayer(URL: fileURL)
    
    //  Play the video
    moviePlayer!.play()
}

@IBAction func progresss(sender: UIButton) {
    self.meterTimer = NSTimer.scheduledTimerWithTimeInterval(0.1,
        target:self,
        selector:"updateAudioMeter:",
        userInfo:nil,
        repeats:true)
}

func updateAudioMeter(timer:NSTimer) {
    lbltime.text = "\(CMTimeGetSeconds(moviePlayer!.currentItem.currentTime()))"
}  

示例项目链接

Source code

Note:please add video in bundle if you are use sample project.I just delete video because of file size

问题

  • 如何避免这种情况?以及为什么会发生这种情况,因为当我使用 MPMovieController 时它效果很好。

最佳答案

从您的示例代码中,问题出在函数以下:

override func viewDidLayoutSubviews() {
    let layer = AVPlayerLayer(player: moviePlayer)
    layer.frame = self.viewPlayer.frame
    self.viewPlayer.layer.addSublayer(layer)
}

每次标签更新时,这都会调整图层 View 的大小,因此只需删除该代码并将其添加到 playVideo 方法中,您的方法将是:

func playVideo() {

    let path = NSBundle.mainBundle().pathForResource("video", ofType: "MOV")
    let url  = NSURL.fileURLWithPath(path!)
    moviePlayer = AVPlayer(URL: url)
    moviePlayer!.allowsExternalPlayback = false

    var introPlayerLayer = AVPlayerLayer(player: moviePlayer)
    viewPlayer.layer.addSublayer(introPlayerLayer)
    introPlayerLayer.frame = viewPlayer.bounds
    moviePlayer!.play()
}

并在 viewDidAppear 中调用此方法而不是 viewDidLoad 方法,您的完整代码将是:

import UIKit
import MediaPlayer
import AVFoundation

class ViewController: UIViewController {

    var moviePlayer : AVPlayer?
    var meterTimer : NSTimer!
    @IBOutlet weak var viewPlayer: UIView!
    @IBOutlet weak var lbltime: UILabel!

    override func viewDidAppear(animated: Bool) {
        playVideo()
    }

    func playVideo() {

        let path = NSBundle.mainBundle().pathForResource("video", ofType: "MOV")
        let url  = NSURL.fileURLWithPath(path!)
        moviePlayer = AVPlayer(URL: url)
        moviePlayer!.allowsExternalPlayback = false

        var introPlayerLayer = AVPlayerLayer(player: moviePlayer)
        viewPlayer.layer.addSublayer(introPlayerLayer)
        introPlayerLayer.frame = viewPlayer.bounds
        moviePlayer!.play()
    }

    @IBAction func progresss(sender: UIButton) {

        moviePlayer?.seekToTime(kCMTimeZero)
        moviePlayer?.addPeriodicTimeObserverForInterval(CMTimeMakeWithSeconds(1, 1), queue: nil, usingBlock: {
            (CMTime) -> Void in

            self.updateProgressBar()
        })

    }

    func updateProgressBar(){
        var timeNow = Int(self.moviePlayer!.currentTime().value) / Int(self.moviePlayer!.currentTime().timescale)

        var currentMins = timeNow / 60
        var currentSec = timeNow % 60

        var duration: String = "\(currentMins):\(currentSec)"

        self.lbltime.text = duration
    }
}

关于ios - AVPlayer 播放更新标签会导致问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32623767/

相关文章:

ios - 从 View Controller 调用应用程序委托(delegate)方法

iphone - 产生两个数字的每个组合,例如 1000

ios - NavigationLink 似乎只占用一点空间

ios - 如何让 AVPlayer 立即出现而不是在视频结束后出现?

swift - 如何使用 swift 2.2 从 'performSegueWithIdentifier' 按钮将视频字段传递给 AVPlayer Controller

ios - AVPlayer 在缓冲时显示和隐藏加载指示器

ios - "Value of type ' (CGRect) -> CGRect' has no member 'height' "是什么意思?

ios - 请求spring mvc服务器资源在iOS上无法播放mp4,但在Nginx上可以直接访问mp4文件

ios - Xcode 6 Beta 5 Swift 错误 : Class Exists in libswift_stdlib_core. dylib 和 libswiftCore.dylib。哪个是未定义的

ios - Swift:复制文件会出现 Cocoa 错误 262