Воспроизведение видео в iOS в пользовательском представлении

Я пытаюсь создать простое приложение, которое позволяет мне записывать видео, а затем смотреть его. Я использую два вида: AVCamPreviewView в левой части экрана (который отображает видеопоток в реальном времени с камеры iPhone) и AVPlayerLayerView в правой части экрана (который должен отображать видео после его записи и сохранения). в папку документов приложения).

В то время как первая часть (отображение прямой трансляции) работает как шарм (для справки я использовал Apple AVCam-tutorial), вторая не работает: я могу запустить воспроизведение записанного видео: звук начинает воспроизводиться, но я не могу видеть что-нибудь, и я понятия не имею, почему это так.

Вот мой AVPlayerLayerView-класс:

//
//  AVPlayerLayerView.swift
//  AVCamSwift
//

import UIKit
import AVFoundation

class AVPlayerLayerView: UIView {
    var player: AVPlayer = AVPlayer()
    var avPlayerLayer: AVPlayerLayer!

    override init(frame: CGRect) {
        super.init(frame: frame)
        print("AVPlayerLayerView -> init with frame")

        inits()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        print("AVPlayerLayerView -> init with coder")

        inits()
    }

    private func inits() {
        let rootLayer: CALayer = self.layer
        rootLayer.masksToBounds = true

        avPlayerLayer = AVPlayerLayer(player: player)
        rootLayer.insertSublayer(avPlayerLayer, atIndex: 0)
    }

    func setContentUrl(url: NSURL) {
        print("Setting up item: \(url)")
        let item = AVPlayerItem(URL: url)
        player.replaceCurrentItemWithPlayerItem(item)
    }

    func play() {
        if (player.currentItem != nil) {
            print("Starting playback!")
            player.play()
        }
    }

    func pause() {
        player.pause()
    }

    func rewind() {
        player.seekToTime(CMTime(seconds: 0, preferredTimescale: 1))
    }

    func stop() {
        pause()
        rewind()
    }
}

Воспроизведение видео должно начаться при нажатии соответствующей кнопки, и вот код, который запускает воспроизведение:

@IBAction func playVideoTap(sender: AnyObject) {
    if let rfp = recordingFilePath {
        playbackView.setContentUrl(rfp)
        playbackView.play()
    }
}

Как упоминалось ранее: Audio-Playback работает, но я ничего не вижу, поэтому я предполагаю, что мне нужно изменить положение AVPlayerLayer в моем AVPlayerLayerView-Class или что-то в этом роде. Есть идеи?

И вот фрагмент макета, на всякий случай, если это поможет... Макет

РЕДАКТИРОВАТЬ:

Благодаря ответу Раджеша я наконец-то могу воспроизвести видео. Однако записанное видео отображается не внутри правой серой области экрана, а внутри крошечного квадрата вверху посередине экрана (см. снимок экрана). Есть идеи, как это исправить? Кроме того, соотношение сторон не такое, как в режиме записи...

Неверное расположение AVPlayerLayer


person Christian    schedule 02.01.2016    source источник


Ответы (2)


Вы забыли установить границы для слоя avplayer.

private func inits() {

        //let rootLayer: CALayer = self.layer
       // rootLayer.masksToBounds = true

        avPlayerLayer = AVPlayerLayer(player: player)
        avPlayerLayer.bounds = self.bounds
       // avPlayerLayer.backgroundColor = UIColor.yellowColor().CGColor
        self.layer.insertSublayer(avPlayerLayer, atIndex: 0)
    }
person Rajesh    schedule 02.01.2016
comment
Спасибо, Раджеш, этот ответ очень помог, однако поведение не так, как предполагалось. Пожалуйста, смотрите редактирование моего вопроса выше. У вас есть идеи, как встать на правильный путь? - person Christian; 03.01.2016

Круто, нашел решение. Во-первых, ответ Раджеша мне очень помог, поэтому он получит мою галочку, во-вторых, добавив

avPlayerLayer.bounds = self.layer.bounds
avPlayerLayer.frame = CGRectMake(0, 0, self.layer.frame.width,     self.layer.frame.height)

мой метод play() помог. Установка границ в методе inits(), как показано Раджешем, оставляет вас с проблемой, что границы устанавливаются до появления представления, и поэтому значения могут быть неправильными. Установка рамки, как было предложено выше, помогает правильно расположить CAPlayerLayer, а также настроить соотношение сторон, как предполагалось!

person Christian    schedule 03.01.2016