La imagen en imagen de iOS14 realiza todo el proceso más varios pozos

1. Realización

Conseguir imagen en imagen es muy sencillo, basta con seguir uno, dos o tres pasos.

1. Prepárese para la imagen en imagen
#import <AVKit/AVKit.h>

@property (nonatomic, strong) AVPictureInPictureController *pipVC;
@property (nonatomic, strong) AVPlayerLayer *playerLayer;
@property (nonatomic, strong) AVPlayer *player;
复制代码
2. Configuración
- (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. Iniciar/Cerrar
- (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(@"");
}
复制代码

En segundo lugar, preste atención a los puntos y pozos.

  • Después de configurar el marco AVPlayerLayer, se puede ajustar el tamaño de la imagen en imagen

  • La capa inferior de la imagen en imagen es AVPlayer. Algunas personas dicen que solo puede reproducir video, pero es incorrecto. Puede reproducir la transmisión en vivo de .m3u8 (actualmente, cierto audio tiene esta lógica)

    • Entonces, hay un problema, si el reproductor en la aplicación usa URL de otros protocolos, ¿cómo cambiar? El reproductor proporcionó el SDK en la aplicación general.
    • En la transmisión en vivo, si la aplicación y la imagen en imagen usan URL que no usan el protocolo, no afectará mucho, porque la imagen siempre es en tiempo real, no hay problema de sincronización, solo la interfaz de usuario necesita tratarse en exceso.
  • La imagen en imagen es AVPictureInPictureController. Si desea mostrarlo globalmente en la aplicación, debe dejar que el singleton mantenga el

  • ¡Depuración en la máquina real! El emulador es jugable.

  • Cuando se cierra la aplicación, la imagen en imagen desaparece inmediatamente

Supongo que te gusta

Origin juejin.im/post/7078530834906480653
Recomendado
Clasificación