以下函数“func mergeVideos()”读取预先录制的视频文件,并制作一个新的电影文件,其中包含用这些文件创建的轨道。 dump(mixComposition.tracks 返回以下两个视频文件轨道。
*▿ 2 elements
- <AVMutableCompositionTrack: 0x14661a30 trackID = 1, mediaType = vide, editCount = 1> #0
- super: AVCompositionTrack
- super: AVAssetTrack
- super: NSObject
- <AVMutableCompositionTrack: 0x14592bc0 trackID = 2, mediaType = vide, editCount = 1> #1
- super: AVCompositionTrack
- super: AVAssetTrack
- super: NSObject*
问题是写的,创建新视频的播放时长与第一个视频时长一样长。添加视频的插入时间和时长如下,没有问题。
▿ 2 elements
- "1.mp4"
- "video.mp4"
First video's insert and duration.
time= (0.0, 5.2316666666666665)
Second video's insert and duration.
time= (5.2316666666666665, 5.4366666666666665)
经过几个小时的搜索,我们找不到类似的问题,所以决定询问。
func mergeVideos(){
let mixComposition = AVMutableComposition.init()
var timeRange: CMTimeRange!
var insertTime = kCMTimeZero
for k in 0..<videoListOnDisk.count {
let url = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]).appendingPathComponent(videoListOnDisk[k])
let videoAsset = AVURLAsset(url: url)
let track = mixComposition.addMutableTrack(withMediaType: AVMediaType.video,
preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
timeRange = CMTimeRangeMake(kCMTimeZero,videoAsset.duration )
do {
try track?.insertTimeRange(timeRange, of: videoAsset.tracks(withMediaType: .video)[0], at: insertTime)
} catch let error as NSError {
print("error when adding video to mix = \(error)")
}
insertTime = CMTimeAdd(insertTime, videoAsset.duration)
}
dump(mixComposition.tracks)
let exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality)
exporter!.outputURL = fileURL(combinedVideoFileName)
exporter!.outputFileType = AVFileType.mp4
exporter!.shouldOptimizeForNetworkUse = false
exporter!.exportAsynchronously() {
DispatchQueue.main.async(execute: { () -> Void in
print("I am done with exporting \(exporter?.status.rawValue)")
})
}
}
最佳答案
问题是这一行的重复:
let track = mixComposition.addMutableTrack...
将它放在循环之前,这样您就可以只创建一个 视频轨道并将所有 视频剪辑插入到该一个 轨道中。
关于ios - Swift 4 insertTimeRange 添加视频轨道但播放时除了第一个不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50041901/