一、概述
在移动直播、安防监控等领域,实时视频采集与RTMP、RTSP推流是核心技术。本文基于Android Camera2 API、大牛直播SDK的RTMP直播推流模块及轻量级RTSP服务模块,实现摄像头数据采集、编码、推流及本地录制功能。通过MainActivity
入口,结合Camera2Helper
、LibPublisherWrapper
等模块,构建了一套高效稳定的视频处理方案。
二、核心技术模块
1. Camera2图像采集与处理
Camera2Helper封装了Camera2 API的核心操作,关键实现如下:
-
摄像头初始化与配置
通过CameraManager
获取摄像头列表,选择指定ID的摄像头(如前置或后置),配置预览尺寸(如1280x720):public void start(int width, int height) { mVideoWidth = width; mVideoHeight = height; startBackgroundThread(); if (mTextureView.isAvailable()) { openCamera(mVideoWidth, mVideoHeight); } else { mTextureView.setSurfaceTextureListener(mSurfaceTextureListener); } }
-
图像数据回调
使用ImageReader
获取YUV420_888格式数据,通过Camera2Listener
回调给业务层:private class OnImageAvailableListenerImpl implements ImageReader.OnImageAvailableListener { @Override public void onImageAvailable(ImageReader reader) { Image image = reader.acquireLatestImage(); if (image != null && mCamera2Listener != null) { mCamera2Listener.onCameraImageData(image); } } }
-
图像旋转与缩放
根据设备方向(mOrientation
)和屏幕旋转状态,动态计算Matrix
变换,确保预览画面正确显示:private void configureTransform(int w, int h) { Matrix matrix = new Matrix(); // 根据旋转角度和缩放策略调整矩阵 matrix.postScale(scaleX, scaleY, centerX, centerY); mTextureView.setTransform(matrix); }
2. RTMP/RTSP推流与本地录制
LibPublisherWrapper封装了与大牛直播SDK的底层JNI库的交互,核心功能包括:
-
推流初始化
通过SmartPublisherJniV2
初始化推流上下文,设置编码参数(分辨率、帧率、码率):public boolean StartPublisher() { int ret = lib_publisher_.SmartPublisherStartPublisher(get()); if (ret == OK) { is_rtmp_publishing_ = true; return true; } return false; }
-
数据发送
将YUV数据通过PostLayerImageYUV420888ByteBuffer
送入编码队列,音频通过OnPCMData
回调处理:public boolean PostLayerImageYUV420888ByteBuffer(...) { return lib_publisher_.PostLayerImageYUV420888ByteBuffer(...); }
-
RTSP服务管理
启动内置RTSP服务,支持多客户端接入:public static Handle create_and_start_server(...) { Handle handle = new Handle(lib_publisher); handle.open(port, user_name, password); handle.start(); return handle; }
-
本地录制
设置录像路径,分段存储并支持暂停/恢复:public boolean StartRecorder() { lib_publisher_.SmartPublisherSetRecorderDirectory(get(), recDir); return lib_publisher_.SmartPublisherStartRecorder(get()) == OK; }
3. 主控逻辑与交互
MainActivity作为入口,实现功能调度:
-
权限与初始化
动态申请摄像头、录音权限,初始化Camera2Helper
和推流模块:public void onGlobalLayout() { if (!checkPermissions(NEEDED_PERMISSIONS)) { ActivityCompat.requestPermissions(...); } else { initCamera(); } }
-
推流控制
处理RTMP/RTSP推流启停、分辨率切换、编码类型选择(软编H.264/硬编H.265):class ButtonStartPushListener implements View.OnClickListener { public void onClick(View v) { if (stream_publisher_.is_rtmp_publishing()) { stopPush(); } else { InitAndSetConfig(); stream_publisher_.StartPublisher(); } } }
-
本地UI交互
实时显示推流状态、静音控制、快照拍摄、录像管理:class ButtonCaptureImageListener implements View.OnClickListener { public void onClick(View v) { snap_shot_impl_.capture(); // 触发快照 } }
三、关键技术点
1. Camera2图像方向处理
-
设备方向检测
通过OrientationDetector
监听设备旋转,动态调整预览方向。 -
编码方向适配
根据摄像头传感器方向(mSensorOrientation
)和UI方向,计算图像旋转角度,确保编码输出方向正确。
2. 多协议推流兼容
-
RTMP推流
配合大牛直播SDK的RTMP推送模块,数据采集后,可支持多实例的RTMP推送。 -
轻量RTSP服务
配合大牛直播SDK的轻量级RTSP服务模块,内置服务支持用户名/密码验证,实时统计客户端会话数。
3. 性能优化
-
硬件编码加速
优先使用MediaCodec硬编(H.264/H.265),通过estimate_video_hardware_kbps
动态估算码率。 -
线程管理
使用HandlerThread
处理摄像头数据回调,避免主线程阻塞。
四、应用场景与优化建议
1. 典型场景
-
移动直播:RTMP推流至CDN,支持低延迟互动。
-
安防监控:RTSP服务实现局域网内多终端实时查看。
-
本地录制:关键事件视频存档,支持后续回放分析。
2. 优化方向
-
自适应码率:根据网络状况动态调整编码参数。
-
硬件缓冲池:复用
Image
对象减少GC频率。 -
首帧加速:优化关键帧间隔(GOP),提升首帧渲染速度。
五、总结
本文详细解析了基于Camera2的Android实时推流方案,涵盖摄像头采集、编码推流、服务搭建等核心模块。通过模块化设计,实现了高可扩展性的视频处理框架,为移动端多媒体开发提供了完整参考。开发者可在此基础上,进一步探索AI增强、多路混流等高级功能,以满足更复杂的业务需求。感兴趣的开发者,可以单独跟我交流探讨。