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

使用GPUImage2录制视频遇绿线、画面倒置问题求助

解决GPUImage2录制设备尺寸视频的两个问题

我之前用GPUImage2做视频录制时也踩过类似的坑,给你梳理下针对性的修复方案:

问题1:录制视频出现绿线+首帧黑影

问题原因

当你把摄像头预设改成AVCaptureSessionPresetHigh,并直接用屏幕尺寸作为录制输出尺寸时,会触发两个核心问题:

  1. 摄像头原生输出分辨率(比如1920x1080、1280x720)和屏幕尺寸比例不匹配,GPUImage2渲染纹理时无法完全填充,边缘出现的绿线其实是未初始化的纹理区域。
  2. 直接启动录制时,摄像头第一帧还没完成纹理初始化,所以会出现黑影。

修复方案

  1. 对齐摄像头输出与录制尺寸:不要直接用屏幕尺寸,而是获取摄像头实际输出分辨率来设置MovieOutput的尺寸,保证比例一致:
// 初始化摄像头后,获取它的实际输出尺寸
let camera = try Camera(sessionPreset: AVCaptureSessionPresetHigh)
let cameraOutputSize = camera.outputImageSize
// 用这个尺寸初始化MovieOutput
movieOutput = try MovieOutput(url: outputURL, size: cameraOutputSize)

如果需要适配屏幕显示,可以在渲染到renderView时添加AspectRatioFilter保持比例,避免拉伸:

let aspectFilter = AspectRatioFilter(ratio: .preserveAspectRatio)
camera --> aspectFilter --> renderView
  1. 解决首帧黑影:延迟启动录制,等摄像头完成几帧渲染后再开始,比如:
// 在调用startRecording前延迟0.5秒,确保摄像头完成初始化
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    try? self.movieOutput.startRecording()
}

问题2:前置摄像头画面及视频180度倒置

问题原因

当开启captureAsYUV: true时,GPUImage2对前置摄像头的默认旋转和镜像处理逻辑失效了——YUV格式的帧处理流程和RGB格式不同,原生的方向修正没有被正确应用。

修复方案

手动添加旋转+镜像滤镜修正方向,同时设置摄像头的视频方向:

// 初始化前置摄像头
let camera = try Camera(sessionPreset: AVCaptureSessionPresetHigh, cameraDevice: nil, location: .frontFacing, captureAsYUV: true)
// 设置视频方向为当前设备的竖屏方向
camera.videoOrientation = .portrait

// 添加镜像(前置摄像头默认需要镜像)和180度旋转滤镜
let mirrorFilter = MirrorFilter(axis: .horizontal)
let rotateFilter = RotateFilter(rotation: .rotate180)

// 连接滤镜链到预览和录制输出
camera --> mirrorFilter --> rotateFilter --> renderView
camera --> mirrorFilter --> rotateFilter --> movieOutput

这样处理后,预览画面和录制的视频都会恢复正常的正向显示。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:12:39