- 이 글은 Google WebRTC를 기준으로 하고 있으며, 글을 쓰고 있는 시점 기준 최신 버전을 사용하였습니다.
- android : 'org.webrtc:google-webrtc:1.0.25331'
- iOS : master branch - 80636981052754dcdaaf90a5d83a1cd9eb786dfb 기반 커스터마이징한 프레임워크.
- 송신시 min / max / current 비트레이트 설정은 가능하지만 해상도는 전송 시작시 해상도에서 3/4, 1/2, 3/8과 같이 자동으로 조절된다.
- Google에서 제공하는 기본(Default) 디코더/인코더 팩토리는 VP8 / VP9 / H264 High / H264 Baseline 을 제공한다.
- iOS 기준 모두 SW로 동작하도록 되어 있다.
- Android는 내부에서 HW / SW 디코더 팩토리를 둘 다 생성하고 HW를 지원하는 경우 HW를 우선순위로 사용하도록 되어 있다.
- Google WebRTC는 필요한 경우 HW 인코더/디코더를 직접 구현해서 사용해야 한다.
- Google WebRTC의 기본 코덱은 VP8이다.
- iOS에서 videotoolbox를 이용한 HW 인코딩을 사용하려면 기본 인코더 팩토리를 사용하는 것이 아니라 H264 인코더 팩토리를 사용해야 한다. (RTCVideoEncoderFactoryH264) 다행히 기본으로 제공하고 있다.
- WebRTC 프레임워크에 아무런 수정을 가하지 않았다면 iOS에서 HW H264코덱으로 인코딩한 영상이 일부 플랫폼 혹은 웹브라우저에서 재생이 되지 않는 것을 확인할 수 있다.
- H264 디코더를 제공하지 않는 경우도 있겠지만 안드로이드의 경우 멀쩡히 H264 HW / SW 디코더를 지원하는데도 플레이가 되지 않는다.
- iOS에서 H264로 인코딩시 우선적으로 High 프로파일을 선택하도록 되어 있는데 안드로이드에선 High 프로파일을 지원한다고 해놓고서는 디코딩을 지원하지 않는다. 정확히는 SDP negotiation 단계에서 High 프로파일인 경우 거절해버리기 때문에 연결 자체가 수립되지 않는다.
- 해당 문제가 2018년경 수정되었다는 글을 stackoverflow에서 본적이 있지만 실제로는 다음과 같은 수정을 해야 플레이가 가능하였다.
- iOS의 WebRTC FrameWork의 RTCVideoEncoderFactoryH264.cc 파일 내 supportedCodec 함수의 리턴값에서 H264 Baseline 프로파일이 인덱스 0번에 위치하도록 코드를 수정. ( 코드 수정 및 FrameWork 컴파일 필요 ) 코드 수정 없이 SDP message 내부에서의 순서만 바꿔도 동작하는지는 확인해보지 못 했다.
- 만약 이렇게 수정했는데도 불구하고 SDP negotiation이 실패한다면 주고받은 SDP 메세지를 살펴본다. negotiation 단계에서 각 피어는 사용가능한 코덱 정보를 교환하도록 되어있다. 구글 미디어 코덱의 Baseline 프로파일은 "42e0"으로 시작해야 하는데 SDP안에 기술된 프로파일의 코드가 "4200"로 시작하고 있다면 문자열을 "42e0"로 바꿔준다음에 사용한다.
개발