투케이2K

186. (TWOK/WORK) [업무 이슈] 안드로이드 뷰어 WebRTC 재생 시 실시간 음성 통화 기능 미동작 관련 이슈 - offer sendOnly 이슈 본문

투케이2K 업무정리

186. (TWOK/WORK) [업무 이슈] 안드로이드 뷰어 WebRTC 재생 시 실시간 음성 통화 기능 미동작 관련 이슈 - offer sendOnly 이슈

투케이2K 2025. 10. 22. 19:27
728x90

[제 목]

[업무 이슈] 안드로이드 뷰어 WebRTC 재생 시 실시간 음성 통화 기능 미동작 관련 이슈 - offer sendOnly 이슈

 

[내 용]

------------------------------------------------------------------------------
[개발 및 테스트 환경]
------------------------------------------------------------------------------

- 제 목 : [업무 이슈] 안드로이드 뷰어 WebRTC 재생 시 실시간 음성 통화 기능 미동작 관련 이슈 - offer sendOnly 이슈


- 테스트 환경 : Mobile / Samsung / Android / AWS / WebRTC / Viewer


- 사전) AWS KVS WebRTC 설명 : 

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

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

  >> WebRTC 주요 용어 : 

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

  >> WebRTC [ICE] 연결 형태 : 

    - Relayed Address : TURN 서버가 패킷 릴레이를 위해 할당하는 주소
    - Server Reflexive Address : NAT 가 매핑한 클라이언트의 공인망 (Public IP, Port)
    - Local Address : 클라이언트의 사설주소 (Private IP, Port)

  >> WebRTC STUN 및 TURN 서버 설명 : 

    - (같은 와이파이 망) STUN 서버는 HOST 를 거쳐 >> Server Reflexive Address 만을 응답하지만,
      (릴레이서버 사용) TURN 서버는 Relayed Address와 Server Reflexive Address 를 모두 응답한다
    - STUN, TURN 서버를 이용해 SDP Answer IP주소 를 취득 >> RTCPeerConnection Remote 연결 수행

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

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

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

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


- 사전) 안드로이드 Build.gradle 설정 사항 : 

    android {

        // [컴파일 버전]
        compileSdk 34

        // [Config 셋팅]
        defaultConfig {
            // ----------------------------
            applicationId "com.example.javaproject" // 앱 아이디
            // ----------------------------
            versionCode 1 // 빌드 버전
            // ----------------------------
            versionName '1.0.1' // 빌드 네임
            // ----------------------------
            minSdk 24 // 최소 빌드 버전
            // ----------------------------
            targetSdk 34 // TODO 타겟 빌드 버전
            // ----------------------------
        }

        // [컴파일 자바 버전 지정]
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }

        // [아파치 http 사용 설정]
        useLibrary ('org.apache.http.legacy')
    }

    dependencies {

        implementation 'com.amazonaws:aws-android-sdk-iot:2.57.0'
        implementation 'com.amazonaws:aws-android-sdk-mobile-client:2.57.0'

        implementation 'com.amazonaws:aws-android-sdk-kinesisvideo:2.57.0'
    
        //implementation files('libs/google-webrtc-1.0.32006.aar')
        implementation 'com.infobip:google-webrtc:1.0.0035529'
    }

------------------------------------------------------------------------------





------------------------------------------------------------------------------
[이슈 사항]

------------------------------------------------------------------------------

1. 안드로이드에서 AWS KVS 뷰어 역할로 WebRTC 비디오 재생 수행 시 실시간 양방향 음성 통화 기능이 미동작 하는 이슈 문의


2. 참고 사항 : 

  >> 안드로이드 기기를 제외한 자바스크립트 웹 및 IOS 에서는 정상 실시간 양방향 통화 기능 동작

  >> 디바이스 기기는 스트림 전송 시 비디오 및 오디오 스트림 동시 전송하고 있는 것 확인

------------------------------------------------------------------------------





------------------------------------------------------------------------------
[원인 파악 및 증상 재현]
------------------------------------------------------------------------------

1. [Device] 디바이스 기기에서 음성 출력 스피커 고장 여부 확인


2. [Device] 디바이스 기기에서 음소거 설정이 되어 있지 않나 확인


3. [Device] 휴대폰 단말기에서 소리 볼륨 설정 (미디어) 이 모두 정상적으로 활성화 되어 있는지 확인


4. [Device] 휴대폰 단말기 녹음 앱을 통한 정상 마이크 동작 상태 점검


5. [App] 안드로이드에서 오디오 및 카메라 권한이 정상적으로 부여되어 있는지 확인

  >> 권한 : RECORD_AUDIO , CAMERA


6. [App] 안드로이드에서 VideoEncoderFactory , VideoDecoderFactory 를 사용해 지원 되는 코덱 종류가 있는 지 확인


7. [App] 안드로이드 WebRTC createOffer 시 설정 되는 MediaConstraints 값 Video , Audio 수신 설정 여부 확인

    MediaConstraints constraints = new MediaConstraints();
    constraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveAudio", "true"));
    constraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveVideo", "true"));


8. [App] 안드로이드 WebRTC Offer 전송 SDP 전문 확인 및 정상적으로 비디오 및 오디오 사용 PT 값이 전달 된 것 확인

  >> m=video 9 UDP/TLS/RTP/SAVPF 127
     a=rtpmap:127 H264/90000
     a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f

     m=audio 9 UDP/TLS/RTP/SAVPF 0
     a=rtpmap:0 PCMU/8000


9. [App] 안드로이드 WebRTC Offer 전송 SDP 전문 확인 및 비디오 스트림 수신 여부 값 확인 (이슈 발견)

  >> Viewer To Master Send Offer Video : a=sendonly : 마스터가 송신한 값을 받아서 출력만 한다

     m=video 9 UDP/TLS/RTP/SAVPF 127
     ......
     a=recvonly
  
------------------------------------------------------------------------------





------------------------------------------------------------------------------
[조치 내용]
------------------------------------------------------------------------------

1. 안드로이드에서 createOffer 및 WebSocket Send Offer 전송 전 RtpTransceiver.RtpTransceiverInit 초기화 값을 커스텀으로 설정해 비디오는 양방향 송수신이 가능하도록 설정

    RtpTransceiver.RtpTransceiverInit recvOnly = new RtpTransceiver.RtpTransceiverInit(RtpTransceiver.RtpTransceiverDirection.RECV_ONLY);
    RtpTransceiver.RtpTransceiverInit sendRecv = new RtpTransceiver.RtpTransceiverInit(RtpTransceiver.RtpTransceiverDirection.SEND_RECV);

    peerConnection.addTransceiver(MediaStreamTrack.MediaType.MEDIA_TYPE_VIDEO, sendRecv); // 주고, 받는다
    peerConnection.addTransceiver(MediaStreamTrack.MediaType.MEDIA_TYPE_AUDIO, recvOnly); // 받기만 한다


2. 안드로이드에서 WebSocket Send Offer 전송 시 SDP 전문 다시 확인

  >> Viewer To Master Send Offer Video : a=sendrecv

     m=video 9 UDP/TLS/RTP/SAVPF 127
     ......
     a=sendrecv


3. SDP Answer 응답을 받은 이후 안드로이드 마이크에 입력 된 스트림 값이 기기에서 정상 출력 되는 것 확인

------------------------------------------------------------------------------





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

[업무 이슈] 안드로이드 슬러시 (특수 문자) 포함 JSON 정보 전달 시 자동으로 이스케이프 문자 처리되어 WIFI 접속 문제 발생 이슈

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


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

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


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

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


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

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


[Aws Kinesis Video Streams] WebRTC SDP 협상 과정 프로세스 정리 정리

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


[Aws Kinesis Video Streams] WebRTC getSignalingChannelEndpoint HTTPS, WSS 사용 범위 정리

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


[유틸 파일] unescapeString : 수동 이스케이프 문자 원복 수행

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

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