Replaykit, startCaptureWithHandler () no envía CMSampleBufferRef del tipo de video en captureHandler

He implementado unaRPScreenRecorder, que graba la pantalla y el audio del micrófono. Después de completar varias grabaciones, detengo la grabación y combino los Audios con Videos usandoAVMutableComposition y luego combine todos los videos para formar un solo video.

Para la grabación de pantalla y obtener los archivos de video y audio, estoy usando

- (void)startCaptureWithHandler:(nullable void(^)(CMSampleBufferRef sampleBuffer, RPSampleBufferType bufferType, NSError * _Nullable error))captureHandler completionHandler:

Para detener la grabación. Llamo a esta función:

- (void)stopCaptureWithHandler:(void (^)(NSError *error))handler;

Y estos son bastante sencillos.

La mayoría de las veces funciona muy bien, recibo CMSampleBuffers de video y audio. Pero algunas veces sucede questartCaptureWithHandler solo me envía buffers de audio pero no buffers de video. Y una vez que encuentre este problema, no desaparecerá hasta que reinicie mi dispositivo y reinstale la aplicación. Esto hace que mi aplicación sea poco confiable para el usuario. Creo que este es un problema del kit de reproducción, pero no se pueden encontrar problemas relacionados con otros desarrolladores. avíseme si alguno de ustedes se encontró con este problema y obtuvo la solución.

He comprobado varias veces, pero no he visto ningún problema en la configuración. Pero aquí está de todos modos

NSError *videoWriterError;
videoWriter = [[AVAssetWriter alloc] initWithURL:fileString fileType:AVFileTypeQuickTimeMovie
                                           error:&videoWriterError];


NSError *audioWriterError;
audioWriter = [[AVAssetWriter alloc] initWithURL:audioFileString fileType:AVFileTypeAppleM4A
                                           error:&audioWriterError];

CGFloat width =UIScreen.mainScreen.bounds.size.width;
NSString *widthString = [NSString stringWithFormat:@"%f", width];
CGFloat height =UIScreen.mainScreen.boNSString *heightString = [NSString stringWithFormat:@"%f", height];unds.size.height;

NSDictionary  * videoOutputSettings= @{AVVideoCodecKey : AVVideoCodecTypeH264,
                                       AVVideoWidthKey: widthString,
                                       AVVideoHeightKey : heightString};
videoInput  = [[AVAssetWriterInput alloc] initWithMediaType:AVMediaTypeVideo outputSettings:videoOutputSettings];

videoInput.expectsMediaDataInRealTime = true;

AudioChannelLayout acl;
bzero( &acl, sizeof(acl));
acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono;
NSDictionary * audioOutputSettings = [ NSDictionary dictionaryWithObjectsAndKeys:
                                      [ NSNumber numberWithInt: kAudioFormatAppleLossless ], AVFormatIDKey,
                                      [ NSNumber numberWithInt: 16 ], AVEncoderBitDepthHintKey,
                                      [ NSNumber numberWithFloat: 44100.0 ], AVSampleRateKey,
                                      [ NSNumber numberWithInt: 1 ], AVNumberOfChannelsKey,
                                      [ NSData dataWithBytes: &acl length: sizeof( acl ) ], AVChannelLayoutKey,
                                      nil ];

audioInput = [[AVAssetWriterInput alloc] initWithMediaType:AVMediaTypeAudio outputSettings:audioOutputSettings];

[audioInput setExpectsMediaDataInRealTime:YES];

[videoWriter addInput:videoInput];
    [audioWriter addInput:audioInput];

    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];

[RPScreenRecorder.sharedRecorder startCaptureWithHandler:^(CMSampleBufferRef  _Nonnull sampleBuffer, RPSampleBufferType bufferType, NSError * _Nullable myError) {

Block

}

La función startCaptureWithHandler también tiene una funcionalidad bastante sencilla:

[RPScreenRecorder.sharedRecorder startCaptureWithHandler:^(CMSampleBufferRef  _Nonnull sampleBuffer, RPSampleBufferType bufferType, NSError * _Nullable myError) {

                    dispatch_sync(dispatch_get_main_queue(), ^{


                        if(CMSampleBufferDataIsReady(sampleBuffer))
                        {

                            if (self->videoWriter.status == AVAssetWriterStatusUnknown)
                            {
                                    self->writingStarted = true;
                                    [self->videoWriter startWriting];
                                    [self->videoWriter startSessionAtSourceTime:CMSampleBufferGetPresentationTimeStamp(sampleBuffer)];

                                    [self->audioWriter startWriting];
                                    [self->audioWriter startSessionAtSourceTime:CMSampleBufferGetPresentationTimeStamp(sampleBuffer)];
                            }
                            if (self->videoWriter.status == AVAssetWriterStatusFailed) {
                                return;
                            }

                            if (bufferType == RPSampleBufferTypeVideo)
                            {

                                if (self->videoInput.isReadyForMoreMediaData)
                                {
                                        [self->videoInput appendSampleBuffer:sampleBuffer];
                                }
                            }
                            else if (bufferType == RPSampleBufferTypeAudioMic)
                            {
                                //                                printf("\n+++ bufferAudio received %d \n",arc4random_uniform(100));
                                if (writingStarted){
                                    if (self->audioInput.isReadyForMoreMediaData)
                                    {
                                            [self->audioInput appendSampleBuffer:sampleBuffer];
                                    }
                                }
                            }

                        }
                    });

                }

Además, cuando se produce esta situación, el grabador de pantalla del sistema también se corrompe. Al hacer clic en la grabadora del sistema, aparece este error:

El error dice "La grabación de la pantalla se detuvo debido a: Error durante la grabación debido a un error de Mediaservices".

Debe haber dos razones:

iOS Replay kit está en versión beta, por lo que está dando problemas después de algunas veces de uso.He implementado cualquier lógica problemática, lo que hace que se bloquee el kit de reproducción.

Si es el problema no. 1, entonces no hay problema. Si este es el problema no. 2 entonces tengo que saber dónde podría estar equivocado?

Opiniones y ayuda serán apreciadas.

Respuestas a la pregunta(3)

Su respuesta a la pregunta