You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义iOS App内启动AirPlay并实现屏幕镜像?

iOS App内实现AirPlay屏幕镜像方案

可以在自定义iOS App内实现AirPlay屏幕镜像功能,以下是两种主流实现方案,结合你已有的代码进行补充说明:

方案一:利用系统外接屏幕API实现原生镜像

当用户通过AirPlay连接外接显示器后,iOS系统会自动识别出一个额外的UIScreen实例。你可以为这个外接屏幕创建独立的UIWindow,将App的内容(或自定义内容)渲染到这个窗口上,实现原生的屏幕同步效果。

实现步骤:

  1. 监听屏幕连接状态变化
  2. 为外接屏幕创建并配置UIWindow
  3. 将需要镜像的内容挂载到外接窗口上

代码示例(Objective-C):

@interface YourViewController ()
@property (nonatomic, strong) UIWindow *externalWindow;
@end

@implementation YourViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 保留你原有视频投屏的代码...
    
    // 监听屏幕连接/断开通知
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(screenDidConnect:)
                                                 name:UIScreenDidConnectNotification
                                               object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(screenDidDisconnect:)
                                                 name:UIScreenDidDisconnectNotification
                                               object:nil];
    
    // 检查当前是否已连接外接屏幕
    if ([UIScreen screens].count > 1) {
        [self setupExternalScreen:[UIScreen screens][1]];
    }
}

- (void)screenDidConnect:(NSNotification *)notification {
    UIScreen *externalScreen = notification.object;
    [self setupExternalScreen:externalScreen];
}

- (void)screenDidDisconnect:(NSNotification *)notification {
    self.externalWindow = nil;
}

- (void)setupExternalScreen:(UIScreen *)externalScreen {
    // 创建外接屏幕窗口
    self.externalWindow = [[UIWindow alloc] initWithFrame:externalScreen.bounds];
    self.externalWindow.screen = externalScreen;
    
    // 方式1:直接镜像当前视图的快照
    UIViewController *mirrorVC = [[UIViewController alloc] init];
    mirrorVC.view = [self.view snapshotViewAfterScreenUpdates:YES];
    self.externalWindow.rootViewController = mirrorVC;
    
    // 方式2:挂载自定义视图控制器(比如和主界面完全一致的页面)
    // UIViewController *mirrorVC = [[YourMainViewController alloc] init];
    // self.externalWindow.rootViewController = mirrorVC;
    
    self.externalWindow.hidden = NO;
}

@end

方案二:通过屏幕捕获+AirPlay推送实现自定义镜像

如果需要更灵活的控制(比如只镜像App内的某个区域、对画面做编码处理),可以使用AVCaptureSession捕获App屏幕画面,再结合AirPlay路由推送流内容。

核心代码片段:

// 初始化屏幕捕获会话
AVCaptureSession *captureSession = [[AVCaptureSession alloc] init];
captureSession.sessionPreset = AVCaptureSessionPresetHigh;

// 创建屏幕捕获输入(iOS 11+支持)
if (@available(iOS 11.0, *)) {
    AVCaptureScreenInput *screenInput = [[AVCaptureScreenInput alloc] initWithDisplayID:UIScreen.mainScreen.displayID];
    // 可设置只捕获指定区域:screenInput.cropRect = CGRectMake(0,0,300,300);
    if ([captureSession canAddInput:screenInput]) {
        [captureSession addInput:screenInput];
    }
}

// 创建输出并关联AirPlay路由
AVCaptureMovieFileOutput *fileOutput = [[AVCaptureMovieFileOutput alloc] init];
if ([captureSession canAddOutput:fileOutput]) {
    [captureSession addOutput:fileOutput];
}

// 结合你已有的AVRoutePickerView选择AirPlay设备后,启动捕获
[captureSession startRunning];

注意事项:

  • 方案一依赖系统原生机制,用户需先通过AVRoutePickerView或控制中心选择AirPlay设备
  • 方案二需要iOS 11及以上版本,且需在Info.plist中添加NSMicrophoneUsageDescription权限(部分设备强制要求)
  • 两种方案都需在Xcode的Capabilities中开启Audio, AirPlay, and Picture in Picture后台模式

内容的提问来源于stack exchange,提问作者cuSoon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 21:17:44