Как сделать снимок экрана для потока Publi sh, используя WebRT C in iOS? - PullRequest
0 голосов
/ 14 января 2020

В WebRT C для IOS я использую RTCCameraPreviewView для воспроизведения потоков * publi sh и RTCMTLVideoView для воспроизведения удаленного потока.

I можно сделать снимок для Remote steam, используя код ниже:

UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 2.0f);
 [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
 UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

Но когда я использую тот же код для захвата снимка для локального потока, я получаю пустое изображение.

Просьба предложить, как сделать снимок для местного потока.

1 Ответ

1 голос
/ 15 января 2020

В 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()];
...