AVPlayer does not play video Instantly on iOS 10, while audio playing only

后端 未结 4 937
南方客
南方客 2021-02-09 00:15

I am creating video with AVAssetExportSession and playing video when it finishes. But Visual Part not showing instantly but only audio is playing instantly. Visual part comes af

相关标签:
4条回答
  • 2021-02-09 00:19

    The AVVideoCompositionCoreAnimationTool when used in AVAssetExportSession interferes with AVPlayer in iOS 10.0 - 10.1.1. iOS 10.2 fixes this bug and your code should work normally.

    0 讨论(0)
  • 2021-02-09 00:23

    Try to set automaticallyWaitsToMinimizeStalling property of AVPlayer to NO in order to start playback immediately.

    _avPlayer = [[AVPlayer alloc]init]; //WithPlayerItem:_avPlayerItem];
    _avPlayer.automaticallyWaitsToMinimizeStalling = NO;
    

    But if sufficient content is not available for playing then player might stall.

    Apple documentation: https://developer.apple.com/reference/avfoundation/avplayer/1643482-automaticallywaitstominimizestal.

    Hope this helps.

    0 讨论(0)
  • 2021-02-09 00:26

    Im facing the same problem and my solution is take old code into main thread:

            -(void)ExporterManager:(DoCoExporterManager *)manager DidSuccessComplementWithOutputUrl:(NSURL *)outputUrl{
    //...
    dispatch_async(dispatch_get_main_queue(), ^{
                [_playView setContentUrl:outputUrl.path];
            });
    //...
        }
    

    Im using exportAsynchronouslyWithCompletionHandler to process my video.someone thinks that AVVideoCompositionCoreAnimationTool is the cause of the issuehttps://forums.developer.apple.com/thread/62521. I'm not sure,but i do use it.

    Just try it!

    Hope this helps!

    0 讨论(0)
  • 2021-02-09 00:39

    I do next:

    First

    I add watcher

    - (void)attachWatcherBlock {
        [self removeWatcherBlock];
        if (self.videoPlayer) {
            __weak typeof(self) wSelf = self;
            self.timeObserver = [self.videoPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1, NSEC_PER_SEC) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
                if (wSelf.playerBlock && wSelf.videoPlayer) {
                    CGFloat playTime = CMTimeGetSeconds(wSelf.videoPlayer.currentTime);
                    CGFloat duration = CMTimeGetSeconds(wSelf.videoPlayer.currentItem.duration);
                    if (playTime > 0.0f) {
                        [wSelf replaceCoverToVideo];
                    }
                    wSelf.playerBlock(wSelf, playTime, duration);
                }
            }];
        }
     [self.videoPlayer play];
    }
    

    And then if in block playTime equals duration call replay

    - (void)replay {
        __weak typeof(self) wSelf = self;
        dispatch_async(dispatch_get_main_queue(), ^{
            __strong typeof(wSelf) self = wSelf;
            if (self.videoPlayer) {
                [self.videoPlayer seekToTime:kCMTimeZero];
            }
        });
    }
    

    All this in my UIView subclass called NDVideoPlayerView

    0 讨论(0)
提交回复
热议问题