目前开源的项目或市面上的Android直播客户端主要是用ffmpeg来实现推流的。本文将介绍使用Android原生的视频编码类MediaCodec实现直播推流。
数据流及大致原理
这里所说的直播,就是将你的客户端产生的视频数据,实时发送到服务器上。服务器上的数据再实时地发送到播放客户端上。
以视频数据为例:
获取Camera画面
首先是摄像头拍摄得到原始画面数据,这里原始画面数据的格式我们不用管,因为我们使用的是MediaCodec,所以我们会使用
camera.setPreviewTexture(surfaceTexture)
来利用Camera获取到的画面。
此处的原理可忽略,大致说明的话,就是Camera会把获得的画面保存为OpenGL的一个纹理,我们使用这个纹理就能使用Camera的画面。
绘制画面
在获得画面之后,我们要把这个画面(纹理)“画”到MediaCodec上。
如何画?
MediaCodec提供一张’白纸’,也就是一个Surface,供我们把纹理画到上面。此处的API是
MediaCodec.createInputSurface()
怎么画?用Canvas画。当然不是一般的Canvas,我用了这个开源项目android-openGL-canvas。
H264数据
画上去后,MediaCodec就会帮我们把原始画面数据,压缩成相应的视频数据,目前我这里是压缩成H264数据。
所谓的H264数据,其实只是一堆堆的byte[]数组。在项目的例子,我把H264数据写成了文件,可以用某些播放器播放(