ios连续播放3个视频

ios连续播放3个视频,ios,objective-c,video,avplayer,Ios,Objective C,Video,Avplayer,我正在尝试在第一个视频结束后立即开始一个新视频。我尝试使用AVQueuePlayer,但在第一个视频结束和第二个视频开始时会有一些延迟 我需要同步采样。即如果视频1的长度为10.25秒,那么当我播放11.5秒时,视频2的长度应为1.25秒 我一直在尝试保留3个AVPlayer对象,其中我使用相同的主时钟对每个播放器进行预滚。然后我尝试截取AVPlayerItemDidPlayToEndTimeNotification,然后调用setRate:time:atHostTime:开始下一个视频。然而,

我正在尝试在第一个视频结束后立即开始一个新视频。我尝试使用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];
    }
}

然后,我按如下方式调用预登记:

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];

我最后开始视频如下:

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
hasNewPixelBufferForItemTime
返回false。所以我猜视频还没有开始。你知道为什么吗?

因此,在我发布这篇文章(花了一天的时间争论这件事)大约一个小时后,我在这里找到了一个简单的解决方案:

使用
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 );
    }

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

你好,戈兹,请你给我一个上面代码的例子。@MaheshNarla:我已经回答了你的问题。希望能有帮助。