RtmpLivePushDemo (功能包括相机,录制视频,RTMP推流)
采用 OpenGL渲染技术对视频流 界面进行渲染 自己封装的界面GLView,帧预览,无法适配普通的SufaceTextured界面
@Override
public void onSurfaceCreated() {
program = ShaderUtil.createProgram(ShaderUtil.readRawTxt(context, R.raw.vertex_shader),
ShaderUtil.readRawTxt(context, R.raw.fragment_shader));
if (program > 0) {
//获取顶点坐标字段
avPosition = GLES20.glGetAttribLocation(program, "av_Position");
//获取纹理坐标字段
afPosition = GLES20.glGetAttribLocation(program, "af_Position");
uMatrix = GLES20.glGetUniformLocation(program, "u_Matrix");
//创建vbo
createVBO();
//创建fbo
createFBO(screenW, screenH);
//创建相机预览扩展纹理
createCameraRenderTexture();
}
cameraRender.onSurfaceCreated();
}
private void createWaterTextureId () {
int [] textureIds = new int [1 ];
//创建纹理
GLES20 .glGenTextures (1 , textureIds , 0 );
waterTextureId = textureIds [0 ];
//绑定纹理
GLES20 .glBindTexture (GLES20 .GL_TEXTURE_2D , waterTextureId );
//环绕(超出纹理坐标范围) (s==x t==y GL_REPEAT 重复)
GLES20 .glTexParameteri (GLES20 .GL_TEXTURE_2D , GLES20 .GL_TEXTURE_WRAP_S , GLES20 .GL_REPEAT );
GLES20 .glTexParameteri (GLES20 .GL_TEXTURE_2D , GLES20 .GL_TEXTURE_WRAP_T , GLES20 .GL_REPEAT );
//过滤(纹理像素映射到坐标点) (缩小、放大:GL_LINEAR线性)
GLES20 .glTexParameteri (GLES20 .GL_TEXTURE_2D , GLES20 .GL_TEXTURE_MIN_FILTER , GLES20 .GL_LINEAR );
GLES20 .glTexParameteri (GLES20 .GL_TEXTURE_2D , GLES20 .GL_TEXTURE_MAG_FILTER , GLES20 .GL_LINEAR );
ByteBuffer bitmapBuffer = ByteBuffer .allocate (bitmap .getHeight () * bitmap .getWidth () * 4 );//RGBA
bitmap .copyPixelsToBuffer (bitmapBuffer );
//将bitmapBuffer位置移动到初始位置
bitmapBuffer .flip ();
//设置内存大小绑定内存地址
GLES20 .glTexImage2D (GLES20 .GL_TEXTURE_2D , 0 , GLES20 .GL_RGBA , bitmap .getWidth (), bitmap .getHeight (),
0 , GLES20 .GL_RGBA , GLES20 .GL_UNSIGNED_BYTE , bitmapBuffer );
//解绑纹理
GLES20 .glBindTexture (GLES20 .GL_TEXTURE_2D , 0 );
}
public void drawWater () {
GLES20 .glBindBuffer (GLES20 .GL_ARRAY_BUFFER , vboId );
GLES20 .glBindTexture (GLES20 .GL_TEXTURE_2D , waterTextureId );
GLES20 .glEnableVertexAttribArray (avPosition );
GLES20 .glEnableVertexAttribArray (afPosition );
GLES20 .glVertexAttribPointer (avPosition , COORDS_PER_VERTEX , GLES20 .GL_FLOAT , false , vertexStride ,
vertexStride * 4 );//四个坐标之后的是水印的坐标
GLES20 .glVertexAttribPointer (afPosition , COORDS_PER_VERTEX , GLES20 .GL_FLOAT , false , vertexStride ,
vertexData .length * 4 );
GLES20 .glDrawArrays (GLES20 .GL_TRIANGLE_STRIP , 0 , 4 );
GLES20 .glDisableVertexAttribArray (avPosition );
GLES20 .glDisableVertexAttribArray (afPosition );
GLES20 .glBindTexture (GLES20 .GL_TEXTURE_2D , 0 );
GLES20 .glBindBuffer (GLES20 .GL_ARRAY_BUFFER , 0 );
}
直播推流