AVPlayer не воспроизводится и слой не отображается

Я использую проект Objective-C для справки для очень похожего приложения Swift. По сути, видео загружаются в Firebase, а URL-адрес загрузки сохраняется в объекте «Post» и воспроизводится в UITableViewCell после извлечения. В проекте Objective-C (также с использованием Firebase) он работает отлично, но у меня возникли проблемы со Swift.

Код Objective-C внутри ячейки, как я уже сказал, работает отлично.

- (void)playVideoWithURL:(NSURL *)url {

    self.videoPlayer = [[AVPlayer alloc]initWithURL:url];
    AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:self.videoPlayer];
    layer.frame = self.videoView.bounds;
    [layer setVideoGravity:AVLayerVideoGravityResizeAspect];
    [self.videoView.layer addSublayer:layer];

    [self.videoPlayer play]; 

}

Swift Code, также внутри ячейки, не выдает никаких ошибок или сбоев, компилятор говорит, что URL существует, а также проигрыватель и слой (чей фрейм не CGRectZero, это тоже проверил).

@IBOutlet var usernameLabel: UILabel!
@IBOutlet var captionLabel: UILabel!
@IBOutlet var avPlayerView: UIView!

var videoPlayer : AVPlayer!

func playVideoWithURL(url: NSURL) {

    self.videoPlayer = AVPlayer(URL: url)

    let layer = AVPlayerLayer(player: self.videoPlayer)
    layer.frame = avPlayerView.bounds
    layer.videoGravity = AVLayerVideoGravityResizeAspect
    avPlayerView.layer.addSublayer(layer)

    videoPlayer.play()

}

Для простоты я пока не буду публиковать какой-либо код Firebase, поскольку все это работает в проекте Objective-C, а URL-адреса загрузки успешно извлекаются и в проекте Swift, что заставляет меня поверить, что это не имеет ничего общего с проблемой. .

Любые идеи? Это сводит меня с ума. Спасибо!

ОБНОВИТЬ:

AVPlayer на самом деле не проблема, так как он работает с тестовым видео. Проблема связана с Firebase, в настоящее время проводится дальнейшее расследование.


person Echizzle    schedule 13.08.2016    source источник


Ответы (1)


Попробуйте инициализировать плеер с помощью элемента player.

let playerItem = AVPlayerItem(URL: url)
self.videoPlayer = AVPlayer(playerItem: playerItem)

Также следует проверить статус плеера, чтобы точно определить, когда он будет готов к игре с помощью KVO.

См. раздел Как узнать, когда объект AVPlayer готов к воспроизведению.

Ошибка доступна в playerItem.error?, если у игрока статус failed. Проверьте это, чтобы определить проблему.

person Daniel Zhang    schedule 13.08.2016
comment
Нда, еще ничего. Сначала я думал то же самое, но я инициализировал AVPlayer без элемента и только URL-адресом, так что это должно быть что-то еще ... спасибо, хотя - person Echizzle; 13.08.2016
comment
Я добавил некоторые дополнительные вещи, чтобы попробовать мой ответ, чтобы помочь вам отладить проблему. Вы должны сообщать о статусе игрока и любых ошибках, которые вы получаете. - person Daniel Zhang; 13.08.2016
comment
Спасибо, ошибка равна нулю, и элемент существует, показывая URL-адрес загрузки Firebase, как и другой проект, в котором он работает. Я все же посмотрю на КВО. Я просто хочу знать, почему код Objective-C работает так прекрасно, а тот же код Swift — нет. Я знаю, что оба языка работают немного по-разному, но все же! - person Echizzle; 13.08.2016
comment
Большой прорыв, я использовал тестовый URL, и он отлично работает, так что проблема не в AVPlayer. Однако я обнаружил, что, хотя URL-адрес, возвращаемый из firebase, выглядит идентично при входе в консоль, объект Objective-C содержит набор свойств в отладчике, один из которых называется _clients с тем же URL-адресом, приведенным к NSCFString, в то время как версия Swift просто показывает URL. Кроме того, видео проекта Objective-C загружаются как Video/Quicktime, в то время как проект Swift загружается так же, как видео в столбце типа хранилища. Я покажу изображение консоли выше. - person Echizzle; 13.08.2016