Swift 4 insertTimeRange 添加视频轨道但播放时除了第一个不显示
Swift 4 insertTimeRange adds video tracks but when playing does not show except 1st one
以下函数 "func mergeVideos()" 读取预先录制的视频文件,并制作一个新的电影文件,其中包含用这些文件创建的曲目。 dump(mixComposition.tracks returns 以下为两个视频文件轨道。
*▿ 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...
将它放在循环之前,这样您就可以只创建 一个 视频轨道并将 所有 视频剪辑插入 一个轨道。
以下函数 "func mergeVideos()" 读取预先录制的视频文件,并制作一个新的电影文件,其中包含用这些文件创建的曲目。 dump(mixComposition.tracks returns 以下为两个视频文件轨道。
*▿ 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...
将它放在循环之前,这样您就可以只创建 一个 视频轨道并将 所有 视频剪辑插入 一个轨道。