0

を使ってサンプル動画アプリを作成しましたAVPlayerViewController。正常に動作しています。しかし問題は、ビデオを終了した後、AVPlayerViewControllerビューが削除されないことです。AVPlayerViewController他の問題は、横向きモードのフルスクリーンで縦向きのデフォルトサイズの制約を設定することです。私は制約が初めてです。プロジェクトをダウンロードしてプロジェクト ロガーを実行すると、制約の問題が表示されます。

ソース コード プロジェクト: http://www.filedropper.com/avplayerdemos

4

1 に答える 1

1

あなたのコードには2つの問題があります:

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];
                       }
                   });
}];

上記のこのコードは、オブザーバーを追加し、後で削除します。したがって、次の 2 つを変更する必要があります。

[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 つあり、このようにコードすると 2 つ追加され、2childviewcontrollerつのアイテム プレーヤーが再生されます。コードを次のように変更します。

- (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;
    }
}

I pretty sure that with your demo. Change like this, it will work ok.

于 2016-01-08T07:34:21.097 に答える