0

I am using AVCaptureSession to record audio and video and pass this data to

- (void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
    if(!_isPaused) {
         pass sample buffer to encoder
     }
}

Everything works nice (delegate is called and I am processing frames) until I open control panel and play music (I pause processing video from appDelegate). After stop music and try to continue recording the delegate method is never called. I think that playing audio something "ruins" my AVCaptureSession or delegate and I need to fix this issue...

here is method where I init AVCaptureSession

- (void) startup
 {
if (_session == nil)
{
    NSLog(@"Starting camera");


    // create capture device with video input
    _session = [[AVCaptureSession alloc] init];
    AVCaptureDevice* backCamera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    AVCaptureDeviceInput* input = [AVCaptureDeviceInput deviceInputWithDevice:backCamera error:nil];
    [_session addInput:input];

    // audio input from default mic
    AVCaptureDevice* mic = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
    AVCaptureDeviceInput* micinput = [AVCaptureDeviceInput deviceInputWithDevice:mic error:nil];
    [_session addInput:micinput];



    _captureQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
    AVCaptureVideoDataOutput* videoout = [[AVCaptureVideoDataOutput alloc] init];
    [videoout setSampleBufferDelegate:self queue:_captureQueue];
    NSDictionary* setcapSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange], kCVPixelBufferPixelFormatTypeKey,
                                    nil];
    videoout.videoSettings = setcapSettings;
    [_session addOutput:videoout];
    _videoConnection = [videoout connectionWithMediaType:AVMediaTypeVideo];

    NSDictionary* actual = videoout.videoSettings;

    AVCaptureAudioDataOutput* audioout = [[AVCaptureAudioDataOutput alloc] init];
    [audioout setSampleBufferDelegate:self queue:_captureQueue];
    [_session addOutput:audioout];
    _audioConnection = [audioout connectionWithMediaType:AVMediaTypeAudio];




    [_session startRunning];


}

}

and here is my interface:

@interface CameraController  () <AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate>
{
AVCaptureSession* _session;
AVCaptureVideoPreviewLayer* _preview;
dispatch_queue_t _captureQueue;
AVCaptureConnection* _audioConnection;
AVCaptureConnection* _videoConnection; }

and in appDelegate I pause and resume rocording like:

-(void)applicationDidBecomeActive:(UIApplication *)application {
    [[CamerraController controller] resume capture]; //this only set _isPaused = NO;
 } 

-(void)applicationWillResignActive:(UIApplication *)application {
    [[CamerraController controller] pauseCapture]; //this only set _isPaused = YES;
}

I am in dead end, thank you for any help

Gabriel.Massana
  • 8,165
  • 6
  • 62
  • 81
Martin Makarsky
  • 2,580
  • 1
  • 17
  • 28

0 Answers0