这个系列文章我们来介绍一位海外工程师如何探索 GPUImage 音视频技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,本篇介绍 GPUImage 高级视频技术。
——来自公众号“关键帧Keyframe”的分享
GPUImage 远不止简单地给视频加滤镜。本指南将深入探讨如何利用 GPUImage 以高性能、高质量的方式对视频进行复杂操作、合成与处理。
1、视频合成(Video Compositions)
GPUImage 提供的 GPUImageMovieComposition 类,是在 GPUImageMovie 基础上的扩展,可与 Apple 的 Composition API 无缝协作,从而把多段视频源组合成复杂序列。
1.1、示例代码(Objective-C)
AVComposition *composition = [self createCompositionFromMultipleVideos];
AVVideoComposition *videoComposition = [self createVideoCompositionForComposition:composition];
AVAudioMix *audioMix = [self createAudioMixForComposition:composition];
GPUImageMovieComposition *movieComposition = [[GPUImageMovieComposition alloc]
initWithComposition:composition
andVideoComposition:videoComposition
andAudioMix:audioMix];
[movieComposition addTarget:filter];
[filter addTarget:movieWriter];
[movieComposition startProcessing];
通过这种方式,你可以充分利用 AVFoundation 强大的合成功能,同时享受 GPUImage 的 GPU 加速滤镜效果。
相关文件:
GPUImageMovieComposition.h
2、同步视频处理(Synchronized Video Processing)
当需要同步处理多路视频源(例如给视频不同部分应用不同滤镜)时,使用:
[movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter];
此功能可确保音频与处理后的视频保持同步,尤其适用于多路输入同时写入同一路输出的场景。
参考:
README.md#L244
3、高级滤镜链(Advanced Filter Chaining)
GPUImage 的真正威力在于构建复杂滤镜链,以实现精美的视觉效果。
3.1、多通道处理(Multi-pass Processing)
某些高级效果需多通道处理:
// 两次模糊,提升品质
GPUImageGaussianBlurFilter *blurFilter = [[GPUImageGaussianBlurFilter alloc] init];
blurFilter.blurRadiusInPixels = 8.0;
blurFilter.blurPasses = 3; // 品质增加,性能下降
// 指定方向的运动模糊
GPUImageMotionBlurFilter *motionBlurFilter = [[GPUImageMotionBlurFilter alloc] init];
motionBlurFilter.blurAngle = 45.0; // 45° 方向
motionBlurFilter.blurSize = 2.5;
3.2、分支处理链(Branched Processing Chains)
复杂效果往往需要分支处理,将一路输出同时传给多路滤镜:
GPUImageVideoCamera *videoCamera = [[GPUImageVideoCamera alloc]
initWithSessionPreset:AVCaptureSessionPreset720p
cameraPosition:AVCaptureDevicePositionBack];
// 基础处理
GPUImageBrightnessFilter *brightnessFilter = [[GPUImageBrightnessFilter alloc] init];
[videoCamera addTarget:brightnessFilter];
// 分支1:边缘检测用于动作分析
GPUImageSobelEdgeDetectionFilter *edgeDetection = [[GPUImageSobelEdgeDetectionFilter alloc] init];
[brightnessFilter addTarget:edgeDetection];
[edgeDetection addTarget:firstOutputView];
// 分支2:棕褐色滤镜用于录制
GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init];
[brightnessFilter addTarget:sepiaFilter];
[sepiaFilter addTarget:movieWriter];
4、直接操作原始视频数据
部分高级需求需要对像素数据进行自定义处理,而非使用现有滤镜。
4.1、原始数据获取与处理(Raw Data Processing)
// 创建原始数据输出
GPUImageRawDataOutput *rawDataOutput = [[GPUImageRawDataOutput alloc]
initWithImageSize:CGSizeMake(640, 480)
resultsInBGRAFormat:YES];
[filter addTarget:rawDataOutput];
// 逐帧处理
[rawDataOutput setNewFrameAvailableBlock:^{
GLubyte *rawData = [rawDataOutput rawBytesForImage];
int bytesPerRow = [rawDataOutput bytesPerRowInOutput];
// 在此处自定义处理像素数据
// ...
// 如有需要,可将处理后数据重新注入滤镜链
GPUImageRawDataInput *rawDataInput = [[GPUImageRawDataInput alloc]
initWithBytes:processedData
size:CGSizeMake(640, 480)];
[rawDataInput addTarget:nextFilter];
[rawDataInput processData];
}];
该方法常用于与计算机视觉库集成,或基于视频内容做额外计算。
5、高性能视频录制
实时录制高质量、已加滤镜的视频时,需要合理配置。
5.1、录制配置示例
// 输出路径
NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];
unlink([pathToMovie UTF8String]); // 删除旧文件
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
// 初始化写入器
GPUImageMovieWriter *movieWriter = [[GPUImageMovieWriter alloc]
initWithMovieURL:movieURL
size:CGSizeMake(1280, 720)];
movieWriter.shouldPassthroughAudio = YES;
movieWriter.hasAudioTrack = YES;
// 自定义编码参数
NSDictionary *videoSettings = @{
AVVideoCodecKey: AVVideoCodecH264,
AVVideoWidthKey: @1280,
AVVideoHeightKey: @720,
AVVideoCompressionPropertiesKey: @{
AVVideoAverageBitRateKey: @10000000, // 10 Mbps
AVVideoProfileLevelKey: AVVideoProfileLevelH264HighAutoLevel
}
};
[movieWriter setVideoInputSettings:videoSettings];
5.2、性能优化技巧
- 录制时降分辨率:输出分辨率小于预览分辨率。
- 简化滤镜链:录制时使用更简单的滤镜链。
- 启用硬件加速:确保使用硬件编码器。
// 预览与录制使用不同滤镜链
[videoCamera addTarget:complexFilterChainForPreview];
[videoCamera addTarget:simplerFilterChainForRecording];
[simplerFilterChainForRecording addTarget:movieWriter];
[movieWriter startRecording];
[videoCamera startCameraCapture];
6、计算机视觉集成
GPUImage 内置了若干专为计算机视觉设计的滤镜。
6.1、运动检测(Motion Detection)
GPUImageMotionDetector *motionDetector = [[GPUImageMotionDetector alloc] init];
[videoCamera addTarget:motionDetector];
[motionDetector setMotionDetectionBlock:^(CGPoint motionCentroid,
CGFloat motionIntensity,
CMTime frameTime) {
if (motionIntensity > 0.3) {
NSLog(@"检测到运动:%@,强度:%f",
NSStringFromCGPoint(motionCentroid), motionIntensity);
}
}];
6.2、特征检测与跟踪(Feature Detection & Tracking)
// Harris 角点检测,用于跟踪
GPUImageHarrisCornerDetectionFilter *cornerDetector =
[[GPUImageHarrisCornerDetectionFilter alloc] init];
cornerDetector.sensitivity = 0.40;
cornerDetector.threshold = 0.15;
[videoCamera addTarget:cornerDetector];
[cornerDetector setCornersDetectedBlock:^(GLfloat* cornerArray,
NSUInteger cornersDetected,
CMTime frameTime) {
for (NSUInteger i = 0; i < cornersDetected; i++) {
CGPoint cornerPoint = CGPointMake(cornerArray[i*2],
cornerArray[i*2+1]);
// 使用角点做跟踪
}
}];
7、实战:视频转场特效(Crossfade Transition)
以下示例演示如何对两段视频做淡入淡出转场:
// 视频1
GPUImageMovie *firstVideo = [[GPUImageMovie alloc] initWithURL:firstURL];
firstVideo.playAtActualSpeed = YES;
// 视频2
GPUImageMovie *secondVideo = [[GPUImageMovie alloc] initWithURL:secondURL];
secondVideo.playAtActualSpeed = YES;
// 混合滤镜
GPUImageDissolveBlendFilter *dissolveFilter = [[GPUImageDissolveBlendFilter alloc] init];
[firstVideo addTarget:dissolveFilter];
[secondVideo addTarget:dissolveFilter];
[dissolveFilter addTarget:outputView];
// 开始播放视频1
[firstVideo startProcessing];
// 5秒后开始转场
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC),
dispatch_get_main_queue(), ^{
[secondVideo startProcessing];
[dissolveFilter setMix:0.0]; // 仅显示视频1
[UIView animateWithDuration:2.0 animations:^{
[dissolveFilter setMix:1.0]; // 动画过渡到仅显示视频2
} completion:^(BOOL finished) {
[firstVideo endProcessing];
}];
});
8、总结
借助 GPUImage 的高级视频功能,你可以实现许多用标准框架难以完成的复杂处理流程,并始终保持 GPU 加速带来的高性能。
谨记:高级技巧往往伴随性能折损,务必在目标设备上充分测试,特别是实时应用场景。对于极端需求,可考虑“预览用复杂滤镜链、最终渲染用简化滤镜链”的策略。
学习和提升音视频开发技术,推荐你加入我们的知识星球:【关键帧的音视频开发圈】

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。