Воспроизведение видео в фоновом режиме с AVPlayer вызывает проблемы с AspectFill и зацикливанием

Вот что у меня есть, и я хочу, чтобы это видео заполнило весь экран (aspectFill)

playerLayer.videoGravity = kCAGravityResizeAspectFill должен выполнять пропорциональную заливку, но у меня все равно появляются черные полосы вверху и внизу экрана.

Последняя строка должна зацикливать видео, но вместо этого оно просто тускнеет и перестает воспроизводиться.

Любые предложения приветствуются.

var moviePlayer: AVPlayer!

override func viewDidLoad() {
    super.viewDidLoad()    

    // Load the video from the app bundle.
    let videoURL: NSURL = NSBundle.mainBundle().URLForResource("video", withExtension: "mp4")!

    self.moviePlayer = AVPlayer(URL: videoURL)
    self.moviePlayer.muted = true

    let playerLayer = AVPlayerLayer(player: self.moviePlayer)
    playerLayer.videoGravity = kCAGravityResizeAspectFill //this not working
    playerLayer.zPosition = -1

    playerLayer.frame = self.view.frame

    self.view.layer.addSublayer(playerLayer)

    self.moviePlayer.play()

    // Loop video.
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "loopVideo", name: AVPlayerItemDidPlayToEndTimeNotification, object: self.moviePlayer)
}

func loopVideo() {
    self.moviePlayer.play()
}

person Harout360    schedule 03.11.2015    source источник


Ответы (1)


Вы используете неправильное значение гравитации видео, измените его на:

playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;

Обратите внимание, что это значение предназначено для видео, где используемое вами значение используется для масштабирования изображений.

И для того, чтобы ваше видео зациклилось, вы просто забыли перемотать видео после того, как оно закончилось. Я не использую swift, но в Objc C ваша функция loopVideo будет выглядеть так:

-(void) loopVideo {
    [self.moviePlayer seekToTime:kCMTimeZero];
    [self.moviePlayer play];
}
person Rory O'Logan    schedule 03.11.2015