Я пытаюсь использовать AVMutableComposition для воспроизведения последовательности звуковых файлов в определенное время.
Когда представление загружается, я создаю композицию с намерением воспроизвести 4 звука, равномерно распределенные в течение 1 секунды. Неважно, насколько длинные или короткие звуки, я просто хочу запустить их ровно через 0, 0,25, 0,5 и 0,75 секунды:
AVMutableComposition *composition = [[AVMutableComposition alloc] init];
NSDictionary *options = @{AVURLAssetPreferPreciseDurationAndTimingKey : @YES};
for (NSInteger i = 0; i < 4; i++)
{
AVMutableCompositionTrack* track = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
NSURL *url = [[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"sound_file_%i", i] withExtension:@"caf"];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:options];
AVAssetTrack *assetTrack = [asset tracksWithMediaType:AVMediaTypeAudio].firstObject;
CMTimeRange timeRange = [assetTrack timeRange];
Float64 t = i * 0.25;
NSError *error;
BOOL success = [track insertTimeRange:timeRange ofTrack:assetTrack atTime:CMTimeMakeWithSeconds(t, 1) error:&error];
if (!success)
{
NSLog(@"unsuccesful creation of composition");
}
if (error)
{
NSLog(@"composition creation error: %@", error);
}
}
AVPlayerItem* playerItem = [AVPlayerItem playerItemWithAsset:composition];
self.avPlayer = [[AVPlayer alloc] initWithPlayerItem:playerItem];
Композиция создана успешно, без ошибок. Позже, когда я хочу воспроизвести последовательность, я делаю следующее:
[self.avPlayer seekToTime:CMTimeMakeWithSeconds(0, 1)];
[self.avPlayer play];
По какой-то причине звуки распределены неравномерно - а воспроизводятся почти все одновременно. Я попробовал то же самое с интервалом более 4 секунд, заменив расчет времени следующим образом:
Float64 t = i * 1.0;
И это прекрасно играет. Кажется, что любой временной интервал менее 1 секунды дает неожиданные результаты. Что мне не хватает? Разве AVCompositions нельзя использовать для интервалов времени менее 1 секунды? Или, может быть, я неправильно понимаю временные интервалы?