iOS第三方框架使用技巧

iOS AirPlay投屏功能实现

2020-03-30  本文已影响0人  心态别炸

相信很部分人有点懵,网上帖子很多关于AirPlay,看完后还是有点不明白,怎么支持调试使用AirPlay来成功投屏!

通俗易懂直接上
首先AirPlay需要引入<MediaPlayer/MediaPlayer.h>

self.volumView = [[MPVolumeView alloc] initWithFrame:view.bounds];

[self.volumView setRouteButtonImage:[UIImage imageNamed:showForScreenImg] forState:UIControlStateNormal];

self.volumView.showsVolumeSlider = NO;

[viewaddSubview:self.volumView];

前提有AirPlay设备可用,点击MPVolumeView弹出列表,选中可用设备,此时AirPlay已经连接成功。

如何将音频、视频显示连接设备上

NSURL *mediaUrl = [NSURL URLWithString:airPlayUrl];
//为即将播放的视频内容进行建模
self.item = [[AVPlayerItem alloc] initWithURL:mediaUrl];
//给播放器赋值要播放的对象模型
self.myPlayer = [AVPlayer playerWithPlayerItem:self.item];
self.myPlayer.allowsExternalPlayback = YES;
//指定显示的Layer
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.myPlayer];
self.playerLayer.frame = self.bounds;
[self.layer addSublayer:self.playerLayer];

通过AVplay播放需要投屏的音视频即可。
根据各App业务逻辑,正常实现快进快退、暂停开始即可控制电视端投屏内容。

如何知道AirPlay的连接和断开状态?
注册AVAudioSessionRouteChangeNotification通知,该通知在音频通道发生变化时会进行调用(例如插入/拔出耳机 扬声器/听筒切换 连接/断开AirPlay设备).这个的通知是唯一且不重复的.在发生改变时[AVAudioSession sharedInstance]会发送此通知.在具体通知中通过获取当前的AirPlay通道名称来判断是否连接到了投屏设备

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteHasChangedNotification:) name:AVAudioSessionRouteChangeNotification object:[AVAudioSession sharedInstance]];

/**
    AVAudioSessionRouteChangeReasonKey = 1;
    AVAudioSessionRouteChangeReasonKey = 2;
    AVAudioSessionRouteChangeReasonKey = 4;
 **/
- (void)audioRouteHasChangedNotification:(NSNotification *)notification{
    self.airplayDeviceName = [self airplayOutputRouteName];
    BOOL isAirPlay = self.airplayDeviceName.length > 0;
   
    dispatch_async(dispatch_get_main_queue(), ^{
        if ([self.airPlayDelegate respondsToSelector:@selector(selectTvEquipmentStartAirPlay:)]) {
            [self.airPlayDelegate selectTvEquipmentStartAirPlay:self.airplayDeviceName];
        }
    });
}
//遍历当前设备所有通道.返回isEqualToString:AVAudioSessionPortAirPlay通道的具体名称,如果名称不为nil则为当前连接到了AirPlay
- (NSString*)airplayOutputRouteName
{
    AVAudioSession* audioSession = [AVAudioSession sharedInstance];
    AVAudioSessionRouteDescription* currentRoute = audioSession.currentRoute;
    for (AVAudioSessionPortDescription* outputPort in currentRoute.outputs){
        if ([outputPort.portType isEqualToString:AVAudioSessionPortAirPlay])
            return outputPort.portName;
    }
    return nil;
}

下次说:
AirPlay连接过程中多个场景音视频,禁止播放某音视频。
如何区分AirPlay与系统镜像投屏。

上一篇下一篇

猜你喜欢

热点阅读