2017-04-19 3 views
1

Mon code est le suivant:Comment éviter le gel d'Airplay lors de l'utilisation d'AVComposition?

//init mix composition 
let mixComposition = AVMutableComposition() 

//video asset 
let videoAsset = AVURLAsset(url: VIDEO_URL) 
let videoTrack = mixComposition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid) 
try? videoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: videoAsset.tracks(withMediaType: AVMediaTypeVideo).first!, at: kCMTimeZero) 

//audio track 
let audioTrack = mixComposition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid) 
try? audioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: videoAsset.tracks(withMediaType: AVMediaTypeAudio).first!, at: kCMTimeZero) 

//subtitles 
let path = Bundle.main.path(forResource: "subtitle", ofType: "vtt")! 
let subtitleAsset = AVAsset(url: URL(fileURLWithPath: path)) 
let subtitleTrack = mixComposition.addMutableTrack(withMediaType: AVMediaTypeText, preferredTrackID: kCMPersistentTrackID_Invalid) 
try? subtitleTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: subtitleAsset.tracks(withMediaType: AVMediaTypeText)[0], at: kCMTimeZero) 

//setup player and play 
let item = AVPlayerItem(asset: videoAsset) 
let player = AVPlayer(playerItem: item) 
self.player = player 
self.player?.allowsExternalPlayback = true 
self.player?.usesExternalPlaybackWhileExternalScreenIsActive = true 
self.player?.play() 

Lorsqu'on lui a demandé si le videoAsset.isCompatibleWithAirPlayVideo il retourne vrai. Lorsque vous chargez l'application, tout fonctionne correctement jusqu'à ce que vous passiez en mode Airplay, l'écran se fige jusqu'à ce que vous sortez du mode Airplay.

Ceci est un comportement complètement différent si vous deviez modifier mixComposition en videoAsset. Maintenant tout fonctionne, mais vous n'aurez pas les sous-titres externes.

Quelqu'un d'autre a-t-il rencontré ce problème et quelle est la solution. Mon objectif final est d'inclure des sous-titres externes dans la vidéo mp4.

Répondre

0

J'ai du code dans mon application presque identique au vôtre et il fonctionne en mode Airplay donc je pense que vous êtes presque là.

je charger la vidéo, audio et VTT- sous-titres de serveur Web et a deux défis majeurs:

  1. Audio ne pouvait pas jouer à moins qu'il est venu de https hôte indépendamment des paramètres plist (lecture de vidéo bien de type HTTP hôte)
  2. Les sous-titres ne duraient que 10 à 12 minutes d'un film. Solution a pour télécharger des sous-titres et la charge de l'aide .documentDirectory FileManager

La seule différence par rapport à votre code est que j'initialiser un AVPlayerViewController et mettre le joueur à la AVPlayer:

var moviePlayer = AVPlayerViewController() 
moviePlayer.player = player 

puis présenter MoviePlayer

self.view.window?.rootViewController?.present(self.moviePlayer, animated: true, completion : { self.moviePlayerFinishedLoading() } 
self.moviePlayer.player?.play() 

Hope this helps