Android 录播

OceanGopro, 纯原生API实现的屏幕录播SDK,支持暂停、局部录制、前置摄像头影像。
github地址:https://github.com/98ki/OceanGopro

Point

virtualDisplay

VirtualDisplay类代表一个虚拟显示器,需要调用DisplayManager 类的 createVirtualDisplay()方法,将虚拟显示器的内容渲染在一个Surface控件上,当进程终止时虚拟显示器会被自动的释放,并且所有的Window都会被强制移除。当不再使用他时,你应该调用release() 方法来释放资源。

SurfaceTexture

SurfaceTexture从Android 3.0(API level 11)加入。它对图像流的处理并不直接显示,而是转为GL外部纹理,因此可用于图像流数据的二次处理(如Camera滤镜,桌面特效等)。比如Camera的预览数据,变成纹理后可以交给GLSurfaceView直接显示,也可以通过SurfaceTexture交给TextureView作为View heirachy中的一个硬件加速层来显示。首先,SurfaceTexture从图像流(来自Camera预览,视频解码,GL绘制场景等)中获得帧数据,当调用updateTexImage()时,根据内容流中最近的图像更新SurfaceTexture对应的GL纹理对象,接下来,就可以像操作普通GL纹理一样操作它了。
updateTexImage()
将从图片流中将最近的一帧更新到纹理中。Update the texture image to the most recent frame from the image stream. This may only be * called while the OpenGL ES context that owns the texture is current on the calling thread. * It will implicitly bind its texture to the GLTEXTUREEXTERNAL_OES texture target.

MediaCodec & Muxer

MediaCodec(API level 16),用来处理 Android平台中媒体文件编解码的 API, 经常配合MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface, 和 AudioTrack使用。
MediaMuxer(API level 18),用来合并流,目前支持输出MP4, Webm 和 3GP 文件。

Process Flow Chat

Track Modification

创建一个新的SurfaceTexture,将图片流传输给指定的OpenGL纹理。

mDrawer = new GLDrawer2D(true);  
mTexId = mDrawer.initTex();  
mSourceTexture = new SurfaceTexture(mTexId);  
mSourceSurface = new Surface(mSourceTexture);  

将 mMediaProjection创建的 VirtualDisplay 渲染到mSourceSurface上。

  display = mMediaProjection.createVirtualDisplay(
                "Capturing Display",mWidth, mHeight,mDensity,DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,mSourceSurface, mCallback, mHandler);

注册SurfaceTexture的监听:

mSourceTexture.setOnFrameAvailableListener(mOnFrameAvailableListener, mHandler);  

preparesurfaceencoder 方法返回值是MediaCodec.createInputSurface(), 将mSurface 作为MediaCodec 视频 Track 的输入, 并由此 surface创建EglSurface。

mSurface = prepare_surface_encoder(MIME_TYPE, videoEncodeConfig);

mEncoderSurface = getEgl().createFromSurface(mSurface);

在 SurfaceTexture 的监听回调中,sourceTexture 执行updateTexImage()方法, 将关联的OpenGLES中纹理对象的内容更新为Image Stream中最新的图片,每次updateTexImage()被调用时,纹理矩阵都可能发生变化。所以,每次texture image被更新时,getTransformMatrix ()也应该被调用,来转换纹理坐标。 mTexMatrix是16位的 float,形如(s,t,0,1的)OpenGL ES 二维纹理坐标列向量。

mSourceTexture.updateTexImage();                    mSourceTexture.getTransformMatrix(mTexMatrix);  

SurfaceTexture绘制Surface中接收的图像以输入MediaCodec

mEncoderSurface.makeCurrent();  
mDrawer.draw(mTexId, mTexMatrix, 0);  
mEncoderSurface.swap();  

Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView

张鹏宇

继续阅读此作者的更多文章