没有音频的视频会导致 AVMutableComposition() 上的应用程序崩溃

Der*_*ers 2 avfoundation avmutablecomposition avasset swift

我的应用程序从 URL 获取视频,并允许您向其中添加文本等。当视频没有任何音频开始时,它似乎崩溃了,似乎无法弄清楚这一点。

这是我在制作视频时所拥有的:

let asset = AVAsset(url: URL(string: self.videoURL)!)
let mixComposition = AVMutableComposition()
let videoTrack = mixComposition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)
try! videoTrack?.insertTimeRange(CMTimeRangeMake(start: .zero, duration: asset.duration), of: asset.tracks(withMediaType: .video)[0], at: CMTime.zero)
let audioTrack = mixComposition.addMutableTrack(withMediaType: .audio, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
do {
       try audioTrack!.insertTimeRange(CMTimeRangeMake(start: .zero, duration: asset.duration), of: asset.tracks(withMediaType: .audio)[0], at: CMTime.zero)
   } catch {
       print("error")
   }
Run Code Online (Sandbox Code Playgroud)

它继续insertTimeRangeindexPath超出范围。

 [__NSArray0 objectAtIndex:]: index 0 beyond bounds for empty NSArray
Run Code Online (Sandbox Code Playgroud)

Der*_*ers 5

当原始视频没有音频时,我想出了如何导出视频。万一其他人遇到同样的问题。

let asset = AVAsset(url: URL(string: self.videoURL)!)

    let mixComposition = AVMutableComposition()

    let videoTrack = mixComposition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)

    try! videoTrack?.insertTimeRange(CMTimeRangeMake(start: .zero, duration: asset.duration), of: asset.tracks(withMediaType: .video)[0], at: CMTime.zero)

    let audioTrack = mixComposition.addMutableTrack(withMediaType: .audio, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))

        if let track = asset.tracks(withMediaType: .audio).first {

            do {
                try audioTrack?.insertTimeRange(CMTimeRangeMake(start: .zero, duration: asset.duration), of: track, at: .zero)
            } catch {
                print("error")
            }

        } else {
            mixComposition.removeTrack(audioTrack!)
            print("no audio detected, removed the track")
        }
Run Code Online (Sandbox Code Playgroud)