В настоящее время я использую MPMoviePlayerController
для воспроизведения видео в своем приложении. Когда я переключаюсь с одного видео на другое, это не очень плавный переход. Я пришел к выводу, что мне нужно сделать так, чтобы первое видео исчезало, а второе видео появлялось. Для этого мне нужно, чтобы два видео воспроизводились одновременно. Я знаю, что не могу сделать это с MPMoviePlayerController
. Это в документации. Можно ли это сделать с помощью AVPlayer
? Могу ли я иметь два экземпляра AVPlayer
, воспроизводящих разные фильмы, воспроизводимые одновременно в моем приложении, при этом оба фильма видны пользователю?
Можно ли использовать экземпляры AVPlayer для одновременного воспроизведения двух видео?
Ответы (4)
Вы можете воспроизводить только один фильм за раз, используя MPMoviePlayer. Тем не менее, вы можете воспроизводить несколько видео одновременно с помощью AVPlayer (в AVFoundation, аудио-видео фреймворк более низкого уровня). ">пример:
Вот как вы можете играть 8 за раз, а затем играть еще 8 за раз, прокручивая:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *cell = (UICollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:kCellIdentifier forIndexPath:indexPath];
// Enumerate array of visible cells' indexPaths to find a match
if ([self.collectionView.indexPathsForVisibleItems
indexOfObjectPassingTest:^BOOL(NSIndexPath * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
return (obj.item == indexPath.item);
}]) dispatch_async(dispatch_get_main_queue(), ^{
[self drawLayerForPlayerForCell:cell atIndexPath:indexPath];
});
return cell;
}
- (void)drawPosterFrameForCell:(UICollectionViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
[self.imageManager requestImageForAsset:AppDelegate.sharedAppDelegate.assetsFetchResults[indexPath.item]
targetSize:AssetGridThumbnailSize
contentMode:PHImageContentModeAspectFill
options:nil
resultHandler:^(UIImage *result, NSDictionary *info) {
cell.contentView.layer.contents = (__bridge id)result.CGImage;
}];
}
- (void)drawLayerForPlayerForCell:(UICollectionViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
cell.contentView.layer.sublayers = nil;
[self.imageManager requestPlayerItemForVideo:(PHAsset *)self.assetsFetchResults[indexPath.item] options:nil resultHandler:^(AVPlayerItem * _Nullable playerItem, NSDictionary * _Nullable info) {
dispatch_sync(dispatch_get_main_queue(), ^{
if([[info objectForKey:PHImageResultIsInCloudKey] boolValue]) {
[self drawPosterFrameForCell:cell atIndexPath:indexPath];
} else {
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:[AVPlayer playerWithPlayerItem:playerItem]];
[playerLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[playerLayer setBorderColor:[UIColor whiteColor].CGColor];
[playerLayer setBorderWidth:1.0f];
[playerLayer setFrame:cell.contentView.layer.bounds];
[cell.contentView.layer addSublayer:playerLayer];
[playerLayer.player play];
}
});
}];
}
Обратите внимание, что метод drawPosterFrameForCell
помещает изображение туда, где видео нельзя воспроизвести, поскольку оно хранится в iCloud, а не на устройстве.
MPMoviePlayerController
воспроизводит только одно видео за раз.
Но вы можете воспроизводить несколько видео одновременно, используя AVPlayer
.
Ниже приведена ссылка на руководство по одновременному воспроизведению нескольких видео: Воспроизвести видео одновременно.
Если вы хотите воспроизводить два видео одновременно в приложении iOS, используйте AVPlayer для воспроизведения видео.