투케이2K

143. (TWOK/LOGIC) [android] Aws Kvs HLS PutMedia 스트리밍 동영상 업로드 로직 정리 - DataEndpoint, MKV , AWS4Signer 본문

투케이2K 로직정리

143. (TWOK/LOGIC) [android] Aws Kvs HLS PutMedia 스트리밍 동영상 업로드 로직 정리 - DataEndpoint, MKV , AWS4Signer

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

[로직 정리]

정리 로직 : Mobile

상태 : [android] Aws Kvs HLS PutMedia 스트리밍 동영상 업로드 로직 정리 - DataEndpoint, MKV , AWS4Signer

 

[설 명]

// --------------------------------------------------------------------------------------
[사전) 설정 및 정보 확인 사항]
// --------------------------------------------------------------------------------------

1. Aws Kinesis Video Streams (Kvs) 인프라 구축 필요 (KVS 권한도 할당 받기 필요)


2. Aws KVS 스트림 생성 필요


3. Aws Kvs HLS 에 동영상 업로드를 위한 MKV 형식 파일 준비


4. 안드로이드 Aws Kvs HLS 에 동영상 업로드를 위한 의존성 부여

    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'


5. 안드로이드 Aws Kvs HLS 동영상 업로드를 위한 OKHTTP 의존성 부여

    implementation("com.squareup.okhttp3:okhttp:4.9.0")
    implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0'

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






// --------------------------------------------------------------------------------------
[로직 설명]
// --------------------------------------------------------------------------------------

1. IAM 계정에서 생성한 AccessKey , SecretKey 를 사용해 AWSCredentials 초기화 수행

  AWSCredentials credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);


2. AWSCredentials 를 사용해 AWSKinesisVideo 객체 초기화 및 리전 지정 수행

    AWSKinesisVideo awsKinesisVideoClient = new AWSKinesisVideoClient(credentials);

    if (C_Util.stringNotNull(REGION) == true){ // TODO [리젼 정보 설정]
        //awsKinesisVideoClient.setRegion(Region.getRegion("ap-northeast-1"));
        awsKinesisVideoClient.setRegion(Region.getRegion(REGION));
    }


3. GetDataEndpointRequest 객체 초기화 및 PUT 미디어 호출 시 필요한 데이터 엔드포인트 정보 얻기 수행

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

    GetDataEndpointResult result = awsKinesisVideoClient.getDataEndpoint(dataEndPointRequest);

    String dataEndpoint  = result.getDataEndpoint();


4. 안드로이드 Raw 폴더에 저장 된 MKV 파일 Byte 읽기 수행

    byte[] rawMkvByte = C_App.rawMkvReadByte((Activity) mContext, RAW_MKV_NAME);


5. okhttp 요청을 위한 Body 선언 및 writeTo 사용해 스트밍 데이터 전송 단위 처리 수행

  >> 참고 : PutMedia 호출 이후 스트리밍 지속 호출 가능 한 세션이 맺어지고, 스트리밍 동영상을 일정 크기로 나눠서 지속 전송 수행

  RequestBody requestBody = new RequestBody() {
        @Override
        public MediaType contentType() {
            return MediaType.parse("application/octet-stream");
        }

        @Override
        public void writeTo(BufferedSink sink) throws IOException {

            try (InputStream fis = new ByteArrayInputStream(rawMkvByte)) {

                byte[] buffer = new byte[4096]; // TODO [4KB 단위로 스트리밍 데이터 전송]
                //byte[] buffer = new byte[2048]; // TODO [2KB 단위로 스트리밍 데이터 전송]

                int len;

                while ((len = fis.read(buffer)) != -1) {                
                    S_Log.w("KWON_TWOK", ">>>>>>>>>> KVS HLS 스트리밍 데이터 Body Write 수행 :: " + String.valueOf(len) + " >>>>>>>>>>");

                    sink.write(buffer, 0, len);
                    sink.flush();
                }
            }
        }
    };


6. okhttp 를 사용해 putMedia 호출 시 AWS 로 부터 인증 받은 Signature V4 서명이 필요하므로 서명 요청 수행

  >> 참고 : Signature V4 서명 요청 시 putMedia API 호출 시 추가 필요한 Authorization 값을 얻을 수 있습니다

    // --------------------------------------------------------
    Request<?> signRequest = new DefaultRequest<>("kinesisvideo");

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

    signRequest.addHeader("Host", new URI(dataEndpoint).getHost()); // TODO [호스트 지정]
    signRequest.addHeader("x-amzn-stream-name", STREAM_NAME); // TODO [스트림 명칭]
    signRequest.addHeader("x-amzn-fragment-timecode-type", "ABSOLUTE"); // TODO [타임 코드]

    signRequest.addHeader("Content-Type", "application/octet-stream"); // TODO [Body 에서 지정한 MediaType 타입]

    signRequest.setContent(new StringInputStream("")); // TODO [Empty Body 지정 필요]
    // --------------------------------------------------------
    AWS4Signer signer = new AWS4Signer();

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

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


7. AWS4Signer 서명 완료 된 값을 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()) + " >>>>>>>>>>");
    }


8. putMedia API 호출 URL 선언 및 okhttp API 호출 수행 실시

    String putMediaUrl = dataEndpoint + "/putMedia";

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

    OkHttpClient client = new OkHttpClient.Builder()
        .protocols(Arrays.asList(Protocol.HTTP_2, Protocol.HTTP_1_1))
        .retryOnConnectionFailure(true)
        .build();

    try (Response response = client.newCall(request).execute()) {

    } catch (IOException e) {
        e.printStackTrace();
    }


9. AWS 콘솔 사이트에서 업로드한 스트리밍 영상이 정상적으로 표시 되는지 확인


10. 참고 : 안드로이드 카메라 촬영 및 MP4 파일을 MKV 파일로 변환 방법

  >> 안드로이드 카메라를 사용해 실시간 영상 촬영 및 MP4 파일로 외부 저장소에 저장 수행 (파일 저장 권한 필요)

  >> FFMpecg 을 사용해 저장 된 MP4 파일을 MKV 형식으로 트랜스 코딩 수행

  >> 변경 된 MKV 파일을 AWS HLS 스트리밍에 업로드 수행

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






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

[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