本文档适用于以下平台: Android、iOS。
用户使用移动设备进行直播或视频通话时,通常有以下几种旋转方式:
以下示例中“拉流端”渲染画面的模式以默认的 “ZegoViewMode.AspectFit”(等比缩放,可能有黑边)方式,具体请参考 ZegoViewMode。
表示推流端固定采集以竖屏方式展示的视频,此时当对端设备方向为竖屏时,观看到的画面为充满设备屏幕的竖屏效果。当对端设备方向为横屏时,观看到的画面为相对推流端图像有一定旋转角度的效果(下图以逆时针旋转 90 度为例)。
如果设备的旋转方向锁定:
如果设备的旋转方向不锁定:
表示推流端固定采集以横屏方式展示的视频,此时当对端设备方向为横屏时,观看到的画面为充满设备屏幕的横屏效果。当对端设备方向为竖屏时,观看到的画面为相对推流端图像有一定旋转角度的效果(下图以逆时针旋转 90 度为例)。
如果设备的旋转方向锁定:
如果设备的旋转方向不锁定:
提供视频旋转功能,用户可以根据需要将视频相比于手机正立的方向逆时针旋转 90,180 或 270 度。便于用户结合视频场景需要,获取想要的视频渲染效果。视频旋转后会自动进行调整,以适配编码后的图像分辨率。
以上三种方式调用的接口存在差异,详细描述请参考本文的 使用步骤。
请参考 下载示例源码 获取源码。
相关源码请查看 “lib/topics/CommonFunctions/video_rotation” 目录下的文件。
在实现视频采集旋转之前,请确保:
使用竖屏直播或视频通话时,宽的分辨率应比高的分辨率小,假设为 “360 × 640”,则需要通过如下步骤实现功能。
// 创建引擎,通用场景接入
// appID 请通过官网注册获取,格式为:1234567890
// ZegoScenario.GENERAL 通用场景接入
// appSign 请通过官网注册获取,格式为:"1234567890"
// enablePlatformView 是否使用 platformView,使用 createPlatformView 时需要设置为 true
var profile = new ZegoEngineProfile(appID, ZegoScenario.GENERAL, appSign: appSign, enablePlatformView: enablePlatformView);
ZegoExpressEngine.createEngineWithProfile(profile);
ZegoVideoConfig.preset
使用预设值,例如 ZegoVideoConfigPreset.Preset360P
。// ZegoVideoConfigPreset.Preset360P 预设采集分辨率 360 × 640,编码分辨率 360 × 640,码率 600,帧率 15
var config = ZegoVideoConfig.preset(ZegoVideoConfigPreset.Preset360P);
竖屏直播的分辨率设置如下:
ZegoExpressEngine.instance.setVideoConfig(config);
ZegoExpressEngine.instance.loginRoom("test_roomid", ZegoUser.id("test_userid"));
// viewID 通过调用 ZEGO Express SDK 的 ZegoExpressEngine.instance.createCanvasView 获取
ZegoExpressEngine.instance.startPreview(canvas: ZegoCanvas(viewID));
ZegoExpressEngine.instance.startPublishingStream("test_streamid");
使用横屏直播或视频通话时,宽的分辨率应比高的分辨率大,假设为 “640 × 360”,则需要通过如下步骤实现功能。
// 创建引擎,通用场景接入
// appID 请通过官网注册获取,格式为:1234567890
// ZegoScenario.GENERAL 通用场景接入
// appSign 请通过官网注册获取,格式为:"1234567890"
// enablePlatformView 是否使用 platformView,使用 createPlatformView 时需要设置为 true
var profile = new ZegoEngineProfile(appID, ZegoScenario.GENERAL, appSign: appSign, enablePlatformView: enablePlatformView);
ZegoExpressEngine.createEngineWithProfile(profile);
var config = ZegoVideoConfig.preset(ZegoVideoConfigPreset.Preset360P);
config.captureWidth = 640;
config.captureHeight = 360;
横屏直播的分辨率设置如下:
config.encodeWidth = 640;
config.encodeHeight = 360;
ZegoExpressEngine.instance.setVideoConfig(config);
ZegoExpressEngine.instance.setAppOrientation(DeviceOrientation.landscapeRight);
ZegoExpressEngine.instance.loginRoom("test_roomid", ZegoUser.id("test_userid"));
// viewID 通过调用 ZEGO Express SDK 的 ZegoExpressEngine.instance.createCanvasView 获取
ZegoExpressEngine.instance.startPreview(canvas: ZegoCanvas(viewID));
ZegoExpressEngine.instance.startPublishingStream("test_streamid");
若在直播或视频通话过程中,App 的设置为视频画面根据重力感应的变化而旋转,则需要监听对应平台的屏幕旋转事件,并依此做视频方向的旋转。
当开发者使用 SDK 采集时,横竖屏切换主要通过 setVideoConfig 接口设置编码分辨率,并通过 setAppOrientation 接口设置视频朝向。
可以通过 WidgetsBinding 添加 addPostFrameCallback 的回调来监听屏幕旋转事件,在事件处理的回调中修改对应编码分辨率并向 SDK 告知 App 的方向。
// 初始化 WidgetsBinding
WidgetsFlutterBinding.ensureInitialized();
// WidgetsBinding 添加本窗口为观察者
WidgetsBinding.instance.addObserver(this);
WidgetsBinding.instance.addPostFrameCallback((_) {
if(MediaQuery.of(context).orientation == Orientation.portrait){
_videoConfig.encodeWidth = 360;
_videoConfig.encodeHeight = 640;
ZegoExpressEngine.instance.setAppOrientation(DeviceOrientation.portraitUp);
} else if (MediaQuery.of(context).orientation == Orientation.landscape){
_videoConfig.encodeWidth = 640;
_videoConfig.encodeHeight = 360;
ZegoExpressEngine.instance.setAppOrientation(DeviceOrientation.landscapeLeft);
}
ZegoExpressEngine.instance.setVideoConfig(_videoConfig);
});
// 销毁窗口或者不使用时需要移除观察者
WidgetsBinding.instance.removeObserver(this);
为什么录制出来的直播流好像看不了?
由于横竖屏切换时,流的编码分辨率被修改,部分第三方播放器对分辨率修改的视频兼容性不好,可能会出现播放失败的问题,因此一般不推荐在直播或视频过程中进行横竖屏切换时修改分辨率。
联系我们
文档反馈