Xcode Objective-C IOS - 如何相邻播放两个视频?

Xcode Objective-C IOS - How to play two videos next to each other?

我想同时播放两个视频。 在构建 Mac 应用程序时,我通过使用 AVPlayer 对象来完成此操作。 您可以将此视图放在 ViewController.

但是当我试图在 IOS 项目的对象库中查找 AVPlayer 对象时,它没有出现。只有 AVKit Player View Controller 做到了。

但是 AVKit Player View Controller 总是在单独的 ViewController 中全屏播放视频。我在互联网上搜索了一种方法,可以将两个视频并排显示,但到目前为止,我还没有找到任何有用的东西。

所以我的问题是:有什么方法可以让我在 IOS 应用程序中并排显示两个视频?

AVPlayer 自 iOS 4 以来在 iOS 上可用。AVPlayer 是一个控制器对象,用于管理没有 UI 的媒体资产的播放直接绑定到它的元素,这就是为什么它不位于 IB 对象库中的原因。相反,您可以使用 AVPlayerLayer 我们使用 Apple 的标准 AVPlayerViewController 构建您自己的 UI,其中包括默认控件和标准播放行为。让两个视频并排播放的最快方法是在另一个视图控制器中嵌入两个 AVPlayerViewController 实例。如果您使用的是故事板,您的代码可以短至:

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.destinationViewController isKindOfClass:[AVPlayerViewController class]] && [segue.identifier isEqualToString:@"First Player"])
    {
        AVPlayerViewController *avPlayerViewController = (AVPlayerViewController *)segue.destinationViewController;
        avPlayerViewController.player = [AVPlayer playerWithURL: [NSURL URLWithString:@"http://devstreaming.apple.com/videos/wwdc/2016/703rx8zlfedjfom6l93/703/hls_vod_mvp.m3u8"]];
        [avPlayerViewController.player play];

    } else if ([segue.destinationViewController isKindOfClass:[AVPlayerViewController class]] && [segue.identifier isEqualToString:@"Second Player"])
    {
        AVPlayerViewController *avPlayerViewController = (AVPlayerViewController *)segue.destinationViewController;
        avPlayerViewController.player = [AVPlayer playerWithURL: [NSURL URLWithString:@"http://devstreaming.apple.com/videos/wwdc/2016/703rx8zlfedjfom6l93/704/hls_vod_mvp.m3u8"]];
        [avPlayerViewController.player play];
    }
}

@end

或类似的东西。大部分工作由两个容器视图完成并将转场嵌入到两个 AVPlayerViewControllers 如果您想要自定义视频 UI,您可以查看 Apple's PIP sample code 他们展示了如何使用键值观察自定义视频播放器 UI.

But the AVKit Player View Controller always plays videos full screen in a separate ViewController

这是错误的。如果您希望电影视图显示为子视图,请将 AVPlayerViewController 设为子视图控制器。从 Storyboard 中的 Container View Controller 开始,然后嵌入到 AVPlayerViewController。

或者,您可以在没有 AVPlayerViewController 的情况下使用 AVPlayer(在代码中)。

// ViewController.h

@import AVFoundation;
@import AVKit;
@property(nonatomic, readonly) AVPlayerItem *currentItem;

// ViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
     i=0;
     [self videoPlay:[_passdataArr valueForKey:@"videoUrl"]];


}

-(void)videoPlay:(NSArray*)links
{
    NSLog(@"1");
    //create an AVPlayer
    _detailView.hidden=YES;
//    NSMutableArray *videolinksArr=[[NSMutableArray alloc] init];
//    videolinksArr=_videoLinkArr;
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",links]];

    // create a player view controller
    player = [AVPlayer playerWithURL:url];
    AVPlayerViewController *controller = [[AVPlayerViewController alloc] init];

    [self addChildViewController:controller];
    [self.view addSubview:controller.view];

    controller.view.frame = self.bgimg.frame;
    controller.player = player;
    controller.showsPlaybackControls = YES;
    player.closedCaptionDisplayEnabled = NO;
    [player pause];
    [player play];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(AllVideoPlay:) name:AVPlayerItemDidPlayToEndTimeNotification object:_currentItem];



}

-(void)AllVideoPlay:(NSNotification*)aNotification
{
    NSLog(@"2");

    NSArray *temp = _videoLinkArr[i];
    [self videoPlay:temp];
    i++;
}