菜鸟教程小白 发表于 2022-12-13 05:37:07

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


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

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

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

<p>我使用以下代码预卷我的视频:</p>

<pre><code>- (void) preRollPlayer: (AVPlayer*) pPlayer withMasterClock: (CMClockRef) masterClock atTime: (NSTimeInterval) time
{
    ;
    ;

    ;
    ;

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

    while( completed == 0 )
    {
      ;
    }
}
</code></pre>

<p><br/>
然后我按如下方式调用 preRoll:</p>

<pre><code>if ( pAudioVideoEntry.beforeVideoReader )
{
    ;
}

{
    ;
}
if ( pAudioVideoEntry.afterVideoReader )
{
    ;
}
</code></pre>

<p><br/>
我终于开始视频如下:</p>

<pre><code>;
    pAudioVideoEntry.playingPlayer= pAudioVideoEntry.beforeVideoReader.player;

[ addObserver: self
                                       selector: @selector( beforeVideoEnded: )
                                             name: AVPlayerItemDidPlayToEndTimeNotification
                                           object: pAudioVideoEntry.beforeVideoReader.playerItem];
</code></pre>

<p>奇怪的是我听不到音频,通知永远不会发送,每次调用我的 <code>AVPlayerItem</code> 的输出 <code>AVPlayerItemVideoOutput</code> 的 <code>hasNewPixelBufferForItemTime </code> 返回假。所以我猜视频还没有开始。任何想法为什么?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>因此,在我发布这篇文章大约一个小时后(我花了一天的大部分时间都在为它争吵),我在这里找到了一个简单的解决方案:<a href="https://stackoverflow.com/a/11337690/131140" rel="noreferrer noopener nofollow">https://stackoverflow.com/a/11337690/131140</a> </p>

<p>使用 <code>AVMutableComposition</code>我可以将每个视频按顺序添加到合成中,并且可以完美播放:</p>

<pre><code>    // Fill in the assets that make up the composition
    CMTime time             = kCMTimeZero;
    for( AVAsset* pThisAsset in pAssets )
    {
      CMTimeRange timeRange   = CMTimeRangeMake( kCMTimeZero, pThisAsset.duration );
      ;

      time      = CMTimeAdd( time, pThisAsset.duration );
    }
</code></pre>

<p>我在播放的视频图像与音频不同步时遇到了一个小错误,但音频表现完美。也大大简化了我的代码!</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios一个接一个播放3个视频,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/28835639/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/28835639/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios一个接一个播放3个视频