利用AVFoundation实现Blink拍照和录像的功能详解手机开发
2023-06-13 09:20:07 时间
(void)openCamera:(AVCaptureDevicePosition)cameraPostion {
BOOL hasCamera = ([[AVCaptureDevice devices] count]
if (hasCamera) {
AVCaptureSession *session = [[AVCaptureSession alloc] init];
session.sessionPreset = AVCaptureSessionPresetHigh;
AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
[captureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[captureVideoPreviewLayer setFrame:self.cameraImageView.bounds];
[self.cameraImageView.layer addSublayer:captureVideoPreviewLayer];
AVCaptureDevice *device = [self getCamera:cameraPostion];
NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error: error];
[session addInput:input];
stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
NSDictionary *outputSettings = @{ AVVideoCodecKey : AVVideoCodecJPEG};
[stillImageOutput setOutputSettings:outputSettings];
[session addOutput:stillImageOutput];
movieOutput = [[AVCaptureMovieFileOutput alloc] init];
[session addOutput:movieOutput];
[session startRunning];
}
(AVCaptureDevice *)getCamera:(AVCaptureDevicePosition)cameraPostion {
NSArray *cameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in cameras) {
if (device.position == cameraPostion)
return device;
}
return [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureConnection *videoConnection = nil;
for (AVCaptureConnection *connection in stillImageOutput.connections) {
for (AVCaptureInputPort *port in [connection inputPorts]) {
if ([[port mediaType] isEqual:AVMediaTypeVideo] ) {
videoConnection = connection;
break;
}
}
if (videoConnection) { break; }
}
// 取静态图片
[stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection
completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error) {
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
NSData *compressedData = [imageData gzippedDataWithCompressionLevel:1.0];
NSData *outputData = [compressedData gunzippedData];
UIImage *imageT = [[UIImage alloc] initWithData:outputData];
_testImageView.image = imageT;
_testImageView.hidden = NO;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *filePath = [[NSString alloc] initWithFormat:@ %@%@ , NSTemporaryDirectory(),@ main.png ];
[fileManager createFileAtPath:filePath contents:imageData attributes:nil];
NSString *zipFile = [[NSString alloc] initWithFormat:@ %@%@ , NSTemporaryDirectory(),@ main.zip ];
ZipArchive *za = [[ZipArchive alloc] init];
[za CreateZipFile2:zipFile];
[za addFileToZip:filePath newname:@ main.png ];
}];
(IBAction)beginRecord:(id)sender {
[movieOutput startRecordingToOutputFileURL:[self fileURLWithName:@ main.mp4 ] recordingDelegate:self];
(void)captureOutput:(AVCaptureFileOutput *)captureOutput
didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL
fromConnections:(NSArray *)connections
error:(NSError *)error {
BOOL recordedSuccessfully = YES;
if (error == nil) {
[self playVideo:outputFileURL];
}
if ([error code] != noErr) {
id value = [[error userInfo] objectForKey:AVErrorRecordingSuccessfullyFinishedKey];
if (value) {
recordedSuccessfully = [value boolValue];
}
}
(void)playVideo:(NSURL *)url {
AVPlayer *player = [AVPlayer playerWithURL:url];
playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
playerLayer.frame = CGRectMake(, , 160, 284);
playerLayer.position = self.view.center;
[self.view.layer addSublayer:playerLayer];
playerLayer.masksToBounds = YES;
playerLayer.cornerRadius = 20;
playerLayer.borderWidth = 1;
playerLayer.borderColor = [UIColor grayColor].CGColor;
[player play];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(removePlayer)
name:AVPlayerItemDidPlayToEndTimeNotification
object:nil];
BOOL hasCamera = ([[AVCaptureDevice devices] count]
if (hasCamera) {
AVCaptureSession *session = [[AVCaptureSession alloc] init];
session.sessionPreset = AVCaptureSessionPresetHigh;
AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
[captureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[captureVideoPreviewLayer setFrame:self.cameraImageView.bounds];
[self.cameraImageView.layer addSublayer:captureVideoPreviewLayer];
AVCaptureDevice *device = [self getCamera:cameraPostion];
NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error: error];
[session addInput:input];
stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
NSDictionary *outputSettings = @{ AVVideoCodecKey : AVVideoCodecJPEG};
[stillImageOutput setOutputSettings:outputSettings];
[session addOutput:stillImageOutput];
movieOutput = [[AVCaptureMovieFileOutput alloc] init];
[session addOutput:movieOutput];
[session startRunning];
}
(AVCaptureDevice *)getCamera:(AVCaptureDevicePosition)cameraPostion {
NSArray *cameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in cameras) {
if (device.position == cameraPostion)
return device;
}
return [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureConnection *videoConnection = nil;
for (AVCaptureConnection *connection in stillImageOutput.connections) {
for (AVCaptureInputPort *port in [connection inputPorts]) {
if ([[port mediaType] isEqual:AVMediaTypeVideo] ) {
videoConnection = connection;
break;
}
}
if (videoConnection) { break; }
}
// 取静态图片
[stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection
completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error) {
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
NSData *compressedData = [imageData gzippedDataWithCompressionLevel:1.0];
NSData *outputData = [compressedData gunzippedData];
UIImage *imageT = [[UIImage alloc] initWithData:outputData];
_testImageView.image = imageT;
_testImageView.hidden = NO;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *filePath = [[NSString alloc] initWithFormat:@ %@%@ , NSTemporaryDirectory(),@ main.png ];
[fileManager createFileAtPath:filePath contents:imageData attributes:nil];
NSString *zipFile = [[NSString alloc] initWithFormat:@ %@%@ , NSTemporaryDirectory(),@ main.zip ];
ZipArchive *za = [[ZipArchive alloc] init];
[za CreateZipFile2:zipFile];
[za addFileToZip:filePath newname:@ main.png ];
}];
(IBAction)beginRecord:(id)sender {
[movieOutput startRecordingToOutputFileURL:[self fileURLWithName:@ main.mp4 ] recordingDelegate:self];
(void)captureOutput:(AVCaptureFileOutput *)captureOutput
didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL
fromConnections:(NSArray *)connections
error:(NSError *)error {
BOOL recordedSuccessfully = YES;
if (error == nil) {
[self playVideo:outputFileURL];
}
if ([error code] != noErr) {
id value = [[error userInfo] objectForKey:AVErrorRecordingSuccessfullyFinishedKey];
if (value) {
recordedSuccessfully = [value boolValue];
}
}
(void)playVideo:(NSURL *)url {
AVPlayer *player = [AVPlayer playerWithURL:url];
playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
playerLayer.frame = CGRectMake(, , 160, 284);
playerLayer.position = self.view.center;
[self.view.layer addSublayer:playerLayer];
playerLayer.masksToBounds = YES;
playerLayer.cornerRadius = 20;
playerLayer.borderWidth = 1;
playerLayer.borderColor = [UIColor grayColor].CGColor;
[player play];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(removePlayer)
name:AVPlayerItemDidPlayToEndTimeNotification
object:nil];
相关文章
- 基于Android TextureView与SurfaceTexture实现相机Camera拍照预览与保存照片详解手机开发
- iOS缓存清理功能的实现详解手机开发
- Android手机通话录音实现详解手机开发
- iOS常用数据校验方法,验证手机号,信用卡号,电话号码,邮编,Email等详解手机开发
- iOS微信第三方登录实现详解手机开发
- iOS点击发送短信按钮跳转到手机短信界面实现发送短信详解手机开发
- IOS 手势学习(点击,长按,轻扫,拖拽,旋转,捏合缩放)详解手机开发
- iOS启动屏后再加个闪屏的方法详解手机开发
- fmdb常用操作代码详解手机开发
- iOS实现毛玻璃效果,图片模糊效果的三种方法详解手机开发
- iOS 实现文件的拷贝详解手机开发
- iOS图片缩小放大scollView实现代码详解手机开发
- 使用jqMobi开发app基础:登录页面的实现详解手机开发
- iOS开发系列课程(02) — 视图交互和事件机制详解手机开发
- iOS 11终于解决了这10个iOS 10的问题详解手机开发
- [android] 采用服务录制电话&服务的生命周期详解手机开发
- Android 多级弹窗实现详解手机开发
- android notification,notificationmanager详解手机开发
- android Titlebar一行代码实现沉浸式效果详解手机开发
- AnimatedPathView实现自定义图片标签详解手机开发
- 两个activity或者activity和fragment传值详解手机开发
- Android动态替换Application实现详解手机开发
- android and webview详解手机开发
- iOS 多线程 & 网络 – 4.0 – AFN框架简单使用详解手机开发
- iOS开发——高级技术&地图功能的实现详解手机开发
- android studio gradle自动签名构建实现详解手机开发
- Android ImageView、TextureView、自定义View显示图片详解手机开发