У меня есть две звуковые дорожки, которые я комбинирую друг с другом следующим образом:
AVMutableComposition *composition = [[AVMutableComposition alloc] init];
AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionAudioTrack setPreferredVolume:1.0];
AVAsset *avAsset = [AVURLAsset URLAssetWithURL:originalContentURL options:nil];
AVAssetTrack *clipAudioTrack = [[avAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
[compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration) ofTrack:clipAudioTrack atTime:kCMTimeZero error:nil];
AVMutableCompositionTrack *compositionAudioTrack1 = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionAudioTrack1 setPreferredVolume:0.01];
NSString *soundOne1 =[[NSBundle mainBundle]pathForResource:@"jingle1" ofType:@"m4a"];
NSURL *url1 = [NSURL fileURLWithPath:soundOne1];
AVAsset *avAsset1 = [AVURLAsset URLAssetWithURL:url1 options:nil];
AVAssetTrack *clipAudioTrack1 = [[avAsset1 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
[compositionAudioTrack1 insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration) ofTrack:clipAudioTrack1 atTime:kCMTimeZero error:nil];
Как видите, первые AVAsset
— это базовая длина второй дорожки, а это означает, что если у меня будет длинная вторая дорожка, она будет обрезана, как я и хочу.
Однако мне нужно иметь возможность зацикливать вторую дорожку, чтобы, если первая слишком длинная, вторая продолжалась и продолжалась. Позже я должен сохранить полученный трек на диск, что также является важным фактором.
Проведя исследование, я обнаружил, что в iOS нет удобного способа зациклить дорожку. Одним из выходов было бы вставлять вторую дорожку в AVMutableComposition
несколько раз снова и снова, но мне это кажется довольно странным. Любые идеи, основанные на теме, будут действительно полезны.