AirPlay三两事

AirPlay其实算不上什么新技术,其是2010年Apple推出的无线通讯技术,其前身是AirTunes,而在AirTunes之前,Apple公司其实是DLNA协议的成员之一。
说了这么多,还是让我们来一一解释一下这些名词吧。

DLNA

DNLA,Digital Living Network Alliance,是索尼、英特尔、微软等发起的一套 PC、移动设备、消费电器之间互联互通的协议。它们的宗旨是“随时随地享受音乐、照片和视频”。目前DLNA更多只是能将手机的照片和视频投送到大屏幕中。

AirTunes

AirTunes,其是AppleDNLA成员中退出后自己单独弄的一套协议标准,主要是为之前iTunes中音乐远程播放提供服务的,其所支持的能力包括发现设备、音频播放所需要的各种参数,如MetaData(音乐信息),音频频道、加密算法等等。
具体内容请参考AirPlay Protocol.

AirPlay

AirPlay是对AirTunes的扩展,支持音频、图片、视频、镜像传输播放。同时在iOS中也提供了相应的API支持,AirPlay的镜像输出最大的亮点是多屏输出(其实目前只能支持一个额外的屏幕)。多屏输出的一经典应用场景是把游戏内容投影到电视上,然后手机充当手柄,实现手机屏幕与投影屏幕的分离。

接下来,我们一一聊聊AirPlay中的各种技术的使用

Audio

Image
AirPlay在Audio方便的能力支持包括:

  • 提供AirPlay Button入口
  • 支持后台播放
  • 提供当前播放的Playing info
  • 处理Remote Control事件

其具体实现为:

AirPlay Button入口

AVPlayer中的属性allowsAirPlay属性进行AirPlay播放。

后台播放

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
同时在Xcode中的Background Modes勾选Audio And AirPlay.

提供当前播放的Playing info

[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:songInfo];
其中,songInfo可以包含歌手、标题、封面等信息。

Remote Control事件处理

(BOOL) canBecomeFirstResponder {return YES;}

- (void) viewDidAppear: (BOOL) animated {
    [super viewDidAppear:animated];
    [ [UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [self becomeFirstResponder];
}

- (void) viewWillDisappear: (BOOL) animated {
    [super viewWillDisappear:animated];
    [ [UIApplication sharedApplication] endReceivingRemoteControlEvents];
    [self resignFirstResponder];
}

- (void) remoteControlReceivedWithEvent: (UIEvent *) receivedEvent {
    if (receivedEvent.type == UIEventTypeRemoteControl) {
        switch (receivedEvent.subtype) {
           case UIEventSubtypeRemoteControlTogglePlayPause:
                [self playPauseToggle: nil]
                break;
            case UIEventSubtypeRemoteControlNextTrack:
                [self nextTrack: nil]
                break;

Video

Image

程序能够控件的内容有限,不支持后台播放。可以通过标准控件直接进行本地、视频流的播放。


Mirroring

Image

  1. 支持External Display
    其实这里目前只支持一个额外屏幕的输出

  2. UIScreenMode选择
    额外屏幕,可能有很多Model的支持,如720P,1080P,或者1024*768等等。

  3. overscan选择
    它可以调整外接显示器的过扫描补偿。由于技术上的限制,旧的CRT扫描输入的图片时可能会越过显示管的边界,造成显示的图像不完整。选择UIScreenOverscanCompensationInsetApplicationFrame模式,屏幕外的内容被裁剪掉。

具体实现

通过通知来捕获设备是否已经连接AirPlay设备

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(screenDidChange:) name:UIScreenDidConnectNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(screenDidChange:)
name:UIScreenDidDisconnectNotification object:nil];
- (void)screenDidChange:(NSNotification *)notification
{
    NSArray *screens = [UIScreen screens];
    NSUInteger screenCount = [screens count];
    if (screenCount > 1)
    {
        self.extScreen = [screens objectAtIndex:1]; //额外屏幕
        NSArray *availableModes = [self.extScreen availableModes];
          NSInteger selectedRow = [availableModes count] - 1;
          self.extScreen.currentMode = [availableModes objectAtIndex:selectedRow];
         self.extScreen.overscanCompensation =UIScreenOverscanCompensationInsetApplicationFrame;

        if (self.extWindow == nil) {
            UIWindow *extWindow = [[UIWindow alloc] initWithFrame:[self.extScreen bounds]];
            self.extWindow = extWindow;
        }
        self.extWindow.screen = self.extScreen;
        [self.extWindow makeKeyAndVisible];
        [self.view addSubview:self.userInterfaceController.view];


支持AirPlay的硬件设备都有哪些呢?除了Apple TV以外,我们还可以利用下面这些黑科技:

  1. 除了Apple TV外,只要是破解了AirPlay协议的软件或者设备都可以支持AirPlay.

  2. 支持AirPlay的软件有:AirServer/Reflection/AirMac/Banana TV等等,把这些软件装在Windows 或者 Mac系统中,就可以电脑当成AirPlay设备了。

  3. 另外也可以在其它硬件中实现AirPlay协议,例如iPazzPort
    这样的设备接收到AirPlay的数据后再通过HDMI数据线把数据传输给电视。当然京东上面这样的设备还有很多。

  4. 当然也有电视直接实现AirPlay协议的,例如小米电视


在iOS中进行AirPlay投影的话,SDK中也集成了下面这些控件,可以更加轻松地进行投影播放

MpMoviePlayerController
视频播放控件
MpVolumeView
音量调节控件
AVPlayer
音频、视频播放控件
UIWebView
webView,Safari在webkit集成了Airplay的视频播放的API

说到AirPlay,就不得不提一下Miracast

Miracast

Miracast是由Wi-Fi联盟于2012年所制定,以Wi-Fi直连为基础的无线显示标准。支持此标准的设备可通过无线方式分享视频画面,例如手机可通过Miracast将影片或照片直接在电视或其他装置播放而无需受到连接线缆长度的影响。
DLNA不同的是,Miracast 也有类似于AirPlay 的镜像功能,可以将手机中屏幕内容直接投放到高清电视屏幕里,这样你也可以通过电视屏幕来玩游戏了。

iPhone并不支持这两种协议,Miracast被Android设备广泛使用,但要注意的是它的延迟问题。
下面是AirPlayDLNA以及Miracast三者之间的一个能力对比

功能 Airplay DLNA Miracast
音频输出 支持 支持 支持
视频输出 支持 支持 支持
镜像输出 支持 不支持 支持
分屏输出 支持 不支持 部分支持

参考阅读:

2015-08-20 20:14519