2016-12-09 12 views
1

This question имеет ту же проблему, но решения не работают.AVPlayer blank video: воспроизведение звука, но нет видео

AVPlayer иногда играет пустое видео: есть звук, но нет видео.

Пока были воспроизведены пустые видеоролики, мы напечатали рамку и статус игрока. Кадр был отличным от нуля и был правильно установлен. Статус также был readyToPlay. Функция play также вызывается в основном потоке.

Другими словами, рамка для слоя игрока действительна, и игрок также готов к игре. Но видео не появляется, хотя звук звучит.

Проблема, похоже, одна. Если мы подождем 5-10 секунд перед воспроизведением видео, видео будет отлично работать каждый раз. на 10 прошивке появляется

Этот вопроса, не IOS 8 или 9.

This thread на форумах Apple, предполагает, что это может быть ошибкой, связанной с AVVideoCompositionCoreAnimationTool, которые мы используем.

Любые решения?

Это происходит чаще на устройствах iPhone 7, чем на устройствах iPhone 5s.

Код:

fileprivate func playVideo(_ videoURL: String, prompt: String) { 
    // Show <playerView> 
    playerView.isHidden = false 

    // Use new video in player 
    playerItem = AVPlayerItem(url: URL(fileURLWithPath: videoURL)) 


    print("STATUS: \(player.status == AVPlayerStatus.readyToPlay). FRAME: \(playerLayer.frame). MAIN THREAD: \(Thread.isMainThread)") 


    player.replaceCurrentItem(with: playerItem) 

    // Start playing video 
    player.seek(to: kCMTimeZero) 
    player.actionAtItemEnd = .none 
    player.play() 
} 
+0

Вы не можете найти здесь ваш код? а также размер игрока, отображаемый на экране – Horst

+0

@ Уверенный обновленный вопрос. благодаря! – Crashalot

+0

Можете ли вы поместить проект на github, который воспроизводит проблему? –

ответ

0

В случае возникновения этой проблемы проблема связана с ошибкой iOS. Проблема не возникает на устройствах iOS 8/9, только на новых устройствах iOS 10.Начиная с iOS 10.2, проблема исчезает.

К сожалению, до сих пор нет программного решения для 10.0.x или 10.1.x.

0

Я думаю, вы должны играть с AVPlayerViewController или AVPlayerLayer.

AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player]; 

//set player layer frame and attach it to our view 
playerLayer.frame = self.containerView.bounds; 
[self.containerView.layer addSublayer:playerLayer]; 

//play the video 
[player play]; 

От Apple doc:

AVPlayer и AVPlayerItem являются невизуальными объектов означает, что на их самостоятельно не в состоянии представить видео актива на экране. У вас есть два основных подходов, которые можно использовать, чтобы представить свое видео на экране:

AVKit: Лучший способ представить свой видеоконтент с помощью класса AVPlayerViewController фреймворки AVKit в Иос и tvOS или класс AVPlayerView в macOS. Эти классы представляют видеоконтент, , а также элементы управления воспроизведением и другие мультимедийные функции, предоставляя вам полнофункциональное воспроизведение в режиме воспроизведения .

AVPlayerLayer: Если вы создаете пользовательский интерфейс для вашего плеера, вы используете подкласс Core Animation CALayer предоставленный AVFoundation под названием AVPlayerLayer. Уровень игрока может быть установлен как фоновый слой вида или может быть добавлен непосредственно в иерархию слоев. В отличие от AVPlayerView и AVPlayerViewController, уровень игрока не содержит , но представляет собой визуальный контент на экране. Вы должны создать элементы управления транспортом воспроизведения до воспроизведения, паузы и поиска через носитель.

+0

прав, извините, пропустил код, в котором мы установили фрейм для игрока. кадр устанавливается должным образом в другом месте кода, который проверяется кадром во время воспроизведения видео. проблема кажется временной. если мы ждем 5-10 секунд, прежде чем воспроизводить видео, видео будет работать каждый раз. – Crashalot