objective-c - 使用回调确定 OpenAL 何时完成播放音频

标签 objective-c ios avfoundation openal

我想知道什么等同于在 OpenAL 中使用 AVAudioPlayerDelegateaudioPlayerDidFinishPlaying:successfully: 方法。例如:

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    // (code or conditions for when the audio has finished playing...)
}

最佳答案

一般来说,OpenAL 不会在音频播放完毕时通知您,因此没有真正等同于 AVAudioPlayerDelegate 的对象。 最简单的方法是简单地将函数/ block 调用延迟音频的长度。例如,您可以使用 libdispatch(又名 Grand Central Dispatch)在设定的时间后将一个 block 添加到队列中:

dispatch_time_t delay;
dispatch_queue_t queue;
dispatch_block_t block;
uint64_t audio_length_ns = 10000000000; // 10 seconds

delay = dispatch_time(DISPATCH_TIME_NOW, audio_length_ns);
queue = dispatch_get_main_queue();

block = ^{
  // Do whatever you need to after the delay
  // Maybe check to see if the audio has actually
  // finished playing and queue up the block again
  // if it hasn't.
};

// Queue up the block for the time after 
dispatch_after(delay, queue, block);

稍微困难的方法是,如 block 内的注释中所述,检查 OpenAL 是否在 block 中完成,如果没有,则将 block 再次插入队列(可能延迟更短,特别是如果你可以估计它会持续多长时间)。不过,一般来说,您可能不需要准确定位,只要处于声音完成度的合适范围内就足够了。

您也可以通过其他方法安排此类事情,例如 performSelector:withObject:afterDelay:,但就 API 而言,这更多取决于您的偏好。这个想法几乎是一样的。

关于objective-c - 使用回调确定 OpenAL 何时完成播放音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11911451/

相关文章:

iphone - 更改音调(不实时)

ios - 使用动画 UIView 覆盖从相机录制视频

ios - 显示键盘时在 iPad 上的表单中调整表格 View 的大小

ios - 如何更改UITableViewHeaderFooterView的textLabel的高度?

ios - 找不到 NSBundle mainBundle

objective-c - 如何调整 UITextView 的宽度以适应其内容而不换行?

ios - 记录裁剪视频方形长宽比 AVCaptureSession

ios - 获取CoreData一对多关系的索引路径?

ios - 如何检查图像是否已保存 [SWIFT]?

objective-c - 当 AudioSessionActive 为 NO 时,无法通过硬件按钮控制 AVAudioPlayer 的音量