我正在尝试使用AVFoundation加入2个视频片段。出于测试目的,我在这里尝试加载单个视频片段,将其视频和音频片段添加到合成中,然后使用AVAssetExportSession
将其导出。
当我运行下面的代码时,"导出"输出,但永远不会执行导出回调。此外,如果我定期检查导出的进度(print(exporter.progress)
),我发现进度始终为0.0,即使在几分钟后也是如此。如果我打印状态,我发现它是等待"为了某事。
// URL to video file
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("video.mov")
// Create composition and tracks
let comp = AVMutableComposition()
let videoTrack = comp.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID: kCMPersistentTrackID_Invalid)
let audioTrack = comp.addMutableTrack(withMediaType: AVMediaType.audio, preferredTrackID: kCMPersistentTrackID_Invalid)
// Create asset from file
let asset = AVAsset(url: fileURL)
// Insert video
try! videoTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, asset.duration), of: asset.tracks(withMediaType: AVMediaType.video)[0] as AVAssetTrack, at: kCMTimeZero)
// Insert audio
try! audioTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, asset.duration), of: asset.tracks(withMediaType: AVMediaType.audio)[0] as AVAssetTrack, at: kCMTimeZero)
// Delete existing movie file if exists
let finalURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("FINAL.mov")
try? FileManager.default.removeItem(at: finalURL)
// Create the exporter
exporter = AVAssetExportSession(asset: comp, presetName: AVAssetExportPresetLowQuality)
exporter.outputURL = finalURL
exporter.outputFileType = AVFileType.mov
print("Exporting")
exporter.exportAsynchronously(completionHandler: {
// This statement is never reached
print(self.exporter.error)
})
不会抛出任何错误。看起来好像出口永远不会开始。我不确定它在等什么。
编辑:正在发生一些令人毛骨悚然的事情。如果我重新启动手机然后运行代码,它就可以了。但它只运行一次。如果我第二次运行,没有任何事情像往常一样发生。但是,当我重新启动手机并再次运行时,它会重新运行。
编辑2:我在其他人的手机上试过它,每次都可以正常使用。我的手机在世界上出了什么问题?
答案 0 :(得分:1)
这是基本上做同样事情的代码,为视频添加音轨。它看起来很像,现在正在appstore上开发应用程序。
func merge() -> AVComposition? {
guard let videoAsset = videoAsset, let audioAsset = audioAsset else {
return nil
}
let avMutableComposition = AVMutableComposition()
let audiotimeRange = CMTimeRange(start: kCMTimeZero, duration: audioAsset.duration)
let compositionVideoTrack = avMutableComposition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID: kCMPersistentTrackID_Invalid)
do {
try add(asset: videoAsset, withRemaining: audiotimeRange.duration, forComposition: compositionVideoTrack!, cursor: kCMTimeZero)
} catch let error {
print(error)
return nil
}
let compositionAudioTrack = avMutableComposition.addMutableTrack(withMediaType: AVMediaType.audio, preferredTrackID: kCMPersistentTrackID_Invalid)
do {
try compositionAudioTrack?.insertTimeRange(audiotimeRange, of: audioAsset.tracks(withMediaType: AVMediaType.audio)[0], at: kCMTimeZero)
} catch let error {
print(error)
return nil
}
composition = (avMutableComposition.copy() as! AVComposition)
return composition
}
我看不出我们的代码没有任何问题,除非我不确定资产是否具有正确的持续时间,因为获取它是一个异步任务,除非您明确询问。
因此,当您为AVAsset
选项创建AVURLAssetPreferPreciseDurationAndTimingKey
通行证true
时。
AVURLAsset(url: <#T##URL#>, options: ["AVURLAssetPreferPreciseDurationAndTimingKey" : true])
答案 1 :(得分:0)
我猜,你的一个麦克风工作不正常,因为这个问题而卡住了,我的后凸轮也有类似的行为。您是否尝试在不同时录制的情况下导出电影,只是为了测试是否涉及可能损坏的麦克风?
答案 2 :(得分:0)
我在iOS 10上遇到了类似的问题(iOS 11正常工作)。 在工作区设置中切换回标准/旧版构建系统后,对我来说已经修复了。