【问题标题】:Playing multiple files with a single file player audio unit使用单个文件播放器音频单元播放多个文件
【发布时间】:2012-11-07 04:28:13
【问题描述】:

我正在尝试使用文件播放器音频单元 (kAudioUnitSubType_AudioFilePlayer) 播放多个文件(当然不是同时播放)。那是在iOS上。 所以我已经成功地打开了文件并将它们的详细信息存储在AudioFileID 的数组中,我使用kAudioUnitProperty_ScheduledFileIDs 将其设置为音频单元。现在我想定义 2 个ScheduledAudioFileRegion,每个文件一个,并将它们与文件播放器一起使用...

但我似乎无法找到:

  • 如何设置kAudioUnitProperty_ScheduledFileRegion属性来存储这2个区域(实际上是如何定义每个区域的索引)?
  • 如何触发特定区域的播放..我的猜测是kAudioTimeStampSampleTimeValid参数应该启用此功能但如何定义要播放的区域?

也许我对我应该使用这个音频单元的方式完全错误,但文档很难获得,我还没有找到任何示例显示在同一播放器上播放 2 个区域! 提前致谢。

【问题讨论】:

    标签: ios core-audio audiounit


    【解决方案1】:

    您需要在每次想要播放文件时安排区域。在 ScheduledAudioFileRegion 中,您必须设置 AudioFileID 才能播放。当单位中的当前时间(样本)等于或大于预定区域中的样本时间时开始播放。

    例子:

    // get current unit time
    AudioTimeStamp timeStamp;
    UInt32 propSize = sizeof(AudioTimeStamp);
    AudioUnitGetProperty(m_playerUnit, kAudioUnitProperty_CurrentPlayTime, kAudioUnitScope_Global, 0, &timeStamp, &propSize);
    
    // when to start playback
    timeStamp.mSampleTime += 100;
    
    // schedule region
    
    ScheduledAudioFileRegion region;
    memset(&region, 0, sizeof(ScheduledAudioFileRegion));
    region.mAudioFile = ...; // your AudioFileID
    region.mFramesToPlay = ...; // count of frames to play
    region.mLoopCount = 1;
    region.mStartFrame = 0;
    region.mTimeStamp = timeStamp;
    
    
    AudioUnitSetProperty(m_playerUnit, kAudioUnitProperty_ScheduledFileRegion, kAudioUnitScope_Global, 0, &region,sizeof(region));
    

    【讨论】:

    • 非常感谢...我以为API可以允许提前定义多个区域,然后触发你想玩的那个!
    • @Aliaksandr 我尝试使用此方法获取我尝试使用音频单元播放的音频文件的当前时间戳,但它返回一个空的“ts”结构。它根本不会改变以前的值。 (音频播放正常)我得到-10879,即kAudioUnitErr_InvalidProperty作为返​​回值OSStatus
    猜你喜欢
    • 2012-07-31
    • 2014-10-07
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多