最近研究了android的实时视频网络传输问题,在视频处理方面花费了大量精力进行研究,总结出以下五套方案,并加以比较
以320×240大小的视频传输为例
方案 | 压缩率 | 压缩/传输方式 | 实时性 | 平均流量消耗 | 传输距离 |
用camera的回调函数发送原始的yuv420数据 | 0 | 无压缩,按帧传输 | 高(20~30 fps) | 很高(6.5 Mbps)太恐怖了O_O | 近距离有线或无线 |
用MediaRecorder对yuv420进行H264硬编码后发送 | 高(95%) | 帧间压缩,视频流传输 | 高(20 fps) | 低(30~70 Kbps) | 可以远距离 |
调用本地H264编码库(JNI)对一帧YUV420数据编码后发送 | 高(97%) | 帧间压缩,按帧传输 | 低(2 fps) | 低(20 Kbps) | 可以远距离 |
对一帧数据用GZIP库压缩后发送(很奇葩的做法) | 较高(70%~80%) | 帧内压缩,按帧传输 | 低(5 fps) | 较高(300 Kbps) | 可以远距离 |
对一帧数据用JPEG方式压缩后传输 | 一般(60%左右) | 帧内压缩,按帧传输 | 高(25 fps) | 高(170 Kbps) | 可以远距离(带宽允许的话) |
注:MediaRecorder有很强的硬件依赖性,因此不同的手机表现是不一样的,有的手机数据传输的时候会出现阻塞现象,实时性就降低了
MediaRecorder)和方案5(JPEG)还是可以考虑的,由于本人的项目只需要近距离无线传输,并且硬件水平也不怎么高,故选择了方案5
以上方案是本人最近比较具体而深入地研究实时视频编码和传输方案后总结出来的,希望需要研究视频传输的朋友们可以借以参考!
【流媒體】Android 实时视频采集/编码/传输/解码/播放—方案调研(初)
SkySeraph Mar 23rd 2012
实时视频流采集
方案一: 通过Android Camera拍摄预览中设置setPreviewCallback实现onPreviewFrame接口,实时截取每一帧视频流数据
方案二: 通过Android的MediaRecorder,在SetoutputFile函数中绑定LocalSocket实现
方案三: 流媒体服务器方式,利用ffmpeg或GetStreamer等获取Camera视频
方案四: 待补充...
压缩编码
方案一: 不编码,直接通过Socket传输原始YUV420SP视频帧
方案二: JPEG. 将原始YUV420SP视频帧压缩转换为JPEG格式,JPEG传输
方案三: H.264/AVC.将原始YUV420SP视频帧压缩成H.264再传输
常见的基于H264的开源Encoder有JM、X264、T264、Hdot264等
方案四: MPEG4.将原始YUV420SP视频帧压缩成MPEG4再传输
方案五: 待补充...
传输
方案一: Socket传输
方案二: HTTP传输
方案三: RTP/RTSP传输
方案四: 流媒体服务器方式,如live555等
方案五: 待补充...
解码
与编码对应的的解码器
视频播放
方案一: 通过Android VideoView
方案二: 通过Android MediaPlay
方案三: 通过Canvas直接粘贴帧图
方案四: 待补充...
2012-3-31 修补