教程适用场景
- 无人机
- 音视频直播
- 安防,楼宇对讲,智能家居,车载设备
- 视频会议系统
- 一切和摄像头相关的电子设备
- FFmpeg tcp/udp网络通信
Android芯片供应商,视频采集和平台关系较大
- 高通系列 稳定性好,价格贵,开发门槛高
- 三星系列 一般自用,开放性差
- 全志系列 价格低,稳定性差,性能强悍
- 瑞芯微rk系列 价格低,性能一般
- 其他MTK,展讯
Android视频采集
- 方案一:Android Camera拍摄预览中设置setPreviewCallback实现onPreviewFrame接口
- 方案二:通过Android的MediaRecorder,在setoutputFile函数中绑定Localsocket实现(效率较低,一般不建议使用)
- 方案三:通过芯片方案商提供的接口获取视频
Android视频编码一般有两种方式,软件编码---ffmpeg,硬件编码---MediaCodec编码(兼容性不好,5.0以后才能使用,格式要求比较严格)
Android视频传输,自定义协议
- 发送视频数据包结构一般是:视频头 + 视频数据
- 视频头一般包含:帧序号 + 时间戳 + 帧类型 + 该包视频数据的大小
- UDP需要分包处理,I帧需要分十几个包来发送(视网络情况而定),每个包的大小建议在1024kb,每个包含有包序号、接收的时候把这些包按照顺序组合起来,形成一帧数据进行解码
- 当I帧和I帧之间的P帧有丢掉时,需要忽略掉剩下的P帧,等待下一个I帧,才能开始解码,不然会有马赛克出现
- 当发现丢包时也可以告诉服务器重新发I帧过来,这样就可以不用到等待了
Android视频解码和编码一样有两种方式,ffmpeg和MediaCodec,建议使用ffmpeg来解码,因为解码一般在手机端,兼容性要求比较高
Android视频转换,视频解码后的数据都是YUV420的数据,而视频显示的时候有时候会需要RGB565的数据,这时候就需要视频格式转换了。这里需要注意的一点是,YUV420有两种不同的格式,planar类和packed类,所以在转换的时候要注意格式是否正确无误
Android视频显示
-
Bitmap视频更新
- 传入的数据必须转换成RGB,效率较低
-
Opengl视频更新
- 传入的YUV420可以直接显示,效率高
网友评论