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

标签 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 的输出 AVPlayerItemVideoOutputhasNewPixelBufferForItemTime 返回错误。所以我猜视频还没有开始。有什么想法吗?

最佳答案

所以在我发布这篇文章后大约一个小时以经典风格(我花了一天的大部分时间为它而战)我在这里找到了一个简单的解决方案: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 );
    }

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

关于ios一个接一个播放3个视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28835639/

相关文章:

objective-c - presentModalViewController 无法在已越狱的 iOs 4.0.1 设备上运行

python - 使用 PyTorchVideo 加载用于训练视频分类模型的动力学数据集时出错

c# - 在 C# 中从视频 URL 创建缩略图

ios - 从子 VC 动画父 VC 对象

objective-c - 如何在Voip App中使用带有背景的pushkit

iphone - AVAudioRecorder 中的音量

javascript - 您可以停止 HTML5 视频在滚动时暂停/停止吗?

iphone - 使用 MPVolumeView 时总是出现系统音量扬声器图标

javascript - Cordova - 原生日历集成

ios - 在 iOS 7 上,在 viewDidLoad 中设置图层变换会破坏自动布局