美文网首页
iOS14画中画实现全流程加各种坑

iOS14画中画实现全流程加各种坑

作者: 我是晶锅 | 来源:发表于2021-08-05 12:11 被阅读0次

一、实现

实现画中画很简单,步骤一二三就行。

1、准备画中画
#import <AVKit/AVKit.h>

@property (nonatomic, strong) AVPictureInPictureController *pipVC;
@property (nonatomic, strong) AVPlayerLayer *playerLayer;
@property (nonatomic, strong) AVPlayer *player;
2、配置
- (void)startPip {
    self.player = [AVPlayer playerWithURL:[NSURL URLWithString:self.liveVideo.hdlurl]];
    self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
    self.playerLayer.frame = CGRectMake(100, 80, 100, 200);
    [self.player play];
    [self.view.layer addSublayer:self.playerLayer];
    //1.判断是否支持画中画功能
    if ([AVPictureInPictureController isPictureInPictureSupported]) {
        //2.开启权限
        @try {
            NSError *error = nil;
            [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback mode:AVAudioSessionModeMoviePlayback options:AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers error:&error];
            // 为什么注释掉这里?你会发现有时 AVAudioSession 会有开启失败的情况。故用上面的方法
            [[AVAudioSession sharedInstance] setCategory:AVAudioSessionOrientationBack error:&error];
            [[AVAudioSession sharedInstance] setActive:YES error:&error];
        } @catch (NSException *exception) {
            NSLog(@"AVAudioSession发生错误");
        }
        self.pipVC = [[AVPictureInPictureController alloc] initWithPlayerLayer:self.playerLayer];
        self.pipVC.delegate = self;
    }
}
3、开始/关闭
- (void)openOrClose {
    if (self.pipVC.isPictureInPictureActive) {
        [self.pipVC stopPictureInPicture];
    } else {
        [self.pipVC startPictureInPicture];
    }
}

//各种代理
// 即将开启画中画
- (void)pictureInPictureControllerWillStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController {
    NSLog(@"");
}
// 已经开启画中画
- (void)pictureInPictureControllerDidStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController {
    NSLog(@"");
}
// 开启画中画失败
- (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController failedToStartPictureInPictureWithError:(NSError *)error {
    NSLog(@"%@", error);
}
// 即将关闭画中画
- (void)pictureInPictureControllerWillStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController {
    NSLog(@"");
}
// 已经关闭画中画
- (void)pictureInPictureControllerDidStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController {
    NSLog(@"");
}
// 关闭画中画且恢复播放界面
- (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL restored))completionHandler {
    NSLog(@"");
}

二、注意点和坑

  • AVPlayerLayer frame设置后,可调整画中画的大小

  • 画中画底层为AVPlayer,有人说只能播放视频,其实是错的,可以播放.m3u8的直播(目前某音已有该逻辑)

    • 所以存在问题,如果APP中播放器使用其它协议的URL,那么如何切换?一般APP中为SDK提供的播放器。
    • 直播中,若APP中和画中画使用不用协议的URL,其实影响不大,因为画面总是实时的,不存在同步问题,只有UI过度上需要处理。
  • 画中画为AVPictureInPictureController,若要APP内全局显示,需让单例持有

  • 真机上调试!模拟器可玩不转

  • app杀死,画中画也立即消失

(非完善,还待继续学习补充)

相关文章

  • iOS14画中画实现全流程加各种坑

    一、实现 实现画中画很简单,步骤一二三就行。 1、准备画中画 2、配置 3、开始/关闭 二、注意点和坑 AVPla...

  • [iOS ]iPhone上画中画效果实现(iOS14)

    前言 今天更新了iOS14,iOS14可以支持画中画功能,闲着无聊,来写个代码实现。 话不多说,先上Demo Pi...

  • 画中画功能探究

    最近开始研究iOS14画中画功能的实现,最终分别通过使用AVPlayerViewController构建播放器和A...

  • iOS14 画中画调研

    iOS14 画中画 调研 画中画(PictureInPicture)在iOS9就已经推出了,不过之前都只能在iPa...

  • iOS14 画中画

    画中画本质是添加了一个视频悬浮框,demo地址:点我:demo链接[https://github.com/howh...

  • iOS14画中画功能实现

    1.开启后台模式 2.导入框架#import 创建AVPictureInPictureController注:...

  • iOS14 中大幅提升生产力的苹果笔「涂文字」操作

    最近 苹果发布了iOS14的更新预览版,我们想必已经看到很多介绍文章了。大多在讲界面改善,屏幕小组件,画中画 之类...

  • Android-RecyclerView翻页案例-某些机型输入法

    之前的实现 MonkeyLei:Android-RecyclerView实现多页面答题流程,翻页/提交实现+RV加...

  • 20161128

    新的一天,即将结束,过了个周末,立马鼻塞,加嘴唇上火,各种身体不适,状态不佳,也直接影响工作 今天是网络工厂全流程...

  • iOS 14小组件开发总结

     最近项目有开发iOS小组件的需求,开始调研到实现踩了很多坑,借此记录下来。 iOS14系统发布后,桌面添加的新的...

网友评论

      本文标题:iOS14画中画实现全流程加各种坑

      本文链接:https://www.haomeiwen.com/subject/uawqvltx.html