//
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#undef PRODUCER_HAS_VIDEO_CAPTURE
#define PRODUCER_HAS_VIDEO_CAPTURE (__IPHONE_OS_VERSION_MIN_REQUIRED >= 40000 && TARGET_OS_EMBEDDED)
@protocol CameraHelpDelegate
-(void) getSampleBufferImage:(UIImage *) v_image ;
@end
@interface CameraHelp : NSObject
#if PRODUCER_HAS_VIDEO_CAPTURE
<AVCaptureVideoDataOutput SampleBufferDelegate>
#endif
{
@private
int mWidth;
int mHeight;
int mFps;
BOOL mFrontCamera;
BOOL mFirstFrame;
BOOL mStarted;
UIView* mPreview;
id<CameraHelpDelegate> outDelegate;
#if PRODUCER_HAS_VIDEO_CAPTURE
AVCaptureSession* mCaptureSession;
AVCaptureDevice *mCaptureDevice;
#endif
}
//单例模式
+ (CameraHelp*)shareCameraHelp;
+ (void)closeCamera;
//设置前置摄像头
- (BOOL)setFrontCamera;
//设置后置摄像头
- (BOOL)setBackCamera;
//开始前设置捕获参数
- (void)prepareVideoCapture:(int) width andHeight: (int)height andFps: (int) fps andFrontCamera:(BOOL) bfront andPreview:(UIView*) view;
//开始捕获
- (void)startVideoCapture;
//停止捕获
- (void)stopVideoCapture;
//设置要显示到得View
- (void)setPreview: (UIView*)preview;
//设置数据输出
- (void)setVideoDataOutputBuffer :(id<CameraHelpDelegate>)delegate;
@end
-------------------------------------------------------------------------
//
// CameraHelp.m
//
//
// Created by zcx. on 11-6-28.
// Copyright 2011
. All rights reserved.
//
#import "CameraHelp.h"
//
//
Private
//
@interface CameraHelp (Private)
#if PRODUCER_HAS_VIDEO_CAPTURE
+(AVCaptureDevice *)cameraAtPosition:(AVCaptureDevicePosition)position;
- (void)startPreview;
- (void)stopPreview;
#endif
@end
@implementation CameraHelp (Private)
#if PRODUCER_HAS_VIDEO_CAPTURE
+ (AVCaptureDevice *)cameraAtPosition:(AVCaptureDevicePosition)position{
NSArray *cameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in cameras){
if (device.position == position){
return device;
}
}
return [AVCaptureDevice defaultDeviceWithMediaTy
pe:AVMediaTypeVideo];
}
- (void)startPreview{
if(mCaptureSession && mPreview && mStarted){
AVCaptureVideoPreviewLay
er* previewLayer = [AVCaptureVideoPreviewLay
er layerWithSession: mCaptureSession];
previewLayer.frame = mPreview.bounds;
previewLayer.videoGravity = AVLayerVideoGravityResiz
eAspectFill;
//
if(previewLayer.orientationSupported){
//
previewLayer.orientation = mOrientation;
//
}
[mPreview.layer addSublayer: previewLayer];
if(![mCaptureSession isRunning]){
[mCaptureSession startRunning];
}
}
}
- (void)stopPreview{
if(mCaptureSession){
if([mCaptureSession isRunning]){
[mCaptureSession stopRunning];
// remove all sublayers
if(mPreview){
for(CALayer *ly in mPreview.layer.sublayers){
if([ly isKindOfClass: [AVCaptureVideoPreviewLay
er class]])
{
[ly removeFromSuperlayer];
break;
}
}
}
}
}
}
#endif
@end
@implementation CameraHelp
static CameraHelp* g_camera = 0;
- (id)init
{
if(g_camera)
return g_camera;
else
{
if(self = [super init])
{
self->mWidth = 30;
self->mHeight = 30;
self->mFps = 60;
self->mFrontCamera = NO;
self->mStarted = NO;
g_camera = self;
outDelegate = nil;
}
return g_camera;
}
}
-(void)dealloc
{
#if PRODUCER_HAS_VIDEO_CAPTURE
[mCaptureSession release];
[mCaptureDevice release];
[mPreview release];
#endif
[super dealloc];
}
+ (CameraHelp*)shareCameraHelp
{
if(!g_camera)
g_camera = [[CameraHelp alloc] init];
return g_camera;
}
+ (void)closeCamera
{
if(g_camera)
{
[g_camera dealloc];
g_camera = nil;
}
}
- (void)prepareVideoCapture:(int) width andHeight: (int)height andFps: (int) fps andFrontCamera:(BOOL) bfront andPreview:(UIView*) view
{
self->mWidth = width;
self->mHeight = height;
self->mFps = fps;
self->mFrontCamera = bfront;
if(view)
self->mPreview = [view retain];
#if PRODUCER_HAS_VIDEO_CAPTURE
if([mCaptureSession isRunning])
{
[self stopVideoCapture];
[self startVideoCapture];
}
#endif
}
- (void)startVideoCapture
{
#if PRODUCER_HAS_VIDEO_CAPTURE
//防锁
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];
//打开摄像设备,并开始捕抓图像
//[labelState setText:@"Starting Video stream"];
if(mCaptureDevice || mCaptureSession)
{
NSLog(@"Already capturing");
return;
}
if((mCaptureDevice = [CameraHelp cameraAtPosition:mFrontCamera? AVCaptureDevicePositionF
ront:AVCaptureDevicePositionB
ack]) == nil)
{
NSLog(@"Failed to get valide capture device");
return;
}
NSError *error = nil;
AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:mCaptureDevice error:&error];
if (!videoInput)
{
NSLog(@"Failed to get video input");
mCaptureDevice = nil;
return;
}
mCaptureSession = [[AVCaptureSession alloc] init];
mCaptureSession.sessionPreset = AVCaptureSessionPreset64
0x480;
[mCaptureSession addInput:videoInput];
// Currently, the only supported key is kCVPixelBufferPixelForma
tTypeKey. Recommended pixel format choices are
// kCVPixelFormatType_420YpCbCr8BiPlanarVideoR
ange or kCVPixelFormatType_32BGRA.
// On iPhone 3G, the recommended pixel format choices are kCVPixelFormatType_422YpCbCr8 or kCVPixelFormatType_32BGRA.
//
AVCaptureVideoDataOutput
*avCaptureVideoDataOutput
= [[AVCaptureVideoDataOutput
alloc] init];
NSString* key = (NSString*)kCVPixelBufferPixelForma
tTypeKey;
NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];
NSDictionary* settings = [NSDictionary dictionaryWithObject:value forKey:key];
//
NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
//
//[NSNumber numberWithUnsignedInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoR
ange], //kCVPixelBufferPixelForma
tTypeKey,
//
[NSNumber numberWithInt: mWidth], (id)kCVPixelBufferWidthKey,
//
[NSNumber numberWithInt: mHeight], (id)kCVPixelBufferHeightKey,
//
nil];
avCaptureVideoDataOutput
.videoSettings = settings;
//[settings release];
//
avCaptureVideoDataOutput
.minFrameDuration = CMTimeMake(1, 1.0f/30);
avCaptureVideoDataOutput
.alwaysDiscardsLateVideoF
rames = YES;
dispatch_queue_t queue = dispatch_queue_create("com.gh.cecall", NULL);
[avCaptureVideoDataOutput
setSampleBufferDelegate:self queue:queue];
[mCaptureSession addOutput:avCaptureVideoDataOutput
];
[settings release];
[avCaptureVideoDataOutput
release];
dispatch_release(queue);
mFirstFrame = YES;
mStarted = YES;
//start preview
[self startPreview];
#endif
}
- (void)stopVideoCapture
{
#if PRODUCER_HAS_VIDEO_CAPTURE
if(mCaptureSession){
[mCaptureSession stopRunning];
[mCaptureSession release], mCaptureSession = nil;
NSLog(@"Video capture stopped");
}
[mCaptureDevice release], mCaptureDevice = nil;
if(mPreview){
for (UIView *view in mPreview.subviews) {
[view removeFromSuperview];
}
}
#endif
}
- (BOOL)setFrontCamera
{
if(mFrontCamera)
return YES;
[self stopVideoCapture];
mFrontCamera = YES;
[self startVideoCapture];
return YES;
}
- (BOOL)setBackCamera{
if(!mFrontCamera)
return YES;
[self stopVideoCapture];
mFrontCamera = NO;
[self startVideoCapture];
return YES;
}
- (void) setPreview: (UIView*)preview{
#if PRODUCER_HAS_VIDEO_CAPTURE
if(preview == nil){
// stop preview
[self stopPreview];
// remove layers
if(mPreview){
for(CALayer *ly in mPreview.layer.sublayers){
if([ly isKindOfClass: [AVCaptureVideoPreviewLay
er class]]){
[ly removeFromSuperlayer];
break;
}
}
[mPreview release], mPreview = nil;
}
}
else {
//start preview
if (mPreview) {
[mPreview release];
mPreview = nil;
}
if((mPreview = [preview retain])){
[self startPreview];
}
}
#endif
}
- (void)setVideoDataOutputBuffer :(id<CameraHelpDelegate>)delegate
{
outDelegate = delegate;
}
#pragma mark -
#pragma mark AVCaptureVideoDataOutput SampleBufferDelegate
#if PRODUCER_HAS_VIDEO_CAPTURE
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
UIImage *image = [self imageFromSampleBuffer:sampleBuffer];
if (outDelegate) {
[outDelegate getSampleBufferImage:image];
}
#if 0
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//捕捉数据输出要怎么处理虽你便
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBu
ffer(sampleBuffer);
CVPixelBufferLockBaseAdd
ress(imageBuffer,0);
if(CVPixelBufferLockBaseAdd
ress(imageBuffer, 0) == kCVReturnSuccess)
{
//
void *bufferPtr = CVPixelBufferGetBaseAddr
ess(imageBuffer);
UInt8 *bufferPtr = (UInt8 *)CVPixelBufferGetBaseAddr
essOfPlane(imageBuffer,0);
size_t buffeSize = CVPixelBufferGetDataSize
(imageBuffer);
NSLog(@"%ld",buffeSize);
if(self->mFirstFrame)
{
//第一次数据要求:宽高,类型
size_t bytesPerRow = CVPixelBufferGetBytesPer
Row(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
NSNumber *numberRow = [NSNumber numberWithInteger:bytesPerRow];
NSNumber *numberWidth = [NSNumber numberWithInteger:width];
NSNumber *numberHeight = [NSNumber numberWithInteger:height];
NSArray *array = [NSArray arrayWithObjects:numberRow,numberWidth,numberHeight, nil];
if (outDelegate) {
[outDelegate getVideoSizeInfo:array];
}
int pixelFormat = CVPixelBufferGetPixelFor
matType(imageBuffer);
switch (pixelFormat) {
case kCVPixelFormatType_420YpCbCr8BiPlanarVideoR
ange:
//engine->srcFormat = VideoFormat_NV12;//PIX_FMT_NV12;
NSLog(@"Capture pixel format=NV12");
break;
case kCVPixelFormatType_422YpCbCr8:
//engine->srcFormat = VideoFormat_UYVY;//PIX_FMT_UYVY422;
NSLog(@"Capture pixel format=UYUY422");
break;
default:
//engine->srcFormat = VideoFormat_BGR32;//PIX_FMT_RGB32;
NSLog(@"Capture pixel format=RGB32");
}
mFirstFrame = NO;
}
//send data
//engine->SendVideoFrame((unsigned char*)bufferPtr,buffeSize);
if(outDelegate){
[outDelegate videoDataOutputBuffer:(char*)bufferPtr dataSize:buffeSize];
}
CVPixelBufferUnlockBaseA
ddress(imageBuffer, 0);
}
[pool release];
#endif
}
// Create a UIImage from sample buffer data
- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer
{
// Get a CMSampleBuffer's Core Video image buffer for the media data
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBu
ffer(sampleBuffer);
// Lock the base address of the pixel buffer
CVPixelBufferLockBaseAdd
ress(imageBuffer, 0);
// Get the number of bytes per row for the pixel buffer
void *baseAddress = CVPixelBufferGetBaseAddr
ess(imageBuffer);
// Get the number of bytes per row for the pixel buffer
size_t bytesPerRow = CVPixelBufferGetBytesPer
Row(imageBuffer);
// Get the pixel buffer width and height
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
// Create a device-dependent RGB color space
CGColorSpaceRef colorSpace = CGColorSpaceCreateDevice
RGB();
// Create a bitmap graphics context with the sample buffer data
CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8,
bytesPerRow, colorSpace, kCGBitmapByteOrder32Litt
le | kCGImageAlphaPremultipli
edFirst);
// Create a Quartz image from the pixel data in the bitmap graphics context
CGImageRef quartzImage = CGBitmapContextCreateIma
ge(context);
// Unlock the pixel buffer
CVPixelBufferUnlockBaseA
ddress(imageBuffer,0);
// Free up the context and color space
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
// Create an image object from the Quartz image
UIImage *image = [UIImage imageWithCGImage:quartzImage];
// Release the Quartz image
CGImageRelease(quartzImage);
return (image);
}
#endif
@end
-----------------------------------将图片保存为视频-------------------------------
- (void) saveVideo {
NSString *strSpeed = nil;
NSString *strAgle = nil;
if (m_saveMutableDict) {
strSpeed = [m_saveMutableDict objectForKey:SWING_SPEED];
strAgle = [m_saveMutableDict objectForKey:SWING_ANGLE];
}
//定义视频的大小
CGSize size ;
#if isPad
size = CGSizeMake(480,640); // 960*640
#else
size = CGSizeMake(480,640);
#endif
NSError *error = nil;
NSString *filePath = [[Utilities getSanBoxPath] stringByAppendingPathCom
ponent:[NSString stringWithFormat:@"%@.mov",self.m_strUUID]];
unlink([filePath UTF8String]);
//—-initialize compression engine
AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:filePath]
fileType:AVFileTypeQuickTimeMovie
error:&error];
NSParameterAssert(videoWriter);
if(error)
NSLog(@"error = %@", [error localizedDescription]);
NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAnd
Keys:AVVideoCodecH264, AVVideoCodecKey,
[NSNumber numberWithInt:size.width], AVVideoWidthKey,
[NSNumber numberWithInt:size.height], AVVideoHeightKey, nil];
AVAssetWriterInput *writerInput = [AVAssetWriterInput assetWriterInputWithMedi
aType:AVMediaTypeVideo outputSettings:videoSettings];
NSDictionary *sourcePixelBufferAttribu
tesDictionary = [NSDictionary dictionaryWithObjectsAnd
Keys:[NSNumber numberWithInt:kCVPixelFormatType_32ARGB], kCVPixelBufferPixelForma
tTypeKey, nil];
AVAssetWriterInputPixelB
ufferAdaptor *adaptor = [AVAssetWriterInputPixelB
ufferAdaptor
assetWriterInputPixelBuf
ferAdaptorWithAssetWrite
rInput:writerInput sourcePixelBufferAttribu
tes:sourcePixelBufferAttribu
tesDictionary];
NSParameterAssert(writerInput);
NSParameterAssert([videoWriter canAddInput:writerInput]);
if ([videoWriter canAddInput:writerInput])
NSLog(@"
");
else
NSLog(@"
");
[videoWriter addInput:writerInput];
[videoWriter startWriting];
[videoWriter startSessionAtSourceTime
:kCMTimeZero];
//合成多张图片为一个视频文件
dispatch_queue_t dispatchQueue = dispatch_queue_create("mediaInputQueue", NULL);
int __block frame = 0;
[writerInput requestMediaDataWhenRead
yOnQueue:dispatchQueue usingBlock:^{
while ([writerInput isReadyForMoreMediaData])
{
if(++frame >= [m_mutableArrayDatas count])
{
[writerInput markAsFinished];
[videoWriter finishWriting];
[videoWriter release];
dispatch_release(dispatchQueue);
[NSThread detachNewThreadSelector:@selector(saveOneImageAndPlist) toTarget:self withObject:nil];
break;
}
CVPixelBufferRef buffer = NULL;
int idx = frame;
UIImage *imageOld = [m_mutableArrayDatas objectAtIndex:idx];
// 给外部传递百分比
if (m_delegate && [m_delegate respondsToSelector:@selector(saveVideoWithProgress:)]) {
[m_delegate saveVideoWithProgress:(1.0f*frame/[m_mutableArrayDatas count])];
}
// 图片 cpmvert buffer
buffer = (CVPixelBufferRef)[self pixelBufferFromCGImage:[imageOld CGImage] size:size andSpeed:strSpeed andAngle:strAgle];
if (buffer)
{
//
RECORD_VIDEO_FPS
if(![adaptor appendPixelBuffer:buffer withPresentationTime:CMTimeMake(frame, m_floatFPS)]) {
dispatch_release(dispatchQueue);
[self restoreDefault];
// 出错的情况吓会执行这些。
// 此处应该恢复刚进来的状况
NSLog(@"视频录制出错了");
}else
CFRelease(buffer);
}
}
}];
}
- (CVPixelBufferRef )pixelBufferFromCGImage:(CGImageRef)image size:(CGSize)size andSpeed:(NSString *)v_speed andAngle:(NSString*)v_angle
{
//Impact Speed : = %f , Club Angle
NSDictionary *options = [NSDictionary dictionaryWithObjectsAnd
Keys:
[NSNumber numberWithBool:YES], kCVPixelBufferCGImageCom
patibilityKey,
[NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapCo
ntextCompatibilityKey, nil];
CVPixelBufferRef pxbuffer = NULL;
CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, size.width, size.height, kCVPixelFormatType_32ARGB, (CFDictionaryRef) options, &pxbuffer);
NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);
CVPixelBufferLockBaseAdd
ress(pxbuffer, 0);
void *pxdata = CVPixelBufferGetBaseAddr
ess(pxbuffer);
NSParameterAssert(pxdata != NULL);
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDevice
RGB();
CGContextRef context = CGBitmapContextCreate(pxdata, size.width, size.height, 8, 4*size.width, rgbColorSpace, kCGImageAlphaPremultipli
edFirst);
NSParameterAssert(context);
CGContextSaveGState(context);
// 旋转
CGContextRotateCTM(context, -M_PI_2);
CGContextTranslateCTM(context, -size.height, 0);
CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),CGImageGetHeight(image)), image);
CGContextRestoreGState(context);
// 添加logo
UIImage *imageLogo = [UIImage imageNamed:@"Watermark.png"];
CGRect rectLogo ;
//
1280 720
#if isPad
rectLogo = CGRectMake(size.width-imageLogo.size.width-20.0f, size.height-imageLogo.size.height-170.0f, imageLogo.size.width, imageLogo.size.height);
#else
rectLogo = CGRectMake(size.width-imageLogo.size.width-50.0f, size.height-imageLogo.size.height-25.0f, imageLogo.size.width, imageLogo.size.height);
#endif
CGContextDrawImage(context, rectLogo, imageLogo.CGImage);
// 球杆挥动的时候才显示数据
if (m_saveMutableDict) {
#if isPad
MyDrawText(context , CGPointMake(20.0f, size.height-imageLogo.size.height-150.0f),v_speed);
MyDrawText(context , CGPointMake(20.0f, size.height-imageLogo.size.height-180.0f),v_angle);
#else
MyDrawText(context , CGPointMake(70.0f, size.height-30.0f),v_speed);
MyDrawText(context , CGPointMake(70.0f, size.height-53.0f),v_angle);
#endif
}
CGColorSpaceRelease(rgbColorSpace);
CGContextRelease(context);
CVPixelBufferUnlockBaseA
ddress(pxbuffer, 0);
return pxbuffer;
}
void MyDrawText (CGContextRef myContext, CGPoint point, NSString *v_strContext) {
#if isPad
CGContextSelectFont (myContext,
"Impact",
20.0f,
kCGEncodingMacRoman);
#else
CGContextSelectFont (myContext,
"Impact",
20.0f,
kCGEncodingMacRoman);
#endif
//
CGContextTranslateCTM(myContext, 0, 768);
//
CGContextScaleCTM(myContext, 1, -1);
CGContextSetCharacterSpa
cing (myContext, 1);
CGContextSetTextDrawingM
ode (myContext, kCGTextFillStroke);
CGContextSetLineWidth(myContext, 1.0f);
CGContextSetFillColorWit
hColor(myContext, [UIColor colorWithRed:251.0f/255.0f green:237.0f/255.0f blue:75.0f/255.0f alpha:1.0f].CGColor);
CGContextSetStrokeColorW
ithColor(myContext, [UIColor blackColor].CGColor) ;
CGContextShowTextAtPoint
(myContext, point.x, point.y, v_strContext.UTF8String, strlen(v_strContext.UTF8String)); // 10
//
[v_strContext drawAtPoint:CGPointMake(100
, 100) withFont:[UIFont fontWithName:@"Helvetica" size:20]];
}
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#undef PRODUCER_HAS_VIDEO_CAPTURE
#define PRODUCER_HAS_VIDEO_CAPTURE (__IPHONE_OS_VERSION_MIN_REQUIRED >= 40000 && TARGET_OS_EMBEDDED)
@protocol CameraHelpDelegate
-(void) getSampleBufferImage:(UIImage *) v_image ;
@end
@interface CameraHelp : NSObject
#if PRODUCER_HAS_VIDEO_CAPTURE
<AVCaptureVideoDataOutput
#endif
{
@private
#if PRODUCER_HAS_VIDEO_CAPTURE
#endif
}
//单例模式
+ (CameraHelp*)shareCameraHelp;
+ (void)closeCamera;
//设置前置摄像头
- (BOOL)setFrontCamera;
//设置后置摄像头
- (BOOL)setBackCamera;
//开始前设置捕获参数
- (void)prepareVideoCapture:(int) width andHeight: (int)height andFps: (int) fps andFrontCamera:(BOOL) bfront andPreview:(UIView*) view;
//开始捕获
- (void)startVideoCapture;
//停止捕获
- (void)stopVideoCapture;
//设置要显示到得View
- (void)setPreview: (UIView*)preview;
//设置数据输出
- (void)setVideoDataOutputBuffer
@end
-------------------------------------------------------------------------
//
//
//
//
//
//
//
#import "CameraHelp.h"
//
//
//
@interface CameraHelp (Private)
#if PRODUCER_HAS_VIDEO_CAPTURE
+(AVCaptureDevice *)cameraAtPosition:(AVCaptureDevicePosition)position;
- (void)startPreview;
- (void)stopPreview;
#endif
@end
@implementation CameraHelp (Private)
#if PRODUCER_HAS_VIDEO_CAPTURE
+ (AVCaptureDevice *)cameraAtPosition:(AVCaptureDevicePosition)position{
}
- (void)startPreview{
//
//
//
}
- (void)stopPreview{
}
#endif
@end
@implementation CameraHelp
static CameraHelp* g_camera = 0;
- (id)init
{
}
-(void)dealloc
{
#if PRODUCER_HAS_VIDEO_CAPTURE
#endif
}
+ (CameraHelp*)shareCameraHelp
{
}
+ (void)closeCamera
{
}
- (void)prepareVideoCapture:(int) width andHeight: (int)height andFps: (int) fps andFrontCamera:(BOOL) bfront andPreview:(UIView*) view
{
#if PRODUCER_HAS_VIDEO_CAPTURE
#endif
}
- (void)startVideoCapture
{
#if PRODUCER_HAS_VIDEO_CAPTURE
//
//
//
//
//
//
#endif
}
- (void)stopVideoCapture
{
#if PRODUCER_HAS_VIDEO_CAPTURE
#endif
}
- (BOOL)setFrontCamera
{
}
- (BOOL)setBackCamera{
}
- (void) setPreview: (UIView*)preview{
#if PRODUCER_HAS_VIDEO_CAPTURE
#endif
}
- (void)setVideoDataOutputBuffer
{
}
#pragma mark -
#pragma mark AVCaptureVideoDataOutput
#if PRODUCER_HAS_VIDEO_CAPTURE
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
#if 0
//
#endif
}
// Create a UIImage from sample buffer data
- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer
{
}
#endif
@end
-----------------------------------将图片保存为视频-------------------------------
- (void) saveVideo {
#if isPad
#else
#endif
}
- (CVPixelBufferRef )pixelBufferFromCGImage:(CGImageRef)image size:(CGSize)size andSpeed:(NSString *)v_speed andAngle:(NSString*)v_angle
{
#if isPad
#else
#endif
#if isPad
#else
#endif
}
void MyDrawText (CGContextRef myContext, CGPoint point, NSString *v_strContext) {
#if isPad
#else
#endif
}