播放从AVAssetExportSession
,您在看到视频之前很久就能听到音频。音频会立即播放,但视频仅在录制循环几次(即开始和结束)后才会出现。换句话说,您在看到任何图像之前会多次听到视频中的音频。
我们在 iOS 8 上使用 AutoLayout。
使用以下测试,我们将问题隔离到exportAsynchronouslyWithCompletionHandler
。在这两个代码块中,我们播放现有视频(与导出无关),因此导出过程已作为变量被消除。
Code 1在开始时同时播放视频和音频,而Code 2仅在开始时播放音频,并在延迟 10-60 秒后显示视频(在视频循环几次后)。
两个代码块之间的唯一区别是用途exportAsynchronouslyWithCompletionHandler
播放该视频,而另一个则不播放。
帮助?是否可以先导出音频并在视频之前准备好播放?与在不同线程上发生的导出有关吗?
func initPlayer(videoURL: NSURL) {
// Create player
player = AVPlayer(URL: videoURL)
let playerItem = player.currentItem
let asset = playerItem.asset
playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = videoView.frame
view.layer.addSublayer(playerLayer)
player.seekToTime(kCMTimeZero)
player.actionAtItemEnd = .None
player.play()
// Get notified when video done for looping purposes
NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerItemDidReachEnd:", name: AVPlayerItemDidPlayToEndTimeNotification, object: playerItem)
// Log status
println("Initialized video player: \(CMTimeGetSeconds(asset.duration)) seconds & \(asset.tracks.count) tracks for \(videoURL)")
}
func playExistingVideo() {
let filename = "/ChopsticksVideo.mp4"
let allPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
let docsPath = allPaths[0] as! NSString
let exportPath = docsPath.stringByAppendingFormat(filename)
let exportURL = NSURL.fileURLWithPath(exportPath as String)!
initPlayer(exportURL)
}
Code 1:
// Create exporter
let exporter = AVAssetExportSession(asset: mainComposition, presetName: AVAssetExportPresetHighestQuality)
exporter.videoComposition = videoComposition
exporter.outputFileType = AVFileTypeMPEG4
exporter.outputURL = exportURL
exporter.shouldOptimizeForNetworkUse = true
playExistingVideo()
Code 2:
// Create exporter
let exporter = AVAssetExportSession(asset: mainComposition, presetName: AVAssetExportPresetHighestQuality)
exporter.videoComposition = videoComposition
exporter.outputFileType = AVFileTypeMPEG4
exporter.outputURL = exportURL
exporter.shouldOptimizeForNetworkUse = true
// -- Export video
exporter.exportAsynchronouslyWithCompletionHandler({
self.playExistingVideo()
})