通用的视频通话的框架分为信令和媒体两部分,在android2.3已经有了nist-sip,因此信令部分并不是大问题。
但是媒体部分就麻烦了,一般视频通话包括视频,音频两个流,下面的草图大概说明了流程:
+----+
采集-》编码-》网络传输-》 +-网络-+-》网络接收-》解码-》显示 :视频
录音-》编码-》网络传输-》 +-网络-+-》网络接收-》解码-》播放 :音频
+----+
相对应的组件对应要用到的SDK,NDK的接口如下
视频采集:Camera SDK接口
视频编码,解码:NDK自己实现,或者动态绑定到opencore或者stagefright的codec接口,
网络传输,接收:NDK自己实现
视频显示:可以使用SDK的GLSurfaceView或者动态绑定到ISurface-》Lock去直接写surfacebuffer,
或者使用IOverlay(可能有权限问题),前面适用于2.2,2.3的android版本,3.0好像android提出了新的surface接口让开发者可以高效可靠的写屏了。
音频录音:NDK动态绑定到IAudioRecord接口
音频编码,解码:可以自己实现
网络传输,接收:可以自己实现
音频播放:NDK动态绑定到IAudioTrack接口
这个实现有个问题就是效率并不高啊,因为运算量大的编解码,视频显示都是软件实现的,因此arm a9,1G的cpu恐怕也只能实现QVGA,1G的效果。
每个android硬件平台都实现的有自己的硬件的编解码,而且android也都定义了响应的HAL层,但是由于2.2,2.3,3.0版本众多,因此每个厂商的实现程度
也都还不同,因此依赖这些HAL的接口,适配性是个问题,因此用软件实现也是没有办法的啊。
近期在上面做了些工作,记录一下,省得忘记,后续还会把工作中碰到的问题总结总结,记录下来。