首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有时AVPlayer延迟和seekToTime:没有响应

有时AVPlayer延迟和seekToTime:没有响应
EN

Stack Overflow用户
提问于 2016-06-09 15:13:36
回答 1查看 1K关注 0票数 1

我正在使用AVPlayer播放youtube视频,如下所示

代码语言:javascript
复制
    - (void)startYoutubeVideoAtUrl:(NSURL *)videoUrl
{
    NSLog(@"start player at url : %@", videoUrl);

    [HCYoutubeParser h264videosWithYoutubeURL:videoUrl completeBlock:^(NSDictionary *videoDictionary, NSError *error) {
        if (videoDictionary && videoDictionary.count > 0) {
            NSString *URLString = [self chooseYoutubeUrlFromUrlList:videoDictionary];

            AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[self videoURLWithCustomScheme:@"streaming" uRLString:URLString] options:nil];

            [asset.resourceLoader setDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];

            pendingRequests = [NSMutableArray array];

            avPlayerItem = [AVPlayerItem playerItemWithAsset:asset];

            [self startVideoPlayBack];
        }
        else {
            [_delegate failedStartPalyInlineVideo];
        }
    }];
    }


-(void)startVideoPlayBack
{
    startTime = CFAbsoluteTimeGetCurrent();
    avPlayer = [[AVQueuePlayer alloc] initWithPlayerItem:avPlayerItem];
    avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];
    [avPlayerItem addObserver:self forKeyPath:@"status" options:0 context:nil];
    [avPlayerLayer addObserver:self forKeyPath:@"readyForDisplay" options:NSKeyValueObservingOptionNew context:nil];
    avPlayerLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    [self.view.layer addSublayer:avPlayerLayer];

    [self watchApiCall];
    avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(playerItemDidReachEnd:)
                                                 name:AVPlayerItemDidPlayToEndTimeNotification
                                               object:[avPlayer currentItem]];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(playerItemPlaybackStalled:)
                                                 name:AVPlayerItemPlaybackStalledNotification
                                               object:[avPlayer currentItem]];


- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context
{
    @try {
        if (!avPlayer) {
            return;
        }

        if (avPlayerItem.status == AVPlayerStatusReadyToPlay) {

        }
        else if (avPlayerItem.status == AVPlayerStatusFailed) {
            NSLog(@"----- AVPlayerStatusFailed ----");
            [self playbackVideo];
        }

        if (object == avPlayerLayer && [keyPath isEqualToString:@"readyForDisplay"]) {
            [self resetNetworkSpeedUsingLoadingTime];

            if (avPlayerLayer.readyForDisplay) {
                id<LoopingVideoDelegate> strongDelegate = self.delegate;

                if([strongDelegate readyForVideoDisplay]) {
                    [avPlayer play];
                }
                else {
                    [self removePlayer];
                }
            }
        }
    }
    @catch(NSException *ex) {
        NSLog(@"EXCEPTION : %@", ex);
    }
}

我的问题是,有些时候,视频被搁置,并解雇AVPlayerItemPlaybackStalledNotification。而且,有时在调用[avPlayerItem seekToTime:kCMTimeZero];选择器之后,它也不会响应AVPlayerItemDidPlayToEndTimeNotification。我没能找到解决办法。我查过了,

代码语言:javascript
复制
[HCYoutubeParser thumbnailForYoutubeURL:videoUrl thumbnailSize:YouTubeThumbnailDefaultHighQuality completeBlock:^(UIImage *image, NSError *error) {

    if (!error) {
        [HCYoutubeParser h264videosWithYoutubeURL:videoUrl completeBlock:^(NSDictionary *videoDictionary, NSError *error) {
            NSString *URLString = [self chooseYoutubeUrlFromUrlList:videoDictionary];

            NSURL *urlToLoad = [NSURL URLWithString:URLString];

            avPlayerItem = [[AVPlayerItem alloc] initWithURL:urlToLoad];
            [self startVideoPlayBack];
        }];
    }
    else {
        NSLog(@"error in youtube parser");
    }
}];

没有任何球员失速的问题或seekToTime:没有回应的问题。请帮帮忙。

EN

回答 1

Stack Overflow用户

发布于 2016-06-09 16:02:08

观察AVPlayerItem's loadedTimeRangesseekableTimeRanges属性,以确保AVPlayer已经加载了可播放的数据。在冒烟时,AVPlayer经常会暂停,而不是可播放的(AVPlayer可以播放的数据)数据。这将有助于进一步调查这一问题。您还可以通过调用avPlayerItem.status == AVPlayerStatusReadyToPlay上的play来尝试在获得AVPlayer时开始播放。

来自AV基础编程指南

监控回放 您可以监视播放机的演示状态和正在播放的播放机项的许多方面。这对于不受您直接控制的状态更改特别有用。例如:

  • 如果用户使用多任务切换到不同的应用程序,则播放机的rate属性将降至0.0。
  • 如果您正在播放远程媒体,则播放机项的loadedTimeRanges和seekableTimeRanges属性将随着可用数据的增加而改变。 这些属性告诉您播放机项目的时间线的哪些部分可用。
  • 当为HTTP流创建player项时,播放机的currentItem属性将发生更改。
  • 播放HTTP活动流时,播放机项的tracks属性可能会更改。如果流为内容提供不同的编码,则可能发生这种情况;如果播放机切换到不同的编码,则音轨会发生变化。
  • 如果播放由于某种原因而失败,则播放机或播放机项的状态属性可能会更改。您可以使用键值观察来监视这些属性的值的更改。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37729909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档