You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Camera2同步视频流水线实现难题:帧处理与录制并行需求求解

解决方案:Camera2 + 跨API兼容的帧处理-录制流水线

核心思路

别再让Camera直接输出到MediaRecorder了,改用单Camera输出分支 + 自定义帧处理桥接层,把MLKit处理、格式转换、录制逻辑串成一条线——既省Camera的输出通道,又能严格保证帧处理在录制前执行。

分步实现细节

1. 压缩Camera输出通道,解决数量限制

  • 只留2个Camera原生输出Surface:
    • 预览:绑定TextureView/SurfaceView的Surface(占1个通道)
    • 拍照:绑定高分辨率ImageReader(占1个通道)
  • 帧处理+录制不再占Camera的原生输出,而是从预览Surface或者专门的低分辨率ImageReader拿帧,复用同一条流,彻底避开3个通道的限制。

2. 搞定ImageReader/ImageWriter的兼容性与摄像头切换

  • 稳定性修复:
    • API 29以下别碰ImageReader.Builder.setHardwareBufferUsageFlags()的GPU标记,老老实实用CPU读取;API 29+优先用GPU标记,但要加异常捕获,崩了就 fallback到CPU路径。
    • 严格管Image的生命周期:onImageAvailable里拿到Image后,立刻把数据转存到C++层的缓冲区(比如ANativeWindow或者内存块),马上调用Image.close(),绝不让Image在手里攒着,避免设备静默崩溃。
  • 录制中切摄像头:
    • 切之前先停掉MediaCodec/ImageWriter,释放当前的ImageReader;摄像头切换成功后,重新初始化整套流水线,同步好帧时间戳,保证切换后录制不跳帧。

3. 多格式支持+MLKit前置处理

  • YUV_420_888适配MLKit:
    • 从ImageReader拿到YUV帧后,直接通过JNI把Image的Planes传给MLKit做人脸检测,完全不用转格式,省性能。
  • 格式转换+GPU加速:
    • 用C++结合EGL/OpenGL搞硬件转换:把YUV帧传到GPU纹理,先跑MLKit的滤镜效果,再渲染到MediaCodec的输入Surface;同时支持输出RGBA_8888给CPU端的其他逻辑。
    • 对PRIVATE格式,直接在C++层用HardwareBuffer访问,跳过CPU拷贝,速度拉满。

4. 同步帧处理与录制的时序

  • 在C++桥接层整个时间戳同步队列:每个帧的时间戳从Camera拿到后,跟着帧走完全流程——MLKit处理、GPU渲染、编码录制,全程保留原时间戳,绝不让音视频不同步。
  • 用原子变量或者条件变量卡着流水线的节奏,必须等MLKit处理完一帧,再给MediaCodec喂帧,严格保证顺序。

5. C++/JNI关键API参考

  • 帧读取与转存:ImageReader.acquireNextImage()、Image.getPlanes()、ANativeWindow_lock()/ANativeWindow_unlockAndPost()
  • 硬件格式转换:EGLDisplay/EGLSurface创建、glTexImage2D上传YUV纹理、GLSL shader实现YUV转RGBA
  • 编码控制:MediaCodec.createEncoderByType()、MediaCodec.configure()、MediaCodec.getInputSurface()
  • 跨API兼容:用Build.VERSION.SDK_INT做判断,API 26+用MediaCodec.setCallback(),API 23+支持ImageReader.Builder.setImageFormat()的PRIVATE格式

极端兼容降级方案

要是碰到特别老的设备还是有问题,就换Camera1 + TextureView + MediaCodec:通过onSurfaceTextureUpdated回调拿帧,转成YUV给MLKit处理,再编码录制——虽然效率差点,但兼容性拉满。

内容的提问来源于stack exchange,提问作者mrousavy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 09:16:05