繁体   English   中英

iOS:AVPlayerViewController视图未删除

[英]iOS: AVPlayerViewController view not removing

我使用AVPlayerViewController创建了一个示例视频应用程序。 一切正常。 但是问题出在视频播放完毕后, AVPlayerViewController视图并未移除。 另一个问题是在横向模式全屏下为肖像默认大小设置AVPlayerViewController的约束。 我是新来的约束。 请下载项目并运行项目记录器,以显示约束问题。

源代码项目: http : //www.filedropper.com/avplayerdemos

我发现您的代码有两个问题:

asset loadValuesAsynchronouslyForKeys:requestedKeys completionHandler: ^{
    dispatch_async(
                   dispatch_get_main_queue(), ^{
                       if (!asset.playable) {
                           return;
                       } else {
                           [self prepareToPlayAsset: asset withRequestedKeys: requestedKeys];
                       }

                       if (videoPlayerItem) {
                           [videoPlayerItem removeObserver:self forKeyPath:kkStatusKey];
                           [[NSNotificationCenter defaultCenter] removeObserver:self
                                                                           name:AVPlayerItemDidPlayToEndTimeNotification
                                                                         object: videoPlayerItem];
                       }
                   });
}];

上面的这段代码添加了观察者,然后移除了。 因此应更改两个:

[asset loadValuesAsynchronouslyForKeys:requestedKeys completionHandler: ^{
    dispatch_async(
                   dispatch_get_main_queue(), ^{

                       if (videoPlayerItem) {
                           [videoPlayerItem removeObserver:self forKeyPath:kkStatusKey];
                           [[NSNotificationCenter defaultCenter] removeObserver:self
                                                                           name:AVPlayerItemDidPlayToEndTimeNotification
                                                                         object: videoPlayerItem];
                       }


                       if (!asset.playable) {
                           return;
                       } else {

                           [self prepareToPlayAsset: asset withRequestedKeys: requestedKeys];
                       }



                   });
}];

问题2:

- (void)prepareToPlayAsset: (AVURLAsset *)asset withRequestedKeys: (NSArray *)requestedKeys {
     for (NSString *thisKey in requestedKeys) {
        NSError *error = nil;
        AVKeyValueStatus keyStatus = [asset statusOfValueForKey:thisKey error:&error];

        switch (keyStatus) {
            case AVKeyValueStatusUnknown:
                NSLog(@"%@ AVKeyValueStatusUnknown", thisKey);
            break;

            case AVKeyValueStatusFailed:
                NSLog(@"Error! PlayAsset failed.\nAVKey : %@.\nError: %@", thisKey, error);
                return;
            break;

            case AVKeyValueStatusLoading:
                NSLog(@"%@ AVKeyValueStatusLoading", thisKey);
            break;
            case AVKeyValueStatusCancelled:
                NSLog(@"%@ AVKeyValueStatusCancelled", thisKey);
            break;
            case AVKeyValueStatusLoaded: {

                videoPlayerItem = [AVPlayerItem playerItemWithAsset: asset];
                [videoPlayerItem addObserver:self forKeyPath: kkStatusKey options:0 context:nil];

                videoPlayer = [AVPlayer playerWithPlayerItem: videoPlayerItem];

                /**
                 * Creating the videoAdplayer through passing the avplayer object
                */
                [self createVideoPlayer: videoPlayer];

                if ([thisKey isEqualToString: @"duration"]) {

                } else if ([thisKey isEqualToString: @"tracks"]) {
                    NSLog(@"\n\n asset.tracks : %@ \n\n", asset.tracks);
                } else if ([thisKey isEqualToString: @"metadata"]) {
                    NSLog(@"\n\n assetMetadata : %@ \n\n", asset.metadata);
                }
            }
            break;

            default:
            break;
         }
    }

    if (!asset.playable) {
        return;
    }
}

在此循环中,只需检查运输负载并返回失败。 在这种情况下,有2个键,这样的代码将添加两个childviewcontroller并将播放两个项目播放器。 因此,将代码更改为:

- (void)prepareToPlayAsset: (AVURLAsset *)asset withRequestedKeys: (NSArray *)requestedKeys {
   for (NSString *thisKey in requestedKeys) {
        NSError *error = nil;
        AVKeyValueStatus keyStatus = [asset statusOfValueForKey:thisKey error:&error];

        switch (keyStatus) {
            case AVKeyValueStatusUnknown:
                NSLog(@"%@ AVKeyValueStatusUnknown", thisKey);
            break;

            case AVKeyValueStatusFailed:
                NSLog(@"Error! PlayAsset failed.\nAVKey : %@.\nError: %@", thisKey, error);
                return;
            break;

            case AVKeyValueStatusLoading:
                 NSLog(@"%@ AVKeyValueStatusLoading", thisKey);
            break;
            case AVKeyValueStatusCancelled:
                NSLog(@"%@ AVKeyValueStatusCancelled", thisKey);
            break;
            case AVKeyValueStatusLoaded: {


            }
            break;

            default:
            break;
        }
     }

     videoPlayerItem = [AVPlayerItem playerItemWithAsset: asset];
     [videoPlayerItem addObserver:self forKeyPath: kkStatusKey options:0 context:nil];

    videoPlayer = [AVPlayer playerWithPlayerItem: videoPlayerItem];

    /**
     * Creating the videoAdplayer through passing the avplayer object
     */
     [self createVideoPlayer: videoPlayer];



    if (!asset.playable) {
        return;
    }
}

我很确定您的演示。 像这样更改,它将正常运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM