连麦合图有两个方案,一是云端合图,二是 App 端合图,一般推荐使用云端合图,因为 App 端合图要多路播放,对手机性能要求较高。
连麦的界面布局一般是大小屏,如下图:
这里有两个问题需要解决:
- 手机分辨率碎片化严重,合图会被裁剪,怎么避免连麦用户被裁剪?
- 连麦用户和连麦UI窗口如何吻合?
从友盟全域罗盘中了解到,Android 手机分辨率高宽比在 1.7 ~ 2.1 之间,未来手机分辨率高宽比呈增大趋势。连麦用户放置在右下角时,其右边比底部更容易被裁剪,所以在旁路推流参数中,主播宽高比应该接近 2.1。在实践中发现,将主播的分辨率设为 960x480,连麦用户的分辨率设为 200x160,再调整连麦用户的左边距和上边距就可以解决问题一。
1 2 3 4 5 6
| int aw = 480; int ah = 960; int gw = 160; int gh = 200; int leftMargin = aw / 2 + 5 * (aw / 2 - gw) / 6; int topMargin = ah / 2 + 2 * (ah / 2 - gh) / 5;
|
接下来看看问题二,合图被裁剪有两种情况:
合图高宽比大于屏幕高宽比,基于屏幕宽等比例拉伸,垂直方向裁剪;
合图高宽比小于屏幕高宽比,基于屏幕高等比例拉伸,水平方向被裁剪。
基于旁路推流参数和合图被裁剪的分析,可以得出连麦用户和连麦UI窗口的吻合参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| float aRatio = (float) ah / aw; float sRatio = (float) sh / sw; int leftMargin; int topMargin; int scaleGw; int scaleGh; if (aRatio > sRatio) { float scaleRatio = (float) sw / aw; int scaleAw = (int) (scaleRatio * aw); int scaleAh = (int) (scaleRatio * ah); scaleGw = (int) (scaleRatio * gw); scaleGh = (int) (scaleRatio * gh); leftMargin = scaleAw / 2 + 5 * (scaleAw / 2 - scaleGw) / 6; topMargin = scaleAh / 2 + 2 * (scaleAh / 2 - scaleGh) / 5 - (scaleAh - sh) / 2; } else if (aRatio < sRatio) { float scaleRatio = (float) sh / ah; int scaleAw = (int) (scaleRatio * aw); int scaleAh = (int) (scaleRatio * ah); scaleGw = (int) (scaleRatio * gw); scaleGh = (int) (scaleRatio * gh); leftMargin = scaleAw / 2 + 5 * (scaleAw / 2 - scaleGw) / 6 - (scaleAw - sw) / 2; topMargin = scaleAh / 2 + 2 * (scaleAh / 2 - scaleGh) / 5; } else { float scaleRatio = (float) sw / aw; int scaleAw = (int) (scaleRatio * aw); int scaleAh = (int) (scaleRatio * ah); scaleGw = (int) (scaleRatio * gw); scaleGh = (int) (scaleRatio * gh); leftMargin = scaleAw / 2 + 5 * (scaleAw / 2 - scaleGw) / 6; topMargin = scaleAh / 2 + 2 * (scaleAh / 2 - scaleGh) / 5; }
|