AVAssetExportSession未启动导出/卡住等待

时间:2018-01-11 05:09:28

标签: ios swift avfoundation

我正在尝试使用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:我在其他人的手机上试过它,每次都可以正常使用。我的手机在世界上出了什么问题?

3 个答案:

答案 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正常工作)。 在工作区设置中切换回标准/旧版构建系统后,对我来说已经修复了。