3

在 iOS 上,我有一个由 AUNode 包装的音频单元类型kAudioUnitSubType_AudioFilePlayer,并连接到音频图中的多通道混音器和远程 IO(输出)。

在播放图表时,我想循环文件并能够确定 AudioFilePlayer 何时到达文件末尾,以便我可以在它开始下一次循环迭代之前执行操作。

在查看 AudioUnitProperties.h 时,虽然有一个完成回调 -mCompletionProc它仅在磁盘读取文件并安排播放时调用,而不是在它实际完成播放音频时调用。

因此,我考虑将音频(数据包/帧)的长度存储为一个属性,并在附加到混音器的另一个输入的输入回调中,检查我们是否在文件末尾。但是该回调不会在每一帧都被调用,所以我很可能会错过文件的实际结尾。

我该如何处理?

4

2 回答 2

1

请设置 ScheduledAudioFileRegion.mCompletionProc,

//

ScheduledAudioFileRegion playRegion;
playRegion.mTimeStamp.mFlags = kAudioTimeStampSampleTimeValid;
playRegion.mTimeStamp.mSampleTime = 0;
playRegion.mCompletionProc = XXXXXXXXXXXXXXXX(you proc);
playRegion.mCompletionProcUserData = NULL;
playRegion.mAudioFile = mAudioFile;
playRegion.mLoopCount = 0;
playRegion.mStartFrame = mStartSampleFrame;
playRegion.mFramesToPlay = UInt32(-1);

err = AudioUnitSetProperty(mFilePlayerAU, kAudioUnitProperty_ScheduledFileRegion,
                           kAudioUnitScope_Global, 0, &playRegion, sizeof(playRegion));
于 2015-03-19T15:33:15.647 回答
0

如果您想知道轨道何时结束,您可以使用RenderNotify(当要求渲染音频单元时调用通知回调)。在渲染回调中,您可以获得当前处理的帧数,并可以将它们添加到您的 frame 属性中。通过简单检查此属性是否高于帧数,您将能够知道轨道何时完成。

于 2017-08-10T10:15:26.487 回答