局域网wifi环境Android摄像实时互传

简介

最近,项目中需要实现这样一个需求,局域网内两台设备,一台通过摄像头录像,并实时传输到另一台设备上显示,要求延迟在1秒之内。
调研了一下局域网内视频传输的东西,网上找了一些相关项目,找到的最接近需求的是Endoscope,只不过这个实现会有4-5秒的延迟,造成延迟的主要原因在于他是在录制端开启了一个rtsp服务:

StartStreamPresenter.java

1
2
3
4
5
private void startRtspServer() {
rtspServer = new RtspServer();
rtspServer.addCallbackListener(this);
rtspServer.start();
}

显示端使用Android原生MediaPlayer去链接视屏源并播放:

PlayerStreamActivity.java

1
mediaPlayer.setDataSource(this, videoUri);

通过调试发现视屏发送端在有客户端链接后,立即开始录制并输出视屏数据,怀疑是MediaPlayer的缓存机制导致了视频不同步的问题。

因此,在此基础上:

  • 我将视频传输协议改为tcp,发送的数据事先做了转换NV21->YUV420,并矫正了90度旋转(为了竖屏正常显示,摄像头需要设置为顺时针旋转90度)
  • 接收端改为通过硬件解码将视频数据包解析并渲染到SurfaceView上

##########################################

另,在网上看到很多实现方式是通过将每帧数据压缩为Jpeg格式之后传输、显示,这里我也将这种方式实现了一下,通过对比发现效果很不理想,可以通过修改DetectConst.TRANS_MODE来切换测试

源码:https://github.com/xinayida/LiveVideo