我有两个音轨,我把它们像这样合并在一起:
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
处多次插入第二首曲目,但这对我来说听起来很奇怪。任何基于这个主题的想法都是非常有用的。
4条答案
按热度按时间b0zn9rqh1#
我认为它应该工作:
zaq34kh62#
在Gaurav响应中,您应该更改这一行:
audioDuration = CMTimeSubtract(totalDuration,videoDuration);
致:
audioDuration = CMTimeSubtract(videoDuration,currentTime);
否则音轨将长于视频(这将只是黑色)
rkttyhzu3#
在Swift中使用
repeat whiel
循环。Playground输出:
用途:
4szc88ey4#
Gaurav在Swift 5.5中回答(他的解决方案是正确的,并且运行得很好)。