Skip to content

dynamicOrientation

Franken Zeng edited this page Aug 9, 2017 · 6 revisions

动态横竖屏切换

1.8.4 版本之后 直播SDK 开始支持 动态横竖屏切换的功能.
2.0.3 版本之前 直播SDK 更新旋转模式,请参考 https://github.com/ksvc/KSYLive_iOS/wiki/dynamicOrientation

当主播的手机解除了系统的屏幕锁定功能后, 将手机旋转90°, 180°或270°, 系统的UI界面会在横屏状态和竖屏状态之间切换.
所谓动态横竖屏切换就是指 直播SDK 对这种在直播过程中动态发生的状态切换的适配.

动态横竖屏切换包含如下两种层次

  • 主播端预览界面 跟随 系统UI界面的旋转
  • 观众端播放画面 跟随 主播预览界面的旋转

实现原理

  • 主播端预览界面的旋转, 可以直接使用CGAffineTransform 来实现, 参考kit类中的rotatePreview方法.
  • 要做到观众播放的画面也跟随旋转, 则可以在GPU上先旋转好, 将旋转后的画面送到后续的压缩和推流环节去, 参考kit类中的rotateStream方法.

可选方案的比较

  1. 如果单独选择选择主播端预览界面, 推流画面不旋转

    • 优点: 比较容易做到, 代价比较低, 对后续的视频压缩, 源站, CDN,和播放等环节没有影响.
    • 缺点: 观众端看到的画面不是矫正后的画面, 移动端的观众需要自己根据画面的旋转, 人肉旋转一下.
  2. 同时旋转预览界面和推流界面

    • 优点: 观众端能够始终看到正向的画面
    • 缺点: 由于视频流中的分辨率发生了变化, 对整个直播播放链路中的各个环节的适配性有要求, 任何环节支持不当, 就会出现花屏等现象.

集成方法

以使用kit类的客户为例说明集成方法, 需要定制的客户请参考kit类的实现方法

  1. 保证直播视图控制器能够接收到屏幕旋转的事件通知
  2. 在直播视图控制器中添加屏幕旋转事件回调, 在屏幕旋转结束后, 将预览视图(和推流)旋转到旋转后的朝向.
- (void)viewWillTransitionToSize:(CGSize)size
       withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { }
                                 completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
         if(SYSTEM_VERSION_GE_TO(@"8.0")) {
            [_kit rotatePreview];
            [_kit rotateStream];  // 可选
         }
     }];
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

1. 推流环节说明

2. 特色功能说明

2.1 采集

2.2 音频处理

2.3 视频处理

2.4 编码

2.5 推流

2.6 输入多样化

2.7 集成

3. 第三方功能

4. 技术专栏

5. 已知问题

8. FAQ

金山云计算

Clone this wiki locally