9

我正在使用 WebRTC 创建点对点连接以共享屏幕和音频。我正在使用 ReplayKit 捕获屏幕,它生成CMSampleBufferRef; 使用我可以创建RTCVideoFrame的 .

要获得CMSampleBufferRef我正在使用的:

[[RPScreenRecorder sharedRecorder] startCaptureWithHandler:^(CMSampleBufferRef  _Nonnull sampleBuffer, RPSampleBufferType bufferType, NSError * _Nullable error)

到目前为止,一切正常。

当我开始将应用程序发送到后台并返回几次时,就会出现问题;然后 ReplayKit 停止调用他的捕获处理程序。仅当我将其发送CMSampleBufferRef到 WebRTC 时才会发生这种情况,因此很明显 ReplayKit 问题与 WebRTC 有关。如果我从代码中删除这一行,问题就不会发生(但显然 WebRTC 不起作用)。

[self->source capturer:self->capturer didCaptureVideoFrame:videoFrame];

我可以让它再次工作的唯一方法是重新启动设备。即使杀死应用程序并重新启动也不起作用。

这就是我RTCVideoTrack在视图控制器中创建的方式:

- (RTCVideoTrack *)createLocalVideoTrack {

   self->source = [_factory videoSource];

   self->capturer = [[RTCVideoCapturer alloc] initWithDelegate:self->source];

   [self->source adaptOutputFormatToWidth:441 height:736 fps:15];

   return [_factory videoTrackWithSource:self->source trackId:@"ARDAMSv0"];
}

以下是我如何转换CMSampleBufferRef并发RTCVideoFrame送到 WebRTC:

- (void)didCaptureSampleBuffer:(CMSampleBufferRef)sampleBuffer {

  if (CMSampleBufferGetNumSamples(sampleBuffer) != 1 || !CMSampleBufferIsValid(sampleBuffer) ||
    !CMSampleBufferDataIsReady(sampleBuffer)) {
    return;
  }

  CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
  if (pixelBuffer == nil) {
    return;
  }

  RTCCVPixelBuffer *rtcPixelBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer];
  int64_t timeStampNs =
  CMTimeGetSeconds(CMSampleBufferGetPresentationTimeStamp(sampleBuffer)) * NSEC_PER_SEC;
  RTCVideoFrame *videoFrame = [[RTCVideoFrame alloc] initWithBuffer:rtcPixelBuffer rotation:RTCVideoRotation_0 timeStampNs:timeStampNs];

  [self->source capturer:self->capturer didCaptureVideoFrame:videoFrame];
}
4

0 回答 0