技术模块 | 功能描述 | 常用方案 |
---|---|---|
音视频采集 | 获取设备音视频流 | CameraX、MediaRecorder |
编码/解码 | 数据压缩与解压缩 | MediaCodec(硬编解码) |
网络传输 | 数据包分发与接收 | UDP(低延迟)、WebRTC |
渲染播放 | 解码后数据输出 | ExoPlayer、SurfaceView |
CameraX
库(摄像头采集)。ExoPlayer
(视频渲染)。MediaCodec
(硬件编码H.264)。WebRTC
(简化信令和NAT穿透)或DatagramSocket
(UDP传输)。// 伪代码结构示例 public class VideoCommunicator { private CameraProvider camera; // 摄像头采集 private MediaCodec encoder; // 视频编码器 private DatagramSocket socket; // UDP传输 private ExoPlayer player; // 视频播放器 public void startCommunication(String targetIP, int port) { initCamera(); initEncoder(); startNetwork(targetIP, port); } }
(1)摄像头初始化与数据采集
// 使用CameraX采集预览数据 CameraSelector lensFacing = new CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_FRONT) .build(); cameraProviderFuture = ProcessCameraProvider.getInstance(context); cameraProviderFuture.addListener(() -> { Camera camera = cameraProviderFuture.get().bindToLifecycle(this, lensFacing, preview); }, ContextCompat.getMainExecutor(this));
(2)H.264硬件编码
// 配置MediaCodec为H.264编码器 MediaFormat format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, width, height); format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface); format.setInteger(MediaFormat.KEY_BIT_RATE, 1500_000); // 1.5Mbps format.setInteger(MediaFormat.KEY_FRAME_RATE, 25); // 25fps encoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC); encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
(3)UDP数据包发送
// 发送编码后的视频帧 byte[] buffer = new byte[1024 64]; // 64KB缓冲区 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, targetAddress, targetPort); encoder.start(); while (isRunning) { MediaCodec.BufferInfo info = new MediaCodec.BufferInfo(); int outputIndex = encoder.dequeueOutputBuffer(info, TIMEOUT_USEC); if (outputIndex >= 0) { ByteBuffer encodedData = encoder.getOutputBuffer(outputIndex); packet.setData(encodedData.array(), info.offset, info.size); socket.send(packet); // 发送UDP包 encoder.releaseOutputBuffer(outputIndex, false); } }
原因 | 解决方案 |
---|---|
编码效率低(软编码) | 启用MediaCodec 硬件编码,优先选择H.264格式。 |
网络带宽不足 | 降低视频分辨率(如720p→480p)或帧率(25fps→15fps)。 |
缓冲区设置不合理 | 调整MediaCodec 的BUFFER_SIZE ,优化UDP包大小(建议1-10KB)。 |
MediaCodec.BufferInfo
时间戳。adb shell
命令查看设备IP地址(如168.1.100:8080
)。tcpdump
捕获设备网络包。解答:
MediaCodec
的HEVC
(H.265)替代H.264,减少码率。解答:
0.0.1:8080
),所有设备加入同一组播组。WebRTC
的SFU
(多点分发单元)模式支持多