我正在尝试使用AVMutableComposition在精确的时间播放一系列声音文件。
加载 View 时,我创建的合成意图是在1秒钟内均匀播放4种声音。声音的时间长短无关紧要,我只想在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秒以下的任何时间间隔似乎都会产生意外结果。我想念什么? AVComposition是否不应该用于1秒以下的时间间隔?还是我误会了时间间隔?
最佳答案
您的CMTimeMakeWithSeconds(t, 1)
是整秒的“切片”,因为您的时间标度设置为1。无论t
是什么分数,atTime:总是以0结尾。这就是为什么当将其增加到1秒时它起作用的原因(t = i * 1)。
您需要将时间刻度设置为4,以获得所需的0.25秒切片。由于CMTime现在处于.25秒切片中,因此您不需要i * 0.25计算。只需直接使用i
即可; atTime:CMTimeMake(i, 4)
如果将来可能需要提高精确度,则应该现在就解决这个问题,这样以后就不必调整代码了。 Apple建议使用600的时间刻度,因为它是常见视频帧速率(24、25和30 FPS)的倍数,但它也仅适用于音频。因此,对于您的情况,您将使用24个slice来获得.25秒的值; Float64 t = i * 24
; atTime:CMTimeMake(t, 600)
至于几乎同时播放所有4种声音的问题,请注意this unanswered SO question仅在第一次播放时才发生。即使进行了上述更改,您仍然可能会遇到此问题。
关于ios - AVMutableComposition精确计时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25416789/