上篇把关于设备连接这块说完了,主要就是采用UDP连接这种方式,只要在同组地址下,多台客户端能自动连接上播放端,这就适应我这个一对多的投屏场景;接下来我会详细的说一下我传输的步骤。
上篇:Android设备一对多录屏直播(Udp设备连接)
https://blog.youkuaiyun.com/sunmmer123/article/details/82734245
Demo下载地址:
采集端——ScreenImage
播放端——ScreenImagePlay
讲代码
音视频采集
- 这里关于音视频采集,我大致的说下,到时候细节大家看代码
- 视频采集
(1)MediaProjection获得 VirtualDisplay。
(2)建立一个VideoMediaCodec,获得MediaCodec的InputSurface,将InputSurface设置给Virtual。
(3)读取VideoMediaCodec里产生的视频数据,参考H264解析规则,获得Sps,Pps,和每一个帧具体信息,第一帧前,一定要加Sps,Pps(否则无法解析),并保证第一帧是关键帧.
视频采集这块需要注意的点:
传输H264的裸流的需要格式为:Sps + Pps + IDR + ……. + Sps + Pps + IDR + …
在视频这块需要做的处理是手动的把h264的头部给加上,同时确保视频最开始是sps,pps。
- 音频采集
(1)获取AudioRecord,从AudioRecord中获取pcm。
(2)建立AudioMediaCodec,将pcm转码为AAC(从AudioRecord中获取的是AAC裸流)给AAC数据添加ADTS头消息,顺道添加(0,0,0,1)头部信息,方便分割。
音频采集这块需要注意的点:给编码出的aac裸流添加adts头字段
这个关于音视频采集具体注意点的解释可以看我篇一推荐的那俩篇博文
这里我主要做了一个 找出采集频率对应下标的处理,动态的去查匹配。
// TODO: 2018/6/5 找出采集频率对应下标
private int getFrequencyIdx(int defaultFrequency) {
Map<Integer, Integer> samplingFrequencyIndexMap = new HashMap<>();
samplingFrequencyIndexMap.put(96000, 0);
samplingFrequencyIndexMap.put(88200, 1);
samplingFrequencyIndexMap.put(64000, 2);
samplingFrequencyIndexMap.put(48000, 3);
samplingFrequencyIndexMap.put(44100, 4);
samplingFrequen