前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TRTC横竖屏切换

TRTC横竖屏切换

原创
作者头像
腾讯云-chaoli
修改2020-09-23 13:09:38
3.2K0
修改2020-09-23 13:09:38
举报
文章被收录于专栏:即时通信与音视频

一、简介

本篇主要介绍TRTC通话时,横竖屏切换接口的调用示例、通话效果。

代码语言:javascript
复制
音视频通话完整链路,大致是:本地采集、本地预览、编码输出、网络传输、接收解码渲染。
这几步中有四个环节,能捕获到视频的角度参数:本地采集、本地预览、编码输出、接收解码渲染,
其中本地采集是摄像头硬件默认的,而本地预览、编码输出、接收解码渲染这三步,可以改变音视频数据的角度,
TRTC提供了这三个api,满足您的画面横竖屏切换需求。

用户要的只是4种效果:自己横竖屏切换+对方看到的横竖屏切换,但是sdk却有4X4X4=64种实现方式,一旦遇到问题就很费解。以下将引导:用最简单的方式,体验sdk的横竖屏切换功能。

二、api介绍

参考api文档描述:

setLocalViewRotation可以改变本地渲染预览方向,支持调整4个方向。

setRemoteViewRotation可以远端视频的渲染方向,支持调整4个方向。

setVideoEncoderRotation可以改变sdk编码输出的方向,6.9版本的sdk开始支持4个方向

三、代码示例和通话效果

0、代码修改

sdk包中的SimpleDemo为例,修改“视频通话”功能模块下的按钮点击事件,如下

代码语言:javascript
复制
else if (id == R.id.trtc_btn_mute_audio) {
//            muteAudio();

            new AlertDialog.Builder(this)
                    .setTitle("请选择")
                    .setIcon(android.R.drawable.ic_dialog_info)
                    .setSingleChoiceItems(new String[]{"本地渲染0度","本地渲染90度","本地渲染180度","本地渲染270度"}, -1, new DialogInterface.OnClickListener(){
                        public void onClick(DialogInterface arg0, int arg1) {
                            switch (arg1) {
                                case 0:mTRTCCloud.setLocalViewRotation(TRTCCloudDef.TRTC_VIDEO_ROTATION_0);break;
                                case 1:mTRTCCloud.setLocalViewRotation(TRTCCloudDef.TRTC_VIDEO_ROTATION_90);break;
                                case 2:mTRTCCloud.setLocalViewRotation(TRTCCloudDef.TRTC_VIDEO_ROTATION_180);break;
                                case 3:mTRTCCloud.setLocalViewRotation(TRTCCloudDef.TRTC_VIDEO_ROTATION_270);break;
                                default: break;
                            }
                            arg0.dismiss();
                        }
                    })
                    .setNegativeButton("取消", null)
                    .show();
            
        }

代码语言:javascript
复制
else if (id == R.id.trtc_btn_mute_video) {
//            muteVideo();

            new AlertDialog.Builder(this)
                    .setTitle("请选择")
                    .setIcon(android.R.drawable.ic_dialog_info)
                    .setSingleChoiceItems(new String[]{"远端渲染0度","远端渲染90度","远端渲染180度","远端渲染270度"}, -1, new DialogInterface.OnClickListener(){
                        public void onClick(DialogInterface arg0, int arg1) {
                            switch (arg1) {
                                case 0:mTRTCCloud.setRemoteViewRotation("123",TRTCCloudDef.TRTC_VIDEO_ROTATION_0);break;
                                case 1:mTRTCCloud.setRemoteViewRotation("123",TRTCCloudDef.TRTC_VIDEO_ROTATION_90);break;
                                case 2:mTRTCCloud.setRemoteViewRotation("123",TRTCCloudDef.TRTC_VIDEO_ROTATION_180);break;
                                case 3:mTRTCCloud.setRemoteViewRotation("123",TRTCCloudDef.TRTC_VIDEO_ROTATION_270);break;
                                default: break;
                            }
                            arg0.dismiss();
                        }
                    })
                    .setNegativeButton("取消", null)
                    .show();

        }

代码语言:javascript
复制
else if (id == R.id.trtc_btn_log_info) {
//            showDebugView();
            
            new AlertDialog.Builder(this)
                    .setTitle("请选择")
                    .setIcon(android.R.drawable.ic_dialog_info)
                    .setSingleChoiceItems(new String[]{"编码输出0度","编码输出90度","编码输出180度","编码输出270度"}, -1, new DialogInterface.OnClickListener(){
                        public void onClick(DialogInterface arg0, int arg1) {
                            switch (arg1) {
                                case 0:mTRTCCloud.setVideoEncoderRotation(TRTCCloudDef.TRTC_VIDEO_ROTATION_0);break;
                                case 1:mTRTCCloud.setVideoEncoderRotation(TRTCCloudDef.TRTC_VIDEO_ROTATION_90);break;
                                case 2:mTRTCCloud.setVideoEncoderRotation(TRTCCloudDef.TRTC_VIDEO_ROTATION_180);break;
                                case 3:mTRTCCloud.setVideoEncoderRotation(TRTCCloudDef.TRTC_VIDEO_ROTATION_270);break;
                                default: break;
                            }
                            arg0.dismiss();
                        }
                    })
                    .setNegativeButton("取消", null)
                    .show();

        }

1、原始效果

如下图左右两位手机竖持,画面效果也都是竖屏,大画面是自己,小画面是对方。

后面操作都是在这种初始状态下,调用接口旋转的。

2、本地渲染旋转90°

左不做操作,右调用mTRTCCloud.setLocalViewRotation(TRTCCloudDef.TRTC_VIDEO_ROTATION_90)

3、本地渲染旋转180°

左不做操作,右调用mTRTCCloud.setLocalViewRotation(TRTCCloudDef.TRTC_VIDEO_ROTATION_180)

4、本地渲染旋转270°

左不做操作,右调用mTRTCCloud.setLocalViewRotation(TRTCCloudDef.TRTC_VIDEO_ROTATION_270)

5、远端渲染旋转90°

左不做操作,右调用mTRTCCloud.setRemoteViewRotation("123",TRTCCloudDef.TRTC_VIDEO_ROTATION_90)。

6、远端渲染旋转180°

左不做操作,右调用mTRTCCloud.setRemoteViewRotation("123",TRTCCloudDef.TRTC_VIDEO_ROTATION_180)

7、远端渲染旋转270°

左不做操作,右调用mTRTCCloud.setRemoteViewRotation("123",TRTCCloudDef.TRTC_VIDEO_ROTATION_270)

8、编码输出旋转90°

左不做操作,右先初始化禁止重力感应mTRTCCloud.setGSensorMode(TRTCCloudDef.TRTC_GSENSOR_MODE_DISABLE);

后调用mTRTCCloud.setVideoEncoderRotation(TRTCCloudDef.TRTC_VIDEO_ROTATION_90)

9、编码输出旋转180°

左不做操作,右先初始化禁止重力感应mTRTCCloud.setGSensorMode(TRTCCloudDef.TRTC_GSENSOR_MODE_DISABLE);

后调用mTRTCCloud.setVideoEncoderRotation(TRTCCloudDef.TRTC_VIDEO_ROTATION_180)

10、编码输出旋转270°

左不做操作,右先初始化禁止重力感应mTRTCCloud.setGSensorMode(TRTCCloudDef.TRTC_GSENSOR_MODE_DISABLE);

后调用mTRTCCloud.setVideoEncoderRotation(TRTCCloudDef.TRTC_VIDEO_ROTATION_270)

四、常见问题

1、平板设备、IP电视

以上是安卓手机端的示例,手机端摄像头默认采集的视频数据,角度参数都是一致的。但是在一些安卓智能设备上,特别是平板设备、IP电视等这种横屏设备,厂商默认会把采集的视频角度先带上90°参数,以适应横屏设备播放渲染时自动横屏。

这种设备集成TRTC的表现一般是:本地渲染默认初始值0°,但是本地预览画面是横屏的,对方看到自己的画面也是横屏的。

这就需要使用sdk接口改变一下本地渲染角度,再改变一下编码输出角度。选择角度视各个厂商采集角度而定。

2、重力感应

TRTCSDK默认重力感应GSensorMode是开启的,如果您调用setVideoEncoderRotation不生效,需要把GSensorMode关闭。

还有一些手机,平放在桌面时,会发生横竖屏切换,这是手机重力感应触发的,请把手机支起来吧,或者关闭手机的重力感应。

关于sdk重力感应功能,可以参考这篇《TRTC横竖屏切换2,重力感应》

3、横屏后画面裁剪问题

横屏后画面只显示中间一小部分,看上去放大了。

这其实不是放大了,是view没有跟着画面横竖屏切换,

渲染模式默认用的是铺满模式,这种模式下,view会优先选择画面最短边,画面最长边超过view边,就会剪裁掉。

可以改变渲染模式为适应模式,这种情况下,view会优先选择画面最长边,画面最短边小于view边,就会出现两边黑边。

setRemoteViewFillMode

另外,您也可以同步调整view的横竖屏比例。

链接

《TRTC横竖屏切换2,重力感应》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、简介
  • 二、api介绍
  • 三、代码示例和通话效果
    • 0、代码修改
      • 1、原始效果
        • 2、本地渲染旋转90°
          • 3、本地渲染旋转180°
            • 4、本地渲染旋转270°
              • 5、远端渲染旋转90°
                • 6、远端渲染旋转180°
                  • 7、远端渲染旋转270°
                    • 8、编码输出旋转90°
                      • 9、编码输出旋转180°
                        • 10、编码输出旋转270°
                        • 四、常见问题
                          • 1、平板设备、IP电视
                            • 2、重力感应
                              • 3、横屏后画面裁剪问题
                              • 链接
                              相关产品与服务
                              实时音视频
                              实时音视频(Tencent RTC)基于腾讯21年来在网络与音视频技术上的深度积累,以多人音视频通话和低延时互动直播两大场景化方案,通过腾讯云服务向开发者开放,致力于帮助开发者快速搭建低成本、低延时、高品质的音视频互动解决方案。
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档