一、概述
在移动直播、安防监控等领域,实时视频采集与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增强、多路混流等高级功能,以满足更复杂的业务需求。感兴趣的开发者,可以单独跟我交流探讨。
 
 
                     
            
        













 
                    

 
                 
                    