В любом случае, есть обратный вызов captureOutput в фоновом потоке?

#iphone #audio-recording

#iPhone #аудиозапись

Вопрос:

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

          - (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));
  

Ответ №1:

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

Комментарии:

1. Оказывается, задержка, которую я наблюдал, была вызвана @syncronized (self), который я каким-то образом кодирую из другого кода. Изменение этого значения на @synchronized(s), где s — NSString *, решило проблему задержки. Не уверен, почему это так, но к вашему сведению

Ответ №2:

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

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

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

Комментарии:

1. вы что-то пропустили, вы хотите, чтобы обратный вызов вызывался в фоновом потоке, но затем вы используете основную очередь?

2. Так давно, просто не помню деталей. Это была проблема с производительностью пользовательского интерфейса. Я думаю, что у меня это было в качестве примера того, как изменить, если потребуется.