我的代码如下:
//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视频中加入外部字幕。
发布于 2017-05-18 18:51:32
我在我的应用程序中的代码几乎与你的完全相同,它在Airplay模式下工作,所以我认为你几乎就在那里。
我从webserver上加载了视频、音频和vtt字幕,遇到了两个主要挑战:
无论plist设置如何,除非来自https-host,否则
从.documentDirectory下载字幕并加载
与您的代码唯一不同的是,我初始化了一个AVPlayerViewController并将播放器设置为AVPlayer:
var moviePlayer = AVPlayerViewController()
moviePlayer.player = player然后呈现moviePlayer
self.view.window?.rootViewController?.present(self.moviePlayer, animated: true, completion : { self.moviePlayerFinishedLoading() }
self.moviePlayer.player?.play()希望这能有所帮助
https://stackoverflow.com/questions/43503745
复制相似问题