利用AVFoundation实现Blink拍照和录像的功能

利用AVFoundation实现Blink拍照和录像的功能

by 伍雪颖

github代码

前几天偶然发现一个app叫Blink,闲来无事,纯当练手,于是就尝试下自己实现它的功能.

页面都挺简单的

1.打开相机

- (void)openCamera:(AVCaptureDevicePosition)cameraPostion
{

BOOL hasCamera = ([[AVCaptureDevice
devices]
count] >
0);

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];

}

2.获取静态图片

- (void)captureNow {

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"];

}];

}

3.录像和播放录像

- (IBAction)beginRecord:(id)sender
{

[movieOutput
startRecordingToOutputFileURL:[self
fileURLWithName:@"main.mp4"]
recordingDelegate:self];

}

- (void)stopRecord {

[movieOutput
stopRecording];

}

- (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(0,
0,
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];

}

- (void)removePlayer {

[playerLayer
removeFromSuperlayer];

}

看了下它的网络数据格式方面,Blink主要是打包成zip文件,里面包含json,mp4,png文件.

等有空了,把服务器也写一下,或者谁有兴趣可以把它的服务器实现下.

当然Blink还有一些添加好友,分享等的功能,这些细节还是比较好实现的.

时间: 2024-12-29 11:33:22

利用AVFoundation实现Blink拍照和录像的功能的相关文章

漫谈计算摄像学 (二):利用光场实现“先拍照后对焦”

在上一篇直观理解光场中,谈到了光场的基本概念.3D性质.实际应用中的采集办法和插值求任意光线的办法.这一篇继续上一篇的基础上给出利用光场实现“先拍照后聚焦”的原理和基本步骤. 对焦与光路 首先,什么是对焦呢,我们先简单回顾一下中学物理. 先看左图,物体端的对焦面就是最上方的平面,从这个平面上的每一点发出的光线最后都汇聚在另一端的像平面上,一个典型的光路如加粗的四色直线所示.如果希望物体端的焦面移动到和原焦面到透镜之间的位置,可以看到光线仍然是那些光线,但是聚焦到像面的光线组合就不再是之前的光线了

openwrt,mjpeg流,wifi摄像头与APP联动,拍照、录像

最近公司好忙,自己主管的产品又忙着上线,好久都没更新博客了. 最近产品在做一款wifi摄像头,摄像头与手机同时连接在一个局域网内,即可实现摄像头图像在手机显示,并且拍照录像等功能 mjpeg是一张一张的图片传输过来,每秒显示一定数量的图片,则画面会连贯的动起来.因此,内存消耗量会很大.而且不同线程之间有可能会打架. 下面就记录下问题解决的过程 图像显示: 1建立起连接,接收mjpeg流 2每次只读一部分流,并且显示在mjpegView上 拍照: 这个比较简单,就获取一帧图像即可 录像: 1通过录

Android实战技巧之三十一:拍照和录像 with Camera

Developer Guides中有一篇是专门讲Camera的,而且讲的特别细.千万别以为有了这么好的文档就可以轻松的使用android.hardware.Camera这个包去拍照和录像了,各种坑在前面等着你呢.好了,下面将要讲述我们如何像辽宁队在常规赛中填坑的经历. 一.借助intent 这就十分easy了,发个intent就有人帮你搞定拍照和录像. 拍照: public void onTakePhoto(View view) { // create Intent to take a pict

利用AVFoundation播放视频

利用AVFoundation播放视频 by 伍雪颖 #import <AVFoundation/AVFoundation.h> NSURL *URL = [[NSBundle mainBundle] URLForResource:@"13_cn" withExtension:@"mp4"]; AVPlayer *player = [AVPlayer playerWithURL:URL]; AVPlayerLayer *playerLayer = [AVP

Android 开发 Camera类的拍照与录像

前言 在开发Android应用的时候,如果需要调用摄像头拍照或者录像,除了通过Intent调用系统现有相机应用进行拍照录像之外,还可以通过直接调用Camera硬件去去获取摄像头进行拍照录像的操作.本篇博客将讲解如何在Android应用中通过Camera拍照录像. 参考博客:https://www.cnblogs.com/plokmju/p/android_Camera.html Camera api 说明 Camera是Android摄像头硬件的相机类,位于硬件包"android.hardwar

利用js加载本地图片预览功能

直接上代码: 经测试,除safari6包括6以下不支持,其他均可正常显示. 原因:safari6不支持filereader,同时不能使用IE滤镜导致失效. fix: 可以利用canvas,解决safari6的问题 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

拍照/相册/录像/本地视频

1.导入系统库 #import <MobileCoreServices/MobileCoreServices.h> 2.遵守协议 <UIImagePickerControllerDelegate,UINavigationControllerDelegate> 3.创建 #pragma mark 相机--拍照 - (void)openCamera{ UIImagePickerController *ipc = [[UIImagePickerController alloc]init]

用AVFoundation自定义相机拍照

自定义拍照或者录视频的功能,就需要用到AVFoundation框架,目前我只用到了拍照,所以记录下自定义拍照用法,视频用法等用上了再补充,应该是大同小异 demo在这里:https://github.com/Phelthas/TEST_XMLCommon 以拍照过程为例,实现主要包括以下几个部分: 1,首先要判断用户授权: let authorizationStatus = AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVi

swift2.0 UIImagePickerController 拍照 相册 录像

系统 ios9.1 语言swift2.0 在app 里最常用的功能就是多媒体选择,首先我们storyboard 创建一个button 用于触发选择事件 @IBAction func selectImageAction(sender: AnyObject) { } 这时候通常会弹出来一个ActionSheet 上面有拍照 , 相册,录像 和取消 这几项.iOS 8 以后actionsheet 和 alertview 都统一用UIAlertController 方法调用,8.3以前actionshe