투케이2K

311. (TWOK/ERROR) [Android] Aws Kvs HLS getHLSStreamingSessionURL 호출 시 UnknownOperationException 에러 본문

투케이2K 에러관리

311. (TWOK/ERROR) [Android] Aws Kvs HLS getHLSStreamingSessionURL 호출 시 UnknownOperationException 에러

투케이2K 2025. 5. 23. 19:21

[환경 설정 및 설명]

프로그램 : AndroidStudio

설 명 : [Android] Aws Kvs HLS getHLSStreamingSessionURL 호출 시 UnknownOperationException 에러

 

[설 명]

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

- 제목 : [Android] Aws Kvs HLS getHLSStreamingSessionURL 호출 시 UnknownOperationException 에러

- 테스트 환경 : 삼성 갤럭시 스마트폰 / 안드로이드 / Android

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





--------------------------------------------------------------------------
[에러 원인]
--------------------------------------------------------------------------

1. 안드로이드에서 Aws Kvs HLS 실시간 스트리밍 URL 호출 시 잘못 된 DataEndpoint 데이터 엔드포인트 사용으로 UnknownOperationException 에러 발생 이슈


2. 안드로이드 Aws 라이브러리 사용 의존성 모듈 : 

implementation 'com.amazonaws:aws-android-sdk-kms:2.57.0'
implementation 'com.amazonaws:aws-android-sdk-s3:2.57.0'
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'


3. 에러 발생 로그 전문 : 

W///===========//: ======================================================================
I/: [LOG :: CLASS PLACE :: com.example.javaproject.C_Module.C_Aws_Kvs_Module$6.run(C_Aws_Kvs_Module.java:1986)]
I/: ----------------------------------------------------
I/: [LOG :: DESCRIPTION :: C_Aws_Kvs_Module :: getKvsHlsStreamPlayUrl :: [재생 정보] :: KVS HLS 스트리밍 재생 URL 확인 HTTP 응답 결과]
I/: ----------------------------------------------------
I/: [LOG :: responseCode :: 200]
I/: ----------------------------------------------------
I/: [LOG :: responseData :: {"Output":{"__type":"com.amazon.coral.service#UnknownOperationException"},"Version":"1.0"}]
W///===========//: ======================================================================

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





--------------------------------------------------------------------------
[해결 방법]
--------------------------------------------------------------------------

1. Aws Kvs HLS GetDataEndpointRequest 데이터 엔트포인트 요청 구문 수정 (잘못 된 API Name 사용)

    >> AS IS : 

    GetDataEndpointRequest dataEndPointRequest = new GetDataEndpointRequest()
        .withStreamName(STREAM_NAME) // 스트림 이름 설정
        .withAPIName(APIName.PUT_MEDIA); // TODO API 이름 설정 (PUT_MEDIA, GET_MEDIA 등)


    >> TO BE : 

    GetDataEndpointRequest dataEndPointRequest = new GetDataEndpointRequest()
        .withStreamName(STREAM_NAME) // 스트림 이름 설정
        .withAPIName(APIName.GET_HLS_STREAMING_SESSION_URL); // TODO API 이름 설정 (GET_HLS_STREAMING_SESSION_URL)


2. 얻어온 DataEndpoint 사용해 AWS4Signer 인증 서명 후 okhttp API 호출 수행

    >> AWS4Signer 인증 서명 코드 : 

    // --------------------------------------------------------
    // TODO [Http 요청에 필요한 Body 선언]
    // --------------------------------------------------------
    JSONObject payload = new JSONObject();
    payload.put("StreamName", STREAM_NAME);
    payload.put("PlaybackMode", "LIVE");

    byte[] contentBytes = payload.toString().getBytes("UTF-8");

    RequestBody requestBody = RequestBody.create(payload.toString(), MediaType.parse("application/json"));


    // --------------------------------------------------------
    // TODO [AWS Signature V4 서명 적용]
    // --------------------------------------------------------
    // import com.amazonaws.DefaultRequest;
    // import com.amazonaws.Request;
    // --------------------------------------------------------
    // import okhttp3.Request;
    // import okhttp3.RequestBody;
    // import okhttp3.Response;
    // import okio.BufferedSink;
    // --------------------------------------------------------
    Request<?> signRequest = new DefaultRequest<>("kinesisvideo");

    signRequest.setHttpMethod(HttpMethodName.POST);
    signRequest.setEndpoint(new URI(dataEndpoint)); // TODO [DataEndpoint 적용]
    signRequest.setEncodedResourcePath("/getHLSStreamingSessionURL"); // TODO [Path 설정 : 해당 값 추가 중요]

    signRequest.addHeader("Host", new URI(dataEndpoint).getHost()); // TODO [호스트 지정]
    signRequest.addHeader("Content-Length", String.valueOf(contentBytes.length)); // TODO [Body Length]
    signRequest.addHeader("Content-Type", "application/json"); // TODO [Body 에서 지정한 MediaType 타입]

    signRequest.setContent(new ByteArrayInputStream(contentBytes)); // TODO [Body Data]
    // --------------------------------------------------------
    AWS4Signer signer = new AWS4Signer();

    signer.setServiceName("kinesisvideo");
    signer.setRegionName(REGION);

    signer.sign(signRequest, credentials); // TODO [Sign 인증 수행]
    // --------------------------------------------------------


    >> ok http 호출 코드 : 

    // --------------------------------------------------------
    // TODO [서명된 헤더들을 okhttp 헤더에 반영]
    // --------------------------------------------------------
    Headers.Builder okHttpHeaders = new Headers.Builder();
    for (Map.Entry<String, String> entry : signRequest.getHeaders().entrySet()) {
        okHttpHeaders.add(entry.getKey(), entry.getValue());
        S_Log.w("KWON_TWOK", ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Okhttp Header Insert :: " + String.valueOf(entry.getKey()) + " :: " + String.valueOf(entry.getValue()) + " >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    }


    // --------------------------------------------------------
    // TODO [okhttp Request 빌더 생성]
    // --------------------------------------------------------
    String streamUrl = dataEndpoint + "/getHLSStreamingSessionURL";

    okhttp3.Request request = new okhttp3.Request.Builder()
            .url(streamUrl) // TODO [최종 요청 URL]
            .headers(okHttpHeaders.build()) // TODO [Signature V4 인증 헤더 값 추가]
            .post(requestBody) // TODO [실시간 스트리밍 데이터 업로드 Body 추가 : writeTo]
            .build();


    // --------------------------------------------------------
    // TODO [OkHttp 클라이언트 설정 (HTTP/2 지원)]
    // --------------------------------------------------------
    OkHttpClient client = new OkHttpClient.Builder()
            .protocols(Arrays.asList(Protocol.HTTP_2, Protocol.HTTP_1_1))
            .retryOnConnectionFailure(true)
            .build();


    // --------------------------------------------------------
    // TODO [HTTP 요청 및 응답 확인]
    // --------------------------------------------------------
    try (Response response = client.newCall(request).execute()) {
    } catch (IOException e) {
        e.printStackTrace();
    }

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





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

[Aws Kvs HSL 비디오 스트림 녹화 영상 관련 학습 정리]

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


[Aws KVS HLS MKV 파일 설명 - PutMedia API 스트리밍 업로드 시 전송 파일]

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


[Aws SigV4 인증 및 서명 프로토콜 설명 - AWS4Signer API 호출 시 서명 사용]

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


[Aws KVS PutMedia 비디오 스트림 전송 API 설명 정리]

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


[안드로이드 Raw 폴더에 저장 된 MKV 형식 파일 Aws Kvs HLS 비디오 스트리밍 업로드 수행]

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


[안드로이드 Aws Kvs HLS 비디오 스트리밍 putMedia 호출 시 필요한 Signature V4 서명 방법]

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

--------------------------------------------------------------------------
 
반응형
Comments