0

Я использую следующий код для конкатенации множественного AVURLAssets:AVMutableComposition - сцепляются видеоматериалы прекращаются после того, как первый активом

AVMutableComposition * movie = [AVMutableComposition composition]; 

CMTime offset = kCMTimeZero; 

for (AVURLAsset * asset in assets) { 
    AVMutableCompositionTrack *compositionVideoTrack = [movie addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
    AVMutableCompositionTrack *compositionAudioTrack = [movie addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 

    AVAssetTrack *assetVideoTrack = [asset tracksWithMediaType:AVMediaTypeVideo].firstObject; 
    AVAssetTrack *assetAudioTrack = [asset tracksWithMediaType:AVMediaTypeAudio].firstObject; 

    CMTimeRange timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration); 
    NSError * error = nil; 

    if (![compositionVideoTrack insertTimeRange: timeRange ofTrack: assetVideoTrack atTime: offset error: &error]) { 
     NSLog(@"Error adding video track - %@", error); 
    } 
    if (![compositionAudioTrack insertTimeRange: timeRange ofTrack: assetAudioTrack atTime: offset error: &error]) { 
     NSLog(@"Error adding audio track - %@", error); 
    } 

    offset = CMTimeAdd(offset, asset.duration); 
} 

Полученная композиция воспроизводится через комбинированную продолжительность всех первоначальные активов, и аудио пьес правильно, но воспроизводится только видео из первого актива, а затем останавливается на его последнем кадре.

Любые мысли о том, что я сделал неправильно?

Порядок первоначальных активов не имеет значения - первое видео и все звуковые игры.

ответ

0

ОК, это была моя ошибка. Я бы поставил addMutableTrackWithMediaType:внутриfor петля. Дурак я. Исправлено, как показано ниже, и оно работает как шарм!

Я оставлю это здесь на всякий случай, если у кого-то другая проблема.

AVMutableComposition * movie = [AVMutableComposition composition]; 
AVMutableCompositionTrack *compositionVideoTrack = [movie addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
AVMutableCompositionTrack *compositionAudioTrack = [movie addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 

CMTime offset = kCMTimeZero; 

for (AVURLAsset * asset in assets) { 

    AVAssetTrack *assetVideoTrack = [asset tracksWithMediaType:AVMediaTypeVideo].firstObject; 
    AVAssetTrack *assetAudioTrack = [asset tracksWithMediaType:AVMediaTypeAudio].firstObject; 

    CMTimeRange timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration); 
    NSError * error = nil; 

    if (![compositionVideoTrack insertTimeRange: timeRange ofTrack: assetVideoTrack atTime: offset error: &error]) { 
     NSLog(@"Error adding video track - %@", error); 
    } 
    if (![compositionAudioTrack insertTimeRange: timeRange ofTrack: assetAudioTrack atTime: offset error: &error]) { 
     NSLog(@"Error adding audio track - %@", error); 
    } 

    offset = CMTimeAdd(offset, asset.duration); 
} 
0

Вам необходимо создать AVVideoComposition с экземплярами AVVideoCompositionInstructions. Проверьте это sample code.

код вы были бы заинтересованы в бы то в этом роде:

AVMutableVideoCompositionLayerInstruction *videoCompositionLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:mutableVideoTrack]; 
[self.layerInstructions addObject:videoCompositionLayerInstruction]; 
     AVMutableVideoCompositionInstruction *passThroughInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
     passThroughInstruction.timeRange = trackTimeRange; 
     passThroughInstruction.layerInstructions = @[videoCompositionLayerInstruction]; 
[self.compositionInstructions addObject:passThroughInstruction]; 
+0

Я не уверен, откуда вы взяли эту идею, но это неправильный ответ (см. Мое собственное решение). Спасибо за попытку. –

+0

Ваше решение действительно работает. Я думал о более масштабируемом решении, в котором вы хотите использовать несколько композиционных композиций вместо того, чтобы вставлять их в одну композиционную дорожку. Использование AVMutableVideoCompositionLayerInstructions, AVMutableVideoCompositionInstruction и AVVideoComposition позволяет выполнять больше операций редактирования, таких как переходы, наложения и т. Д. Рад, что вы нашли что-то, что работает для вас. – Jonathan