• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 05:37:07 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

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

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

我使用以下代码预卷我的视频:

- (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 返回假。所以我猜视频还没有开始。任何想法为什么?



Best Answer-推荐答案


因此,在我发布这篇文章大约一个小时后(我花了一天的大部分时间都在为它争吵),我在这里找到了一个简单的解决方案: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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap