Notice
Recent Posts
Recent Comments
Link
투케이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:23728x90
[개발 환경 설정]
개발 환경 : 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
반응형
'Aws (Amazon)' 카테고리의 다른 글
Comments
