Как установить AVCaptureVideoDataOutput в библиотеке - PullRequest
1 голос
/ 21 октября 2011

Я пытаюсь создать библиотеку для iPhone, поэтому я пытаюсь запустить камеру просто с помощью звонка. Проблема возникает, когда я называю себя в этой декларации:

"[captureOutput setSampleBufferDelegate:self queue:queue];"

поскольку компилятор говорит: «self не был объявлен в этой области», что мне нужно сделать, чтобы установить тот же класс, что и «AVCaptureVideoDataOutputSampleBufferDelegate» ?. По крайней мере, укажи мне правильное направление: P.

Спасибо !!!

вот полная функция:

bool VideoCamera_Init(){


    //Init Capute from the camera and show the camera


    /*We setup the input*/
    AVCaptureDeviceInput *captureInput = [AVCaptureDeviceInput 
                                          deviceInputWithDevice:[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo] 
                                          error:nil];
    /*We setupt the output*/
    AVCaptureVideoDataOutput *captureOutput = [[AVCaptureVideoDataOutput alloc] init];
    /*While a frame is processes in -captureOutput:didOutputSampleBuffer:fromConnection: delegate methods no other frames are added in the queue.
     If you don't want this behaviour set the property to NO */
    captureOutput.alwaysDiscardsLateVideoFrames = YES; 
    /*We specify a minimum duration for each frame (play with this settings to avoid having too many frames waiting
     in the queue because it can cause memory issues). It is similar to the inverse of the maximum framerate.
     In this example we set a min frame duration of 1/10 seconds so a maximum framerate of 10fps. We say that
     we are not able to process more than 10 frames per second.*/
    captureOutput.minFrameDuration = CMTimeMake(1, 20);

    /*We create a serial queue to handle the processing of our frames*/
    dispatch_queue_t queue;
    queue = dispatch_queue_create("cameraQueue", NULL);
    variableconnombrealeatorio= [[VideoCameraThread alloc] init];
    [captureOutput setSampleBufferDelegate:self queue:queue];


    dispatch_release(queue);
    // Set the video output to store frame in BGRA (It is supposed to be faster)
    NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey; 
    NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]; 
    NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key]; 
    [captureOutput setVideoSettings:videoSettings]; 
    /*And we create a capture session*/
    AVCaptureSession * captureSession = [[AVCaptureSession alloc] init];
    captureSession.sessionPreset= AVCaptureSessionPresetMedium;
    /*We add input and output*/
    [captureSession addInput:captureInput];
    [captureSession addOutput:captureOutput];
    /*We start the capture*/
    [captureSession startRunning];


    return TRUE;
}

Я также сделал следующий класс, но буфер пуст:

"

# import "VideoCameraThread.h"

CMSampleBufferRef bufferCamara;

@ реализация VideoCameraThread

  • (void) captureOutput: (AVCaptureOutput *) captureOutput didOutputSampleBuffer: (CMSampleBufferRef) sampleBuffer fromConnection: (AVCaptureConnection *) соединение { bufferCamera = sampleBuffer;

    } «

1 Ответ

1 голос
/ 21 октября 2011

Вы пишете функцию C, которая не имеет понятия о классах Objective C, объектах или идентификаторе self.Вам нужно будет изменить свою функцию, чтобы она принимала параметр для принятия sampleBufferDelegate, который вы хотите использовать:

bool VideoCamera_Init(id<AVCaptureAudioDataOutputSampleBufferDelegate> sampleBufferDelegate) {
    ...
    [captureOutput setSampleBufferDelegate:sampleBufferDelegate queue:queue];
    ...
}

Или вы можете написать свою библиотеку с объектно-ориентированным интерфейсом Objective C, а не в стиле Cinterface.

У вас также есть проблемы с управлением памятью в этой функции.Например, вы выделяете AVCaptureSession и присваиваете его локальной переменной.После возврата этой функции у вас не будет возможности извлечь этот AVCaptureSession, чтобы вы могли его освободить.

...