Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios AVURLAsset正确初始化,但有时其关联的AVPlayerLayer仅呈现黑色_Ios_Ipad_Rendering_Avplayer_Mediaplayback - Fatal编程技术网

Ios AVURLAsset正确初始化,但有时其关联的AVPlayerLayer仅呈现黑色

Ios AVURLAsset正确初始化,但有时其关联的AVPlayerLayer仅呈现黑色,ios,ipad,rendering,avplayer,mediaplayback,Ios,Ipad,Rendering,Avplayer,Mediaplayback,我有一个应用程序,用户可以从本地视频文件中进行选择。当推送其中一个缩略图时,用户将看到一个新的视图,其中有一个我制作的自定义视频播放器,用于播放视频 这是完美的,但只是有时。有趣的是,如果用户选择一个新视频(从而获得一个新的视图,初始化一个新的自定义视频播放器对象)整整5次,则用于显示播放器视觉效果的底层AVPlayerLayer将呈现黑色,即使底层资产似乎仍然正确加载(播放器界面仍然保留视频的正确持续时间等) 初始化新的自定义媒体播放器对象时(加载包含视图的媒体播放器的视图控制器时发生),这是

我有一个应用程序,用户可以从本地视频文件中进行选择。当推送其中一个缩略图时,用户将看到一个新的视图,其中有一个我制作的自定义视频播放器,用于播放视频

这是完美的,但只是有时。有趣的是,如果用户选择一个新视频(从而获得一个新的视图,初始化一个新的自定义视频播放器对象)整整5次,则用于显示播放器视觉效果的底层AVPlayerLayer将呈现黑色,即使底层资产似乎仍然正确加载(播放器界面仍然保留视频的正确持续时间等)

初始化新的自定义媒体播放器对象时(加载包含视图的媒体播放器的视图控制器时发生),这是初始化器方法的一部分,用于设置AVPlayer及其关联项:

    // Start to load the specified asset
    mediaAsset = [[AVURLAsset alloc] initWithURL:contentURL options:nil];

    if (mediaAsset == nil)
        NSLog(@"The media asset is zero!!!");

    // Now we need to asynchronously load in the tracks of the specified asset (like audio and video tracks). We load them asynchronously to avoid having the entire app UI freeze while loading occours
    NSString* keyValueToLoad = @"tracks";

    // When loading the tracks asynchronously we also specify a completionHandler, which is the block of code that should be executed once the loading is either or for some reason failed
    [mediaAsset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:keyValueToLoad
                                                 ] completionHandler:^
     {
         // When this block gets executed we check for potential errors or see if the asset loaded successfully
         NSError* error = nil;

         AVKeyValueStatus trackStatus = [mediaAsset statusOfValueForKey:keyValueToLoad error:&error];

         if (error != nil)
         {
             NSLog(@"Error: %@", error.description);
         }

         //switch (trackStatus) {
             //case AVKeyValueStatusLoaded:
         if (trackStatus == AVKeyValueStatusLoaded)
         {
                 NSLog(@"Did load properly!");
                 mediaItem = [AVPlayerItem playerItemWithAsset:mediaAsset];

                if (mediaItem.error == nil)
                    NSLog(@"Everything went fine!");

                if (mediaItem == nil)
                    NSLog(@"THE MEDIA ITEM WAS NIL");

                 [mediaItem addObserver:self forKeyPath:@"status" options:0 context:&itemStatusContext];

                     mediaContentPlayer = [[AVPlayer alloc] initWithPlayerItem:mediaItem];

                         [mediaContentView setPlayer:mediaContentPlayer];

             //mediaContentView = [AVPlayerLayer playerLayerWithPlayer:mediaContentPlayer];

                [activeModeViewBlocked configurePlaybackSliderWithDuration:mediaItem.duration];

                 originalDuration = mediaItem.duration.value / mediaItem.duration.timescale;

                 // We will subscribe to a timeObserver on the player to check for the current playback time of the movie within a specified interval. Doing so will allow us to frequently update the user interface with correct information
                 playbackTimeObserver = [mediaContentPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1, 50) queue:dispatch_get_main_queue() usingBlock:^(CMTime time)
                                         {
                                             NSLog(@"TIME UPDATED!");
                                             [activeModeViewBlocked updatePlaybackSlider:time];
                                         }];

                 [self syncUI];
         }

         if (trackStatus == AVKeyValueStatusFailed)
         {
             NSLog(@"Something failed!");
         }

         if (trackStatus == AVKeyValueStatusCancelled)
         {
             NSLog(@"Something was cancelled!");
         }
     }];
现在,如果我初始化这个自定义媒体播放器对象5次,它总是开始渲染黑屏


有人知道为什么会发生这种情况吗?

这也让我觉得有点奇怪。AVFoundation允许的并发视频播放器的数量是有限制的。这个数字是4个(对于iOS 4.x,最近这个数字似乎有所增加。例如,在iOS 7上,我一个屏幕上最多有8个,没有问题)。这就是为什么第五个会变黑的原因。你甚至不能假设你会得到四个,因为其他应用可能需要一个“渲染管道”

此API导致渲染管道:

+[AVPlayer playerWithPlayerItem:]

您使用了什么解决方案?您一直只保留一个AVPlayer实例吗?我停止了所有播放器并释放了它们,然后切换到另一个页面,在该页面中我动态创建了四个播放器。我的问题是我想在UITableViewCell中显示AVPlayer。由于实例数量有限,我是否应该创建新的AVPlayer e每次我想玩它(滚动时)?这会导致出现非常不稳定和不好看的滚动。你知道如何解决这个问题吗?你有没有关于四个限制的引用?我已经成功地让多达9个AVPlayer同时运行。这一点在较新的iOS版本上确实发生了变化。在iOS 7上,我一次最多可以在一个屏幕上运行八个。