ios一个接一个地播放3个视频

时间:2015-03-03 15:30:29

标签: ios objective-c video avplayer

我想在第一个视频结束后立即开始播放新视频。我尝试使用AVQueuePlayer,但是当第一个视频结束而第二个视频开始时有一些延迟。

我需要这个样本同步。即如果视频1长10.25秒,那么当我播放11.5秒时,视频2应为1.25秒。

我一直在尝试保留3个AVPlayer对象,我使用相同的主时钟预先播放每个播放器。然后我尝试拦截AVPlayerItemDidPlayToEndTimeNotification然后调用setRate:time:atHostTime:开始下一个视频。但是我没有播放任何视频。

我使用以下代码预先播放视频:

- (void) preRollPlayer: (AVPlayer*) pPlayer withMasterClock: (CMClockRef) masterClock atTime: (NSTimeInterval) time
{
    [pPlayer setRate: 0.0f];
    [pPlayer play];

    [pPlayer seekToTime: CMTimeMakeWithSeconds( time, 1000000 ) toleranceBefore: kCMTimeZero toleranceAfter: kCMTimeZero];
    [pPlayer setMasterClock: masterClock];

    __block volatile int32_t completed  = 0;
    [pPlayer prerollAtRate: 1.0f completionHandler: ^( BOOL finished )
        {
            OSAtomicIncrement32( &completed );
        }];

    while( completed == 0 )
    {
        [NSThread sleepForTimeInterval: 0.01];
    }
}


然后我按如下方式调用preRoll:

if ( pAudioVideoEntry.beforeVideoReader )
{
    [self preRollPlayer: pAudioVideoEntry.beforeVideoReader.player  withMasterClock: hostClock atTime: currentTime];
}

{
    [self preRollPlayer: pAudioVideoEntry.videoReader.player        withMasterClock: hostClock atTime: currentTime];
}
if ( pAudioVideoEntry.afterVideoReader )
{
    [self preRollPlayer: pAudioVideoEntry.afterVideoReader.player   withMasterClock: hostClock atTime: currentTime];
}


我终于按如下方式开始播放视频:

[pAudioVideoEntry.beforeVideoReader.player  setRate: 1.0f time: kCMTimeZero atHostTime: syncTime];
    pAudioVideoEntry.playingPlayer  = pAudioVideoEntry.beforeVideoReader.player;

[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector( beforeVideoEnded: )
                                             name: AVPlayerItemDidPlayToEndTimeNotification
                                           object: pAudioVideoEntry.beforeVideoReader.playerItem];

奇怪的是,我没有听到音频,通知从未发送,每次拨打AVPlayerItem的输出AVPlayerItemVideoOutput {{1} }返回false。所以我猜测视频还没有开始。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

所以在我发布这一天后大约一小时的经典风格(一天中大部分时间都在争夺它)我在这里找到一个简单的解决方案:https://stackoverflow.com/a/11337690/131140

使用AVMutableComposition我可以将每个视频按顺序添加到合成中,然后播放完美:

    // Fill in the assets that make up the composition
    CMTime time             = kCMTimeZero;
    for( AVAsset* pThisAsset in pAssets )
    {
        CMTimeRange timeRange   = CMTimeRangeMake( kCMTimeZero, pThisAsset.duration );
        [pComposition insertTimeRange: timeRange ofAsset: pThisAsset atTime: time error: nil];

        time        = CMTimeAdd( time, pThisAsset.duration );
    }

我有一个小错误,视频图像播放与音频不同步,但音频表现完美。大大简化了我的代码!