학습 기록/교내 기업과제 프로젝트

mediasoup 에서 다른 유저의 비디오/오디오 조작

당중독자 카코 2023. 9. 21. 04:17

미디어 서버와 클라이언트의 연결을 수립하고 난 이후 router(방) 을 생성하여 여러 인원이 채팅방을 만들었다고 가정. 

 

Q. 권한을 가진 유저가 버튼을 클릭해서 '특정 유저의 비디오/오디오 송출을 막으려면' 어떻게 해야할까?

1. 권한을 가진 유저가 특정 유저의 미디어 송출을 막을 순 있지만 직접적으로 상대방의 미디어를 키고 끌 수 있게 컨트롤하면 안됨.
2. 권한을 가진 유저가 특정 유저의 미디어 송출을 막았을 때 해당 유저가 마음대로 다시 송출할 수 있으면 안됨.
3. 송출하지 못하게 할 것인가, 송출하더라도 다른 유저에게 전달되지 못하게 할 것인가?

A. 

1번의 경우는 클라이언트 부분을 조작하는게 아닌 미디어 서버부분을 조작해서 송출을 막는 것으로 해결하기로 했다. 
-> 미디어 서버에서 특정 유저의 producer 를 제거 중지하면 미디어는 송출될 수 없고 클라이언트를 조작할 필요도 없다. ( producer.pause() )

2번의 경우는 특정 유저의 미디어 송출이 block 된 후 유저가 다시 버튼을 눌러 미디어 서버에 producer를 생성 재개하려 할 수 있다. 이 때, 미디어 서버에서 peer의 peerState 부분에 block 당했는지 식별할 수 있는 속성을 하나 추가하고 이걸 확인한 후 아직 block 당한 상태라면 producer 를 생성 재개하지 않기로 했다.  
-> router 의 각 peer마다 block 상태를 가지고있고 producer 생성 재개할 때 이를 검사하도록 조정 ( producer.resume() )
-> socket.emit()으로 클라이언트에서 서버로 이벤트와 함께 userId 배열과 콜백함수를 방출하고 미디어서버에서 socket.on으로 이벤트를 감지한 직후 producer.pause() 로 유저를 block한다.  위에서 말한 과정을 끝내고 전달받은 콜백함수를 호출하면 클라이언트에 구현되어있는 콜백함수가 실행되며 모든 유저의 View 화면에 특정 유저가 차단당했다는 표시를 해준다. 

3번의 경우는 이해가 완벽하지 않아 애매하다. 송출하지 못하게하려는 목적으로 미디어 서버의 producer를 제거 중지시키기로 했지만 나머지 유저들의 consumer를 제거/중지하는 방법도 유효한지 모르겠음. 대신 한 명의 유저를 조작하는게 더 쉽기 때문에 block 당한 유저의 producer 를 제거 중지시키는 쪽으로 채택했다. 

 

 

* 참고 * 

1. 미디어 서버의 producer는 video 와 audio 로 구분될 수 있고, 코드 상에서 producer.kind 로 구분 가능

2. 처음에는 미디어 서버의 producer를 close() 하려고 했다. 하지만 이 방법은 미디어 서버에서 닫은 producer를 다시 활성화 할 수 없고 재생성하는 방법 밖에 없었다. 공식문서에서 producer.pause()와 producer.resume()을 찾았고 이 메소드를 사용하기로 결정했다.

3. pause() / resume() 을 사용할 때 주의할 점: 클라이언트가 미디어를 on/off 하는 동작을 통해 producer를 close() 했다가 다시 생성한다면 중지되었던 producer는 사라졌기 때문에 다시 미디어를 송출할 가능성 있음. 따라서 peer의 block 상태가 true라면 resume 뿐만아니라 transport.produce() 도 못하게 막아야함.