将循环视频同步到自定义音频

时间:2018-10-18 22:51:43

标签: ios audio avfoundation avplayer

WWDC2012's Real-Time Media Effects and Processing during Playback Session说明了如何将AVPlayer与自定义音频同步。释义,你

  1. 同时开始播放AVPlayer和自定义音频
  2. 以相同的速度播放

第一部分是通过在AVPlayer上加上prerollAtRate:completionHandler:来实现的,因此可以从“最小延迟”开始播放,第二部分是通过使AVPlayer使用iOS Audio时钟。

该代码段假定您已计算出将来的主机时间,您预计音频会传播给扬声器(从字面上看,这最后一句话似乎暗示着无所不知,所以让我们将其作为您的[期望]音频开始主持人时间)。

CMClockRef audioClock = NULL;
OSStatus err = CMAudioClockCreate(kCFAllocatorDefault, &audioClock);
if (err == noErr) {
    [myPlayer setMasterClock:audioClock];
    [myPlayer prerollAtRate:1.0 completionHandler:^(BOOL finished){
        if (finished) {
            // Calculate future host time here
            [myPlayer setRate:1.0 time:newItemTime atHostTime:hostTime];
        } else {
            // Preroll interrupted or cancelled
        }
    }];
}

这是一小段代码,但它引发了很多问题。如果预卷currentTimenewItemTime不同意怎么办?视频和音频的播放速度不是每秒一秒钟吗?那他们的时钟不应该一样吗? 48kHz不会分频60fps吗?代码如何只需要知道所需的开始时间,而无需知道音频代码的其他详细信息?是由于一个iOS音频时钟吗?这个API是巧妙还是无法与AVFoundation的其他功能完美融合的可怕的非正交混搭?

尽管我对此表示怀疑,但该代码似乎可以正常工作,但是我想无缝循环视频和自定义音频。问题是如何?

我无法预播放正在播放的AVPlayer,因为发生在currentTime上(并且播放器在播放时不希望更改其缓冲区)。也许是一对交替滚动的AVPlayerAVPlayerLooper听起来很有前途。它实际上不是AVPlayer,但它包装了AVQueuePlayer(是)。假设preroll在AVQueuePlayer上有效,并且我特别注意循环自定义音频,那么这可能有效。否则,我认为唯一剩下的选择是将AVComposition内的视频和自定义音频放到预滚动和抽拔状态,然后在AVPlayerLooper的帮助下循环播放。

0 个答案:

没有答案