gpt4 book ai didi

ios - 使用 AVMutableComposition 进行精确计时

转载 作者:可可西里 更新时间:2023-11-01 03:56:56 24 4
gpt4 key购买 nike

我正在尝试使用 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 秒的时间间隔似乎都会产生意想不到的结果。我错过了什么? AVCompositions 是否不应该用于 1 秒以下的时间间隔?还是我误解了时间间隔?

最佳答案

您的 CMTimeMakeWithSeconds(t, 1) 是整个第二个“切片”,因为您的时间刻度设置为 1。无论 t 是多少,atTime: 都会总是以 0 结束。这就是为什么当您将它增加到 1 秒 (t=i*1) 时它起作用的原因。

您需要将时间刻度设置为 4 以获得所需的 0.25 秒切片。由于 CMTime 现在以 0.25 秒为单位,因此您不需要 i * 0.25 计算。直接使用i即可; atTime:CMTimeMake(i, 4)

如果您将来可能需要更精确,您应该现在考虑它,这样您以后就不必调整您的代码。 Apple 建议使用 600 的时间刻度,因为它是常见视频帧速率(24、25 和 30 FPS)的倍数,但它也适用于纯音频。因此,对于您的情况,您将使用 24 个切片来获得 .25 秒的值; Float64 t = i * 24; atTime:CMTimeMake(t, 600)

关于您几乎同时播放所有 4 种声音的问题,请注意 this unanswered SO question它只发生在第一场比赛中。即使进行了上述更改,您仍可能会遇到此问题。

关于ios - 使用 AVMutableComposition 进行精确计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25416789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com