如何确定ScheduledAudioFileRegion何时完成播放?

时间:2013-01-27 06:32:24

标签: ios core-audio

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

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

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

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

之前是否有人遇到过这个问题并解决了问题,或者对我如何处理这个问题有所了解?

提前致谢。

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

如果您想知道音轨何时到达结尾,您可以使用class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate { @IBOutlet weak var aCollectionView: UICollectionView! override func viewDidLoad() { super.viewDidLoad() } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 10 } func numberOfSections(in collectionView: UICollectionView) -> Int { collectionView.allowsMultipleSelection = true return 1 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "aCell", for: indexPath as IndexPath) as! myCollectionViewCell cell.myLabel.text = "ok" cell.isSelected = false cell.layer.borderColor = UIColor.black.cgColor cell.layer.borderWidth = 2 if indexPath.row == 5 { collectionView.selectItem(at: indexPath, animated: true, scrollPosition: .left) //Add this line cell.isSelected = true } return cell } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } class myCollectionViewCell: UICollectionViewCell { @IBOutlet weak var myLabel: UILabel! override var isSelected: Bool{ didSet{ if self.isSelected { super.isSelected = true self.contentView.backgroundColor = UIColor(red:0.08, green:0.28, blue:0.45, alpha:1) } else { super.isSelected = false self.contentView.backgroundColor = UIColor(red:0.13, green:0.37, blue:0.58, alpha:0.7) } } } } (通知回叫以在要求音频单元渲染时调用)。在渲染回调中,您可以获得当前处理的帧数,并可以将它们添加到您的帧属性中。只需检查此属性是否高于轨道完成后您将能够知道的帧数。