AVMutableComposition不允许添加4个视频轨道

瓦林德

我正在使用AVFoundation框架。我只想添加三个视频以合并为一个视频,但是问题是我无法添加三个视频。我想知道我们可以使用AVMutableComposition添加多少个视频。是否可以添加2个以上的视频。有什么帮助吗?

这是我的代码

/////////////////////////////////////////////
// Add video tracks 1 to mutable compositon//
/////////////////////////////////////////////
let firstTrack = compostion.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
do{
    try firstTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset1.duration),
            ofTrack: videoAsset1.tracksWithMediaType(AVMediaTypeVideo)[0], atTime: kCMTimeZero)
}
catch{
    print("failed to add first track")
}
print("Time to add 1 track\(CMTimeGetSeconds(videoAsset1.duration))")

/////////////////////////////////////////////
// Add video tracks 2 to mutable compositon//
/////////////////////////////////////////////
let secondTrack = compostion.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
do{
    try secondTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset2.duration),
            ofTrack: videoAsset2.tracksWithMediaType(AVMediaTypeVideo)[0], atTime: videoAsset1.duration)
}
catch{
    print("failed to add second track")
}
print("Time to add second track\(CMTimeGetSeconds(videoAsset2.duration))")
/////////////////////////////////////////////
// Add video tracks 3 to mutable compositon//
/////////////////////////////////////////////
let thirdTrack = compostion.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
do{
    try thirdTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset3.duration), ofTrack: videoAsset3.tracksWithMediaType(AVMediaTypeVideo)[0], atTime: videoAsset2.duration)
}
catch{
    print("failed to add third track")
}
蒂姆·布尔
/////////////////////////////////////////////
// Add video tracks 3 to mutable compositon//
/////////////////////////////////////////////
let thirdTrack = compostion.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
do{
    try thirdTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset3.duration), ofTrack: videoAsset3.tracksWithMediaType(AVMediaTypeVideo)[0], atTime: videoAsset2.duration)
}
catch{
    print("failed to add third track")
}

您正在尝试在atTime添加第三个视频:videoAsset2.duration,该视频在该时间点可能已经有一个视频。

假设视频1为10秒,视频2为5秒。您实际上是在尝试插入5秒的第3个视频,这是在已经有资产的轨道上通过视频1插入视频的一半。

幸运的是,这很容易解决。

我个人保持这样的插入时间:

var insertionTime : CMTime = kCMTimeZero

然后,每次成功添加视频时,您都可以增加insertTime

insertionTime = CMTimeAdd(insertionTime, VideoAsset1.duration)

然后从那里开始使用

try thirdTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset3.duration), ofTrack: videoAsset3.tracksWithMediaType(AVMediaTypeVideo)[0], atTime: insertionTime)

使用此方法的好处是,您实际上可以重写代码以使用循环和视频资产数组,这也使其更可重用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章