主要是为了避免拥塞,SDK在一定的判断下会下调码率,同步的,为了保证稳定的清晰度,就必须下调帧率,不然每一帧的码率太低,会模糊。
原因是:商汤美颜是矩阵是不停的变化的,所以写固定的转换数组没用。
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);
这个接口是可以回调到,这个回调只有在远端加入进来才会收到。
首先概念上要明确,画中画布局,其实就是来做服务端合图的,需要调用setVideoCompositingLayout来进行合图,并且会按照设置合图的布局对比例比较大的做一定的裁剪。
首先确定用的是SDK做的采集,剩下的有两种情况:
1,两个GLSurfaceView叠加到一起的时候,有一个会被另外一个盖住,需要设置zorder,如果你选择横铺,可以左右各一半一半这样去设置,来保证远端的那个GLSurfaceView不被本地的图像给盖住。(测试方式:尝试将本地的图像给去掉)
2,也有可能是自己去创建了一个View。其中一些方法没实现导致。炫耀改成SDK创建。
首先推流设置的编码和频道内的远端编码是两个概念,setVideoProfile这个是设置的频道内,旁路直播设置的推流的,互不影响。但是如果setVideoProfile设置的很小,但是推流设置大,可能就会有问题,会导致推流的数据不是很清楚。总结来说推流的编码是按照旁路推流的数据来定义的,setVideoProfile是房间内几个主播观看的分辨率,旁路推流是服务端另外又推出去一路流。
这个是可以的,一般还是要按照正常的设置,自己不要乱指定。需要自定义就需要另外一个扩展的接口:
注意不能超过720p
android:
((RtcEngineEx)mRtcEngine).setVideoProfileEx(360, 360, 15, 300);
参数:分辨率(宽 高),帧率,码率
ios需要一个声明文件头才可以
其实吧,在频道内设置也可以,但是没有人这么做,建议不要这么搞,会有问题。直播模式下,网络卡,会降码率和帧率。
变换矩阵不能写死为: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;
以上可解决远端接收到的数据是横屏的问题