📸 iOS Media Capture – features touch-to-record video, slow motion, and photography
PBJVision
is a camera library for iOS that enables easy integration of special capture features and camera interface customizations in your iOS app. Next Level is the Swift counterpart.
Capture is also possible without having to use the touch-to-record gesture interaction as the sample project provides.
This library was originally created at DIY as a fun means for kids to author video and share their skills. The touch-to-record interaction was pioneered by Vine and Instagram.
Thanks to everyone who has contributed and helped make this a fun project and community.
PBJVision
is available and recommended for installation using the dependency manager CocoaPods.
To integrate, just add the following line to your Podfile
:
pod 'PBJVision'
Import the header.
#import "PBJVision.h"
Setup the camera preview using [[PBJVision sharedInstance] previewLayer]
.
// preview and AV layer
_previewView = [[UIView alloc] initWithFrame:CGRectZero];
_previewView.backgroundColor = [UIColor blackColor];
CGRect previewFrame = CGRectMake(0, 60.0f, CGRectGetWidth(self.view.frame), CGRectGetWidth(self.view.frame));
_previewView.frame = previewFrame;
_previewLayer = [[PBJVision sharedInstance] previewLayer];
_previewLayer.frame = _previewView.bounds;
_previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[_previewView.layer addSublayer:_previewLayer];
If your view controller is managed by a Storyboard, keep the previewLayer updated for device sizes
- (void)viewDidLayoutSubviews
{
_previewLayer.frame = _previewView.bounds;
}
Setup and configure the PBJVision
controller, then start the camera preview.
- (void)_setup
{
_longPressGestureRecognizer.enabled = YES;
PBJVision *vision = [PBJVision sharedInstance];
vision.delegate = self;
vision.cameraMode = PBJCameraModeVideo;
vision.cameraOrientation = PBJCameraOrientationPortrait;
vision.focusMode = PBJFocusModeContinuousAutoFocus;
vision.outputFormat = PBJOutputFormatSquare;
[vision startPreview];
}
Start/pause/resume recording.
- (void)_handleLongPressGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
switch (gestureRecognizer.state) {
case UIGestureRecognizerStateBegan:
{
if (!_recording)
[[PBJVision sharedInstance] startVideoCapture];
else
[[PBJVision sharedInstance] resumeVideoCapture];
break;
}
case UIGestureRecognizerStateEnded:
case UIGestureRecognizerStateCancelled:
case UIGestureRecognizerStateFailed:
{
[[PBJVision sharedInstance] pauseVideoCapture];
break;
}
default:
break;
}
}
End recording.
[[PBJVision sharedInstance] endVideoCapture];
Handle the final video output or error accordingly.
- (void)vision:(PBJVision *)vision capturedVideo:(NSDictionary *)videoDict error:(NSError *)error
{
if (error && [error.domain isEqual:PBJVisionErrorDomain] && error.code == PBJVisionErrorCancelled) {
NSLog(@"recording session cancelled");
return;
} else if (error) {
NSLog(@"encounted an error in video capture (%@)", error);
return;
}
_currentVideo = videoDict;
NSString *videoPath = [_currentVideo objectForKey:PBJVisionVideoPathKey];
[_assetLibrary writeVideoAtPathToSavedPhotosAlbum:[NSURL URLWithString:videoPath] completionBlock:^(NSURL *assetURL, NSError *error1) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Video Saved!" message: @"Saved to the camera roll."
delegate:self
cancelButtonTitle:nil
otherButtonTitles:@"OK", nil];
[alert show];
}];
}
To specify an automatic end capture maximum duration, set the following property on the ‘PBJVision’ controller.
[[PBJVision sharedInstance] setMaximumCaptureDuration:CMTimeMakeWithSeconds(5, 600)]; // ~ 5 seconds
To adjust the video quality and compression bit rate, modify the following properties on the PBJVision
controller.
@property (nonatomic, copy) NSString *captureSessionPreset;
@property (nonatomic) CGFloat videoBitRate;
@property (nonatomic) NSInteger audioBitRate;
@property (nonatomic) NSDictionary *additionalCompressionProperties;
Contributions and discussions are welcome!
PBJVision is available under the MIT license, see the LICENSE file for more information.