투케이2K

116. (Aws/Amazon) [Aws Kinesis Video Streams] WebRTC sdpAnswer 마스터 응답으로부터 확인할 수 있는 정보 정리 본문

Aws (Amazon)

116. (Aws/Amazon) [Aws Kinesis Video Streams] WebRTC sdpAnswer 마스터 응답으로부터 확인할 수 있는 정보 정리

투케이2K 2025. 10. 1. 08:23
728x90

[개발 환경 설정]

개발 환경 : Aws / Amazon Web Services

 

[설명 정리]

// --------------------------------------------------------------------------------------
[개발 및 환경]
// --------------------------------------------------------------------------------------

- 인프라 : Aws / Amazon Web Services


- 기술 구분 : Aws / Aws Kinesis Video Streams / KVS / WebRTC


- 사전) WebRTC 설명 : 

  >> WebRTC 란 웹, 애플리케이션, 디바이스 간 중간자 없이 오디오나 영상 미디어를 포착하고 실시간 스트림할 뿐 아니라, 임의의 데이터도 교환할 수 있도록 하는 기술입니다

  >> WebRTC 는 간단한 API 를 통해 웹 브라우저, 모바일 애플리케이션 및 커넥티드 디바이스 간에 실시간 통신을 활성화할 수 있습니다

  >> WebRTC 주요 용어 : 

    - SDP (Session Description Protocol) : 오디오/비디오 코덱, 해상도, 포트 등 스트리밍 정보를 담은 텍스트 포맷
    - Offer / Answer : 통신 연결을 협상하기 위한 SDP 메시지 (초기 연결 설정)
    - ICE (Interactive Connectivity Establishment) : NAT/P2P 환경에서도 연결 가능한 경로(IP, 포트 등)를 찾기 위한 기술
    - Candidate : 가능한 연결 경로 (IP + Port 조합)

  >> WebRTC SDP 오퍼 생성 (뷰어) 및 응답 (마스터) 스트리밍 플로우 : 

    [Viewer → Signaling Server] -- SDP Offer --> [Master] : 뷰어는 마스터로 스트리밍 오퍼 신호 보낸다
    [Master] -- SDP Answer --> [Viewer] : 마스터는 특정 뷰어의 오퍼 신호 확인 후 응답을 보낸다

    [Viewer] -- ICE Candidate --> [Master] : 스트리밍을 할 수 있는 경로 확인
    [Master] -- ICE Candidate --> [Viewer] : 스트리밍을 할 수 있는 경로 확인

    P2P 연결 성립 → 스트리밍 시작

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[sdpAnswer 주요 구성 요소 설명]
// --------------------------------------------------------------------------------------

  -----------------------------------------------
  [기본 정보]
  -----------------------------------------------
  >> v= (Version) : SDP 버전. 일반적으로 v=0으로 고정되어 있습니다

    - 예시 : v=0

  >> o= (Origin) : 세션 생성자 정보: 사용자 이름, 세션 ID, 버전, 네트워크 유형, 주소 유형, IP 주소 등

    - 예시 : o=- 4611733059123456789 2 IN IP4 127.0.0.1

  >> s= (Session Name) : 세션 이름. 보통은 s=-로 설정되어 의미 없는 값이 들어갑니다

    - 예시 : s=-

  >> t= (Timing) : 세션의 시작과 종료 시간. 대부분 t=0 0으로 설정되어 항상 유효한 세션을 의미합니다

    - 예시 : t=0 0

  >> a=group:BUNDLE : 여러 미디어 스트림을 하나의 트랜스포트로 묶는 BUNDLE 설정

    - 예시 : a=group:BUNDLE audio video

  >> a=msid-semantic:WMS : WebRTC에서 사용하는 Media Stream ID의 의미를 정의

    - 예시 : a=msid-semantic: WMS stream1

  -----------------------------------------------
  [미디어 관련 필드]
  -----------------------------------------------
  >> m= (Media Description) : 오디오, 비디오 등의 미디어 타입과 포트, 프로토콜, 코덱 정보

    - 예시 : m=audio 9 UDP/TLS/RTP/SAVPF 111

    - 예시 : m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104

    - 예시 : m=video 9 UDP/TLS/RTP/SAVPF 96 97 98

    - 미디어 타입 (audio, video, application)
    
    - 포트 번호 (보통 9는 ICE 사용 의미)

    - 전송 방식 (UDP/TLS/RTP/SAVPF)

    - 사용 가능한 payload type 목록

  >> c= (Connection Information) : 연결에 사용될 IP 주소 정보

    - 예시 : c=IN IP4 0.0.0.0

    - 연결 주소 (ICE를 사용하는 경우 보통 0.0.0.0)

  >> a=rtcp-mux / a=rtcp-rsize : RTCP 멀티플렉싱 및 RTCP 패킷 크기 최적화 설정

  >> a=rtcp-fb : RTCP 피드백 설정 (비트레이트 제어, 키프레임 요청 등)
  
    - 예시 : a=rtcp-fb:96 goog-remb

    - 예시 : a=rtcp-fb:96 ccm fir

  -----------------------------------------------
  [보안 및 연결 설정]
  -----------------------------------------------
  >> a=ice-ufrag / a=ice-pwd : ICE (Interactive Connectivity Establishment) 연결을 위한 인증 정보

    - 예시 : a=ice-ufrag:abc123

    - 예시 : a=ice-pwd:xyz456

  >> a=fingerprint : DTLS 인증서의 지문. 보안 연결을 위한 TLS 인증에 사용

    - 예시 : a=fingerprint:sha-256 12:34:56:...

  >> a=setup:active/passive/actpass : DTLS 연결 설정 방식. active는 연결을 시작하고, passive는 수신 대기

    - 예시 : a=setup:actpass

  -----------------------------------------------
  [미디어 방향 및 식별]
  -----------------------------------------------
  >> a=mid : 미디어 스트림 식별자. BUNDLE 에서 각 스트림을 구분하는 데 사용

    - 예시 : a=mid:audio

    - 예시 : a=mid:video

  >> a=sendrecv / a=recvonly / a=sendonly / a=inactive : 미디어 방향 설정. 예: sendrecv는 송수신 모두 가능

    - 예시 : a=sendrecv

  >> a=ssrc : RTP 스트림의 SSRC (Synchronization Source) 식별자

    - 예시 : a=ssrc:12345678 cname:stream1

  >> a=msid-semantic : MediaStream ID에 대한 의미 정의

    - 예시 : a=msid:stream1 track

    - 예시 : a=msid-semantic: WMS stream1

  -----------------------------------------------
  [코덱 및 포맷 정보]

  -----------------------------------------------
  [미디어 품질, 호환성, 성능 최적화에 매우 중요하며, opus, VP8, H264 같은 코덱을 사용할 때 fmtp 설정이 연결 품질에 큰 영향을 줄 수 있습니다]
  -----------------------------------------------
  >> a=framerate : 프레임레이트 정보

  >> max-fs, max-fr : 해상도 관련 힌트 (macroblock 기준)

  >> a=rtpmap : 코덱 ID 와 이름, 샘플링 레이트, 채널 수를 정의합니다 (payload type에 대한 코덱 매핑 / 코덱 이름, 샘플링 레이트, 채널 수)

    - 예시 : a=rtpmap:111 opus/48000/2
    - 예시 : a=rtpmap:96 VP8/90000
    - 의미 : 
       *) 111 : payload type
       *) opus : 코덱 이름
       *) 48000 : 샘플링 레이트 (Hz)
       *) 2 : 채널 수 (스테레오)

  >> a=fmtp : 코덱의 세부 설정을 정의합니다 (압축 방식, 오류 복원 등)

    - 예시 : a=fmtp:111 minptime=10;useinbandfec=1
    - 예시 : a=fmtp:98 profile-level-id=42e01f;packetization-mode=1
    - 의미 : 
       *) minptime=10: 최소 패킷 시간(ms)
       *) useinbandfec=1: 인밴드 FEC(Forward Error Correction) 사용

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[코덱 및 포맷 정보 추가 설명]
// --------------------------------------------------------------------------------------

  >> payloadType : RTP (Real-time Transport Protocol) 에서 각 미디어 스트림을 구별하는 식별 번호입니다

  >> payloadType 번호는 SDP 의 m= 라인과 a=rtpmap: 라인에서 사용됩니다

    - 예시 : m=video 9 UDP/TLS/RTP/SAVPF 96 97 98
    - 예시 : a=rtpmap:96 VP8/90000
    - 예시 : a=rtpmap:97 VP9/90000
    - 예시 : a=rtpmap:98 H264/900

  >> payloadType 범위 : 

    - 0~95 : 고정(static) RTP 페이로드 타입 - 0 : PCMU, 8 : PCMA, 3 : GSM 등
    
    - 96~127 : 동적(dynamic) RTP 페이로드 타입 - 96 : VP8, 97 : VP9, 98 : H264, 111 : Opus 등

    ------------------------------------------------------------
     Payload Type  |    코덱  |   설명
    ------------------------------------------------------------
          0        |   PCMU   | G.711 μ-law 오디오 코덱 (8kHz)
    ------------------------------------------------------------
          8        |   PCMA   | G.711 A-law 
    ------------------------------------------------------------
        96~127     | 동적 할당 |  VP8, VP9, H264 등 (비디오 코덱) / (96 이상이라고 해서 반드시 비디오 코덱은 아님 - Opus 오디오 코덱)
    ------------------------------------------------------------

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[WebRTC answer 응답에서 a=rtpmap 코덱 종류가 여러개가 내려오는 이유 정리]
// --------------------------------------------------------------------------------------

  >> WebRTC에서 a=rtpmap 라인에 여러 비디오 코덱이 함께 내려오는 이유는 미디어 협상 과정에서 클라이언트와 서버 (또는 피어 간) 이 사용할 수 있는 코덱 후보들을 나열하기 때문입니다 (정상적인 동작)

  >> 코덱 협상 (Codec Negotiation) : 

    - WebRTC 는 SDP (Session Description Protocol) 를 통해 미디어 스트림을 협상합니다. 이때 각 피어는 자신이 지원 가능한 코덱 목록을 SDP에 포함시킵니다

    - 예시 : a=rtpmap:97 VP9/90000 , a=rtpmap:98 H264/90000 값이 내려 온 경우 - 나는 VP9과 H264 둘 다 지원할 수 있어. 라는 의미입니다

  >> 우선순위 및 호환성 고려 : 

    - 브라우저나 앱은 특정 코덱을 우선적으로 사용하려고 할 수 있습니다 (예 : H264는 하드웨어 디코딩이 가능해서 모바일에서 선호됨)

    - 반면 VP9는 더 나은 압축률을 제공하지만 CPU 사용량이 높을 수 있습니다

    - 따라서 여러 코덱을 나열해두고, 상대 피어와 협상하여 공통으로 지원되는 최적의 코덱을 선택합니다

  >> Fallback을 위한 준비 : 

    - 만약 첫 번째 코덱(VP9)이 상대 피어에서 지원되지 않으면, 두 번째(H264)로 fallback할 수 있도록 준비하는 것입니다

  >> 실제 사용되는 코덱은 ? : 

    - SDP 의 m=video 라인과 a=rtpmap 라인을 함께 보면 어떤 코덱이 실제로 선택되었는지 알 수 있습니다

    - 응답 받은 프로토콜 예시 : 이 경우 97과 98이 후보이며, 실제로 선택된 코덱은 Answer SDP에서 첫 번째로 나열된 코덱이거나 a=fmtp 등의 추가 정보로 결정됩니다

      m=video 9 UDP/TLS/RTP/SAVPF 97 98
      a=rtpmap:97 VP9/90000
      a=rtpmap:98 H264/90000

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[RTCPeerConnection 정보 확인 시 WebRTC answer 응답에서 내려 준 정보와 다르게 코덱 정보가 표시 되는 이유 정리]
// --------------------------------------------------------------------------------------

  >> 브라우저가 코덱 협상에서 VP8을 선택했을 가능성 : 

    - SDP Answer에 여러 코덱이 포함되어 있어도, 브라우저는 자신이 선호하는 코덱을 선택해서 사용합니다.

    - 예를 들어 Chrome 은 기본적으로 VP8 을 우선시하는 경향이 있습니다.

    - 따라서 a=rtpmap:119 H264/90000이 있어도 실제로는 VP8이 선택될 수 있습니다.

  >> SDP Offer 와 Answer 간의 협상 결과 : 

    - 상대 피어가 H264를 제안했더라도, 로컬 피어가 VP8을 더 선호하면 VP8으로 협상이 완료될 수 있습니다.

    - m=video 라인의 payload type 순서나 a=fmtp 설정도 영향을 줍니다.

  >> pc.getReceivers()는 실제 디코딩 중인 코덱을 반영함 : 

    - 이 API 는 현재 사용 중인 코덱을 보여주므로, VP8이 출력되었다면 실제로 VP8로 디코딩되고 있다는 뜻입니다.

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[WebRTC 에서 특정 코덱만 사용하고 싶은 경우 정리]
// --------------------------------------------------------------------------------------

  >> JavaScript 에서 WebRTC 설정 시 RTCPeerConnection의 setCodecPreferences() 또는 SDP를 직접 수정하여 특정 코덱만 사용하도록 제한할 수 있습니다

  >> 소스 코드 예시 : 

    const transceiver = pc.addTransceiver('video');
    const codecs = RTCRtpSender.getCapabilities('video').codecs;
    const preferred = codecs.filter(codec => codec.mimeType === 'video/H264');
    transceiver.setCodecPreferences(preferred);

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[참고 사이트]
// --------------------------------------------------------------------------------------

[자바스크립트 AWS WebRTC 실시간 동영상 재생 수행]

https://blog.naver.com/kkh0977/223170500993?trackingCode=blog_bloghome_searchlist


[Aws Kvs WebRTC 실시간 영상 재생 관련 구성 요소 및 용어 정리]

https://blog.naver.com/kkh0977/223858189791


[Aws KVS WebRTC 채널 생성 및 삭제에 관한 요금 정책 정리]

https://blog.naver.com/kkh0977/223995447546


[AWS] [Lambda] 런타임 Python 3.13 - boto3 모듈 사용해 특정 사물 인증서에 부여 된 policy 정책 JSON 정보 확인

https://blog.naver.com/kkh0977/223984301815?trackingCode=blog_bloghome_searchlist


[업무 이슈] AWS WebRTC 실시간 비디오 재생 시 Client 클라이언트 연결 접속 및 해제 상태 확인 이슈

https://blog.naver.com/kkh0977/223966952222


[업무 이슈] 안드로이드 웹뷰에서 AWS WebRTC 웹 뷰어 영상 재생 중 앱 화면 종료 시 마스터에서 뷰어 close 상태가 늦게 감지 되는 이슈

https://blog.naver.com/kkh0977/224020488268


[Aws] WebRTC Viewer 뷰어 기기에서 실시간 디바이스 기기 해상도 확인 로직

https://blog.naver.com/kkh0977/224024795533

// --------------------------------------------------------------------------------------
 
728x90
반응형
Comments