首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用AVComposition时避免Airplay冻结?

如何在使用AVComposition时避免Airplay冻结?
EN

Stack Overflow用户
提问于 2017-04-20 02:43:51
回答 1查看 171关注 0票数 2

我的代码如下:

代码语言:javascript
复制
//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()

当询问videoAsset.isCompatibleWithAirPlayVideo是否为true时,它会返回true。当你加载应用程序时,一切都很顺利,直到你进入Airplay模式,屏幕就会冻结,直到你再次退出Airplay模式。

如果您将mixComposition更改为videoAsset,这将是完全不同的行为。现在它都可以工作了,但是你不会有外部字幕。

有没有其他人遇到过这个问题?解决方法是什么。我的最终目标是在mp4视频中加入外部字幕。

EN

回答 1

Stack Overflow用户

发布于 2017-05-18 18:51:32

我在我的应用程序中的代码几乎与你的完全相同,它在Airplay模式下工作,所以我认为你几乎就在那里。

我从webserver上加载了视频、音频和vtt字幕,遇到了两个主要挑战:

无论plist设置如何,除非来自https-host,否则

  1. 音频无法播放(从https播放的视频只持续10-12分钟的电影。解决方案是使用FileManager

从.documentDirectory下载字幕并加载

与您的代码唯一不同的是,我初始化了一个AVPlayerViewController并将播放器设置为AVPlayer:

代码语言:javascript
复制
var moviePlayer = AVPlayerViewController()
moviePlayer.player = player

然后呈现moviePlayer

代码语言:javascript
复制
self.view.window?.rootViewController?.present(self.moviePlayer, animated: true, completion : { self.moviePlayerFinishedLoading() } 
self.moviePlayer.player?.play()

希望这能有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43503745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档