使用GPUImage2录制视频遇绿线、画面倒置问题求助
解决GPUImage2录制设备尺寸视频的两个问题
我之前用GPUImage2做视频录制时也踩过类似的坑,给你梳理下针对性的修复方案:
问题1:录制视频出现绿线+首帧黑影
问题原因
当你把摄像头预设改成AVCaptureSessionPresetHigh,并直接用屏幕尺寸作为录制输出尺寸时,会触发两个核心问题:
- 摄像头原生输出分辨率(比如1920x1080、1280x720)和屏幕尺寸比例不匹配,GPUImage2渲染纹理时无法完全填充,边缘出现的绿线其实是未初始化的纹理区域。
- 直接启动录制时,摄像头第一帧还没完成纹理初始化,所以会出现黑影。
修复方案
- 对齐摄像头输出与录制尺寸:不要直接用屏幕尺寸,而是获取摄像头实际输出分辨率来设置
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
- 解决首帧黑影:延迟启动录制,等摄像头完成几帧渲染后再开始,比如:
// 在调用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
相关产品推荐
相关产品推荐

