在iOS上,我有一个类型为kAudioUnitSubType_AudioFilePlayer
的音频单元,由AUNode包裹,并连接到音频图形中的多声道混音器和远程IO(输出)。
当图表正在播放时,我想循环文件,并能够确定AudioFilePlayer何时到达文件末尾,以便我可以在开始下一次循环迭代之前执行操作。
在审查AudioUnitProperties.h时,虽然有一个完成回调 - mCompletionProc
- 它只在磁盘读取文件并安排播放时调用,而不是在它实际播放完音频时才调用。 / p>
然后我考虑将音频(数据包/帧)的长度存储为属性,并且在连接到混音器的另一个输入的输入回调中,检查我们是否在文件的末尾。但是这个回调并没有在每一帧都被调用,所以我很可能会错过文件的实际结束。
之前是否有人遇到过这个问题并解决了问题,或者对我如何处理这个问题有所了解?
提前致谢。
答案 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)
}
}
}
}
(通知回叫以在要求音频单元渲染时调用)。在渲染回调中,您可以获得当前处理的帧数,并可以将它们添加到您的帧属性中。只需检查此属性是否高于轨道完成后您将能够知道的帧数。