Notice
Recent Posts
Recent Comments
Link
투케이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
// --------------------------------------------------------------------------------------
반응형
'투케이2K 로직정리' 카테고리의 다른 글
Comments