sab*_*ajt 6 core-audio avfoundation ios avcomposition avmutablecomposition
我正在尝试使用AVMutableComposition在精确的时间播放一系列声音文件.
当视图加载时,我创建合成,目的是在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];
Run Code Online (Sandbox Code Playgroud)
成功创建组合,没有错误.后来,当我想播放序列时,我这样做:
[self.avPlayer seekToTime:CMTimeMakeWithSeconds(0, 1)];
[self.avPlayer play];
Run Code Online (Sandbox Code Playgroud)
出于某种原因,声音根本没有均匀间隔 - 但几乎全部播放.我尝试了相同的东西间隔超过4秒,取代时间计算如下:
Float64 t = i * 1.0;
Run Code Online (Sandbox Code Playgroud)
而且这很好玩.任何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 个切片来获得 0.25 秒的值;Float64 t = i * 24;atTime:CMTimeMake(t, 600)
至于您几乎同时播放所有 4 个声音的问题,请注意这个未回答的 SO 问题,它仅在第一次播放时发生。即使进行了上述更改,您仍然可能会遇到此问题。
| 归档时间: |
|
| 查看次数: |
1764 次 |
| 最近记录: |