直播+连麦+推流问题集锦001

为什么有的直播类SDK在网络比较差的时候会下调帧率和码率

主要是为了避免拥塞,SDK在一定的判断下会下调码率,同步的,为了保证稳定的清晰度,就必须下调帧率,不然每一帧的码率太低,会模糊。

商汤美颜的旋转问题,预览是ok的,但是远端观看就是上下颠倒或者横屏

原因是:商汤美颜是矩阵是不停的变化的,所以写固定的转换数组没用。


            float[] matrix = new float[16];
//            mSurfaceTexture.getTransformMatrix(matrix);//不能从摄像头去拿矩阵。需要的是美颜过的单位矩阵。
            android.opengl.Matrix.setIdentityM(matrix, 0);
//            float[] test = new float[16];
//            Matrix.rotateM(test, 0, matrix, 0, 90, 0, 0, 1);
//            processStMatrix(matrix, mCameraID == Camera.CameraInfo.CAMERA_FACING_FRONT);

            float[] mat1 = new float[16];
            float[] mat2 = new float[16];
            float[] rot3 = new float[16];
            float[] res1 = new float[16];
            float[] res2 = new float[16];
            float[] res3 = new float[16];
            android.opengl.Matrix.setIdentityM(mat1, 0);
            android.opengl.Matrix.translateM(mat1, 0, -0.5f, -0.5f, 0f);
            android.opengl.Matrix.setIdentityM(mat2, 0);
            android.opengl.Matrix.translateM(mat2, 0, 0.5f, 0.5f, 0f);
            android.opengl.Matrix.setIdentityM(rot3, 0);
            android.opengl.Matrix.setRotateM(rot3, 0, 180, 1, 0, 0);
            android.opengl.Matrix.multiplyMM(res1, 0, mat2, 0, rot3, 0);
            android.opengl.Matrix.multiplyMM(res2, 0, res1, 0, mat1, 0);
            android.opengl.Matrix.multiplyMM(res3, 0, res2, 0, matrix,0);

            AgoraVideoFrame vf = new AgoraVideoFrame();
            vf.format = AgoraVideoFrame.FORMAT_TEXTURE_2D;
            vf.timeStamp = System.currentTimeMillis();
//            vf.stride = mImageWidth;
//            vf.height = mImageHeight;
            vf.stride = 480;
            vf.height = 640;
            vf.textureID = out;
            vf.eglContext14 = mEGLContext;
//            vf.transform = res3;
//            android.opengl.Matrix.setIdentityM(mat1, 0);
            vf.transform = res3;
//            vf.rotation = 90;
            mRtcEngine.pushExternalVideoFrame(vf);

onRenderVideoFrame获得其他用户的视频 接口收不到回调

这个接口是可以回调到,这个回调只有在远端加入进来才会收到。

服务器推流涉及到画中画布局,客户端设置旁路推流.defaultLayout(0), 这时候两个客户端,一个推16:9 一个推4:3,需要将其中一个客户端16:9的裁剪成4:3然后做合图推流给观众看,如何实现?

首先概念上要明确,画中画布局,其实就是来做服务端合图的,需要调用setVideoCompositingLayout来进行合图,并且会按照设置合图的布局对比例比较大的做一定的裁剪。

两个人连麦,用来做远端显示的GLSurfaceView写入布局中,当调用onUserJoined加入频道,看不到远端的图像。

首先确定用的是SDK做的采集,剩下的有两种情况:
1,两个GLSurfaceView叠加到一起的时候,有一个会被另外一个盖住,需要设置zorder,如果你选择横铺,可以左右各一半一半这样去设置,来保证远端的那个GLSurfaceView不被本地的图像给盖住。(测试方式:尝试将本地的图像给去掉)
2,也有可能是自己去创建了一个View。其中一些方法没实现导致。炫耀改成SDK创建。

先设置旁路推流的视频分辨率,后来又调用了setVideoProfile,最终推流是按照那个为准的。对调用预览,或者登陆频道,旁路推流的配置分辨率和setVideoProfile, 谁最后就按照谁的来,有疑问?

首先推流设置的编码和频道内的远端编码是两个概念,setVideoProfile这个是设置的频道内,旁路直播设置的推流的,互不影响。但是如果setVideoProfile设置的很小,但是推流设置大,可能就会有问题,会导致推流的数据不是很清楚。总结来说推流的编码是按照旁路推流的数据来定义的,setVideoProfile是房间内几个主播观看的分辨率,旁路推流是服务端另外又推出去一路流。

setVideoProfile 的分辨率是规定的吗, 有自定义分辨率吗?比如自己设置个指定的分辨率。

这个是可以的,一般还是要按照正常的设置,自己不要乱指定。需要自定义就需要另外一个扩展的接口:
注意不能超过720p
android:

((RtcEngineEx)mRtcEngine).setVideoProfileEx(360, 360, 15, 300);
参数:分辨率(宽 高),帧率,码率

ios需要一个声明文件头才可以

一旦登录频道,修改码率就得退出频道,然后再修改然后登录频道。

其实吧,在频道内设置也可以,但是没有人这么做,建议不要这么搞,会有问题。直播模式下,网络卡,会降码率和帧率。

自采集,利用GPUimage做滤镜和美颜,横屏的问题:

变换矩阵不能写死为:vf.transform = new float[]
{ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }
;
需要从GPUImage绘制层将变换矩阵传出来,然后赋值给vf.transform。用户代码修改如下:
GPUImageRenderer.java:

public interface OnFrameAvailableListener
{ void onFrameAvailable(int textureID, int rotation, byte[] data, float[] transform); }
mSurfaceTexture.getTransformMatrix(videoTextureTransform);
if (null != onFrameAvailableListener)
{ onFrameAvailableListener.onFrameAvailable(mGLTextureId, getRotation().asInt(), data, videoTextureTransform); }

VideoChatViewActivity.java:

vf.transform = transform;

以上可解决远端接收到的数据是横屏的问题

你可能感兴趣的:(直播+连麦+推流问题集锦001)