Macos AVAudioPlayerNode scheduleFile:atTime:completionHandler:Donds';t调用完成处理程序

Macos AVAudioPlayerNode scheduleFile:atTime:completionHandler:Donds';t调用完成处理程序,macos,osx-yosemite,avaudioplayer,xcode7,Macos,Osx Yosemite,Avaudioplayer,Xcode7,[AVAudioPlayerNode scheduleFile:atTime:completionHandler:][/code>记录为“在文件完全播放或播放器停止后调用”,但在文件完全播放之前调用。似乎没有任何方法可以确定文件是否已完成播放,即使是通过轮询 我已经把10个简短的声音文件排好了队,然后记录了每个文件的时间和lastRenderTime;它还大约每秒轮询一次玩家状态 日志输出 2015-09-27 19:24:21.193 AVAudioEngineCompletion[9946:

[AVAudioPlayerNode scheduleFile:atTime:completionHandler:][/code>记录为“在文件完全播放或播放器停止后调用”,但在文件完全播放之前调用。似乎没有任何方法可以确定文件是否已完成播放,即使是通过轮询

我已经把10个简短的声音文件排好了队,然后记录了每个文件的时间和lastRenderTime;它还大约每秒轮询一次玩家状态

日志输出

2015-09-27 19:24:21.193 AVAudioEngineCompletion[9946:369939] playing 0 <AVAudioTime 0x6080000a8280: 30642.368875 s 0 fr (/44100 Hz) 1.000000 rs>
2015-09-27 19:24:21.194 AVAudioEngineCompletion[9946:369939] playing 1 <AVAudioTime 0x6080000a7f80: 30642.368875 s 0 fr (/44100 Hz) 1.000000 rs>
2015-09-27 19:24:21.601 AVAudioEngineCompletion[9946:369939] playing 2 <AVAudioTime 0x6000000a60c0: 30642.777492 s 18020 fr (/44100 Hz) 1.000000 rs>
2015-09-27 19:24:22.101 AVAudioEngineCompletion[9946:369939] playing 3 <AVAudioTime 0x6080000a63c0: 30643.276721 s 40036 fr (/44100 Hz) 1.000000 rs>
2015-09-27 19:24:22.270 AVAudioEngineCompletion[9946:369853] 1 - <AVAudioTime 0x6000000a2d00: 30643.439261 s 47204 fr (/44100 Hz) 1.000000 rs>
2015-09-27 19:24:22.600 AVAudioEngineCompletion[9946:369939] playing 4 <AVAudioTime 0x6080000a63c0: 30643.775950 s 62052 fr (/44100 Hz) 1.000000 rs>
2015-09-27 19:24:23.099 AVAudioEngineCompletion[9946:369939] playing 5 <AVAudioTime 0x6080000a63c0: 30644.275179 s 84068 fr (/44100 Hz) 1.000000 rs>
2015-09-27 19:24:23.374 AVAudioEngineCompletion[9946:369853] 2 - <AVAudioTime 0x6080000a63c0: 30644.542209 s 95844 fr (/44100 Hz) 1.000000 rs>
2015-09-27 19:24:23.587 AVAudioEngineCompletion[9946:369939] playing 6 <AVAudioTime 0x6080000a63c0: 30644.762799 s 105572 fr (/44100 Hz) 1.000000 rs>
2015-09-27 19:24:24.086 AVAudioEngineCompletion[9946:369939] playing 7 <AVAudioTime 0x6080000a63c0: 30645.262028 s 127588 fr (/44100 Hz) 1.000000 rs>
2015-09-27 19:24:24.180 AVAudioEngineCompletion[9946:369853] 3 - <AVAudioTime 0x6000000a57c0: 30645.354907 s 131684 fr (/44100 Hz) 1.000000 rs>
2015-09-27 19:24:24.585 AVAudioEngineCompletion[9946:369939] playing 8 <AVAudioTime 0x6080000a63c0: 30645.761258 s 149604 fr (/44100 Hz) 1.000001 rs>
2015-09-27 19:24:25.085 AVAudioEngineCompletion[9946:369939] playing 9 <AVAudioTime 0x6000000a5820: 30646.260487 s 171620 fr (/44100 Hz) 1.000001 rs>
2015-09-27 19:24:25.579 AVAudioEngineCompletion[9946:369853] 4 - <AVAudioTime 0x6080000a63c0: 30646.748107 s 193124 fr (/44100 Hz) 1.000001 rs>
2015-09-27 19:24:26.547 AVAudioEngineCompletion[9946:369853] 5 - <AVAudioTime 0x6080000a63c0: 30647.711735 s 235620 fr (/44100 Hz) 1.000001 rs>
2015-09-27 19:24:27.180 AVAudioEngineCompletion[9946:369853] 6 - <AVAudioTime 0x6000000a1860: 30648.350284 s 263780 fr (/44100 Hz) 1.000000 rs>
2015-09-27 19:24:21.193 AVAudioEngineCompletion[9946:369939]播放0
2015-09-27 19:24:21.194阿瓦迪奥工程完成[9946:369939]比赛1
2015-09-27 19:24:21.601 AVAudioEngineCompletion[9946:369939]演奏2
2015-09-27 19:24:22
2015-09-27 19:24:22.270音频工程完成[9946:369853]1-
2015-09-27 19:24:22.600 AVAudioEngineCompletion[9946:369939]第四场比赛
2015-09-27 19:24:23.099 AVAudioEngineCompletion[9946:369939]演奏5
2015-09-27 19:24:23.374 AVAudioEngineCompletion[9946:369853]2-
2015-09-27 19:24:23.587 AVAudioEngineCompletion[9946:369939]播放6
2015-09-27 19:24:24.086 AVAudioEngineCompletion[9946:369939]演奏7
2015-09-27 19:24:24.180 AVAudioEngineCompletion[9946:369853]3-
2015-09-27 19:24:24.585 AVAudioEngineCompletion[9946:369939]播放8
2015-09-27 19:24:25.085 AVAudioEngineCompletion[9946:369939]播放9
2015-09-27 19:24:25.579 AVAudioEngineCompletion[9946:369853]4-
2015-09-27 19:24:26.547 AVAudioEngineCompletion[9946:369853]5-
2015-09-27 19:24:27.180音频工程完成[9946:369853]6-
我使用AVAudioPlayerNode而不是更高级别的API来播放声音文件,因为我需要控制输出设备


在QuickTime中,通过选定的输出设备播放音频甚至与视频相关联的音频的任务很简单,但在更高级别的AVFoundation API中设置音频设备并没有直接的模拟功能。要在播放完成后获得回调,您需要调用一个稍微不同的函数,如下所示:

playerNode.scheduleFile(clip.audioFile!, at: nil, completionCallbackType: AVAudioPlayerNodeCompletionCallbackType.dataPlayedBack, completionHandler: { (completionType) in
    self.didFinish()
})

文档中说“在播放机计划在渲染线程上播放文件后调用,或者播放机停止。可能为零。”这意味着一旦剪辑“计划”,它将被调用,而不是完成播放。调度几乎是即时的。要在播放完成后获得回调,您需要调用一个稍微不同的函数,如:playerNode.scheduleFile(clip.audioFile!,at:nil,completionCallbackType:AVAudioPlayerNodeCompletionCallbackType.dataPlayedBack,completionHandler:{(completionType)in self.didfish()})