WebRT C рендеринг VideoCall в SwiftUI - PullRequest
1 голос
/ 06 февраля 2020

Я использую webRT C для видеовызова между двумя iphone устройствами. Одноранговое соединение webrt c установлено успешно. Видеопоток должен показываться в swiftui. Объект webRT C RTCEAGLVideoView, в котором хранится видео, необходимо рендерить в swiftui. В классе модели я объявил этот объект как

var remoteVideoView : RTCEAGLVideoView?
    {
        willSet {
            objectWillChange.send()
        }
    }

в классе SwiftUI, remoteVideoView должен визуализировать.

VStack()
{
//show remoteVideoView  here
}

, какой тип объекта следует использовать для визуализации этого видеовидения.

Код вкратце введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 07 февраля 2020
struct RemoteView : UIViewRepresentable {
    @Binding var video: VideoCall
    @Binding var remoteView: RTCEAGLVideoView
    func updateUIView(_ uiView: RTCEAGLVideoView, context: UIViewRepresentableContext<RemoteView>) {
   }

    func makeUIView(context: Context) -> RTCEAGLVideoView  {
        self.remoteView.frame = CGRect(x: 20, y: 20, width: 200, height: 300)
        self.remoteView = self.video.remoteVideoView!
        return self.remoteView
    }

} 

Я назвал это из другой структуры swiftui как

VStack()
{ 
      RemoteView() 
}

, но я получаю ошибку компилятора

1 голос
/ 06 февраля 2020

Сначала вам нужно создать RTCMediaStream, который содержит аудиодорожки и видеодорожки:

@property RTCMediaStream * _Nullable mediaStream;

Потоки, которые вы получаете с вашего медиа-сервера с помощью streamId, преобразуют их в RTCMediaStream, а затем используйте код ниже, чтобы отобразить его в RTCEAGLVideoView

 if (mediaStream.videoTracks.count > 0) {
     RTCVideoTrack *videoTrack = [self.mediaStream.videoTracks objectAtIndex:0];
     [videoTrack addRenderer:remoteView];
   }

Также создайте IBOutlet RTCEAGLVideoView, как показано ниже:

@property (weak, nonatomic) IBOutlet RTCEAGLVideoView *remoteView;

Теперь добавьте представление в свой контроллер представления и назначьте класс как RTCEAGLVideoView к этому мнению. Затем подключите розетку videoView.

Если вы не используете раскадровку, используйте следующий код:

 RTCEAGLVideoView *remoteView = [[RTCEAGLVideoView alloc] initWithFrame:self.frame]; // pass CGRect frame here.
 remoteView.delegate = self;
 [yourView addSubview:remoteView];

Теперь вы можете просматривать свое видео.

Добавить RTCEAGLVideoView в VStack ( ) используйте ниже:

struct RemoteView: UIViewRepresentable {
    func remoteView(context: Context) -> RTCEAGLVideoView {
        //create frame for RTCEAGLVideoView here
    }
}


struct RemoteView_Preview: PreviewProvider {
    static var previews: some View {
        RemoteView(frame: .zero)
    }
}

В VStack используйте как:

 VStack {
          RemoteView(frame)
      VStack{
           Text("")
           }
       }
...