В webRT C при использовании RTCCameraPreviewView для отображения потока publi sh вы не можете сделать снимок, поскольку ** RTCCameraPreviewView ** обрабатывает AVCaptureVideoPreviewLayer и его реализован как слой OpenGL, поэтому вы не можете использовать обычный контекст CoreGraphi c для создания снимка поверх RTCCameraPreviewView . Но мы можем перезаписать RTCCameraPreviewView captchaSession и установить AVCaptureVideoDataOutput делегировать в нашем контроллере и получить Frame как CMSampleBufferRef . Чтобы заставить его работать, нам нужно получить ссылку «AVCaptureSession» из объекта «RTCCameraPreviewView».
RTCCameraPreviewView *publisherView = [[RTCCameraPreviewView alloc]initWithFrame:self.frame];
AVCaptureSession *session = publisherView.captureSession;
Теперь мы можем получить список доступных ** AVCaptureVideoDataOutput ** из ** AVCaptureSession **
NSArray *dataOutputList = session.outputs
После получения списка dataOutputList отфильтруйте этот массив и найдите правильный AVCaptureVideoDataOutput , на котором воспроизводится видео вашего издателя.
Например, предположим,
AVCaptureVideoDataOutput*captureVideoOutput = dataOutputList[0];
, что означает индекс '0' содержит видео локального издателя AVCaptureVideoDataOutput Теперь возьмите ссылку на старые делегаты, для которых установлено следующее
id capTchadelegate = captureVideoOutput.sampleBufferDelegate;
, а затем переписайте AVCaptureVideoDataOutputSampleBufferDelegate , как показано ниже
[captureVideoOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
После перезаписи делегата реализуйте AVCaptureVideoDataOutputSampleBufferDelegate В вашем классе ab ниже
- (void)captureOutput:(AVCaptureOutput *)output didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection;
здесь мы получим CMSampleBufferRef и преобразуем его в UIImage
После получения требуется CMSampleBufferRef image set del вернитесь назад для AVCaptureVideoDataOutputSampleBufferDelegate , чтобы ваш поток publi sh не застрял для другого получателя в том же вызове
[captureVideoOutput setSampleBufferDelegate:capTchadelegate queue:dispatch_get_main_queue()];