2016-12-07 1 views
0

저는 AVFoundation 프레임 워크를 사용하고 있습니다. 3 개의 비디오를 추가하여 단일 비디오로 병합하려고하지만 문제는 3 개의 비디오를 추가 할 수 없다는 것입니다. AVMutableComposition을 사용하여 추가 할 수있는 비디오의 수를 알고 싶습니다. 2 개 이상의 비디오를 추가 할 수 있습니까? 어떤 도움이 필요합니까? videoAsset2.duration, 이미 그 시점에서 비디오를 가질 수있다 :AVMutableComposition이 4 개의 비디오 트랙을 추가 할 수 없습니다.

다음은 atTime에서 세 번째 비디오를 추가하려는

///////////////////////////////////////////// 
// 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") 
} 

답변

0
///////////////////////////////////////////// 
// 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") 
} 

내 코드입니다.

비디오 1은 10 초이고 비디오 2는 5 초라고 가정합니다. 당신은 문자 그대로 자산이있는 트랙의 비디오 1의 절반 인 5 초 안에 3 번째 비디오를 삽입하려고합니다.

다행히도 쉽게 해결할 수 있습니다.

var insertionTime : CMTime = kCMTimeZero 

그런 다음 때마다 당신이 성공적으로 당신은 insertionTime

insertionTime = CMTimeAdd(insertionTime, VideoAsset1.duration) 

그리고 거기에서, 단지

를 사용을 증가 수, 비디오를 추가 : 개인적으로

는,이 같은 삽입 시간을 유지

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

이 방법의 보너스로 실제로 코드를 다시 작성하여 루프와 더 많은 재사용을 가능하게하는 비디오 자산의 배열.

+1

고마워요, 좋은 답변입니다. 하지만 난 이전에 이것을 해결했습니다. 이것은 나의 실수였습니다. – varinder