В любом случае иметь обратный вызов captureOutput в фоновом потоке? - PullRequest
1 голос
/ 13 октября 2011

Есть ли в любом случае функция обратного вызова ОС для делегата

         - (void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)psampleBuffer fromConnection:(AVCaptureConnection *)pconnection

в фоновом потоке вместо основного потока?Проблема в том, что время, которое требуется для копирования данных, влияет на пользовательский интерфейс.Это, кажется, должно быть сделано в главном потоке, так как captureOutput, кажется, пропал, если пытался скопировать его в фоновом потоке и т. Д. ... Я что-то здесь упускаю?

        CMFormatDescriptionRef format;
        format = CMSampleBufferGetFormatDescription(sampleBuffer);
        bufSize = CMSampleBufferGetNumSamples(sampleBuffer);
        sampleSize = CMSampleBufferGetSampleSize(sampleBuffer,0);
        sampleLength = CMSampleBufferGetTotalSampleSize(sampleBuffer);
        blockbuff = CMSampleBufferGetDataBuffer(sampleBuffer);

        CMBlockBufferCopyDataBytes(blockbuff, 0, tocopy*_depth, buffInUse+(offset*2));

Ответы [ 2 ]

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

Я использую функции CVPixelBuffer для блокировки / разблокировки буфера и получения информации о формате изображения.Я использую memcpy для копирования данных (пока буфер заблокирован) и вызываю executeSelectorInBackground для обработки данных.

0 голосов
/ 17 октября 2011

Для хорошего ответа, это, кажется, получить место, чтобы исправить поток обратного вызова

     [audioOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];

Просто нужно изменить очередь.

...