camera
手机相机录视频或者拍照,需要考虑设备的方向,主要在两方面
- 采集过程中,无论手机什么方向采集,采集画面都是正着看,不用侧头
- 录制/或者拍照后,视频/图片在正常手持设备的情况下正常显示,不用横着手机
正常手持一般都是竖着拿手机,所以就算横着拍摄,竖着拿手机也需要正常显示,不理解可以参考下系统相机。
所以这里就存在一个方向修正的问题。
device orientation
苹果手机,如果设置里锁定了方向,是没办法通过 [UIDevice currentDevice].orientation这个方法拿到的,同样UIDeviceOrientationDidChangeNotification这个通知也获取不到。同理 [[UIApplication sharedApplication] statusBarOrientation]; 跟 **UIApplicationDidChangeStatusBarOrientationNotification** 也是不可用的。
可以通过 CMMotionManager 监听设备的方向
1 | _motionManager = [[CMMotionManager alloc] init]; |
capture
项目中需要支持设置滤镜、特效等等,所以显示采集的图像需要自己渲染,通过官方的AVCaptureSession配置好采集流程,不管是竖着还是横着采集,获取到的pixelBuffer都是横向的,因为默认就是home键在右边采集图像,但是显示的视图一般都是竖向,所以这里要做一个90°的旋转处理,OPENGL 就是一个旋转矩阵。
1 | void main() |
如果只是解决采集画面显示,也可以通过设置connection.videoOrientation = [self currentVideoOrientation]; 来解决
项目中没有用这个,因为后面还需要录制视频导出视频文件。
1 | // 当前设备取向 |
Record
录制过程通过AVAssetWriterInput *writerInput = [AVAssetWriterInput assetWriterInputWithMediaType:obj outputSettings:options]; 和[self.mPixelBufferAdaptor appendPixelBuffer:pixelBuffer withPresentationTime:ts] 来积累pixelBuffer, 为了保障导出的视频可以正常显示,需要记录视频的方向,通过设置writerInput.transform[ = self transformFromCurrentVideoOrientationToOrientation:AVCaptureVideoOrientationPortrait],系统自动帮我们做转换
1 | // 旋转视频方向函数实现 |
主要就是通过录制视频时候的设备方向跟显示方向计算一下transform
Pic
拍照生成图片是同样的道理,直接给出方法,主要就是图片方向的旋转
1 | - (UIImageOrientation)getImageRotationOrientationFromCaptureVideoOrientation:(AVCaptureVideoOrientation)orientation { |
1 | + (UIImage *)image:(UIImage *)image rotation:(UIImageOrientation)orientation { |