IVS Android Broadcast SDK 시작하기 | 저지연 스트리밍 - Amazon IVS

IVS Android Broadcast SDK 시작하기 | 저지연 스트리밍

이 문서에서는 Amazon IVS Low-Latency Streaming Android Broadcast SDK 시작하기와 관련된 단계를 안내합니다.

라이브러리 설치

Amazon 개발 환경에 Amazon IVS Android 브로드캐스트 라이브러리를 추가하려면 여기에 나온 것처럼(최신 버전의 Amazon IVS Broadcast SDK용) 라이브러리를 모듈의 build.gradle 파일에 추가합니다.

repositories { mavenCentral() } dependencies { implementation 'com.amazonaws:ivs-broadcast:1.25.0' }

또는 SDK를 수동으로 설치하려면 다음 위치에서 최신 버전을 다운로드하세요.

디버그 기호와 함께 SDK 사용

디버그 기호가 포함된 Android Broadcast SDK 버전도 게시합니다. IVS Broadcast SDK에서 충돌이 발생하는 경우(즉, libbroadcastcore.so) 이 버전을 사용하여 Firebase Crashlytics의 디버그 보고서(스택 트레이스) 품질을 개선할 수 있습니다. 이러한 충돌을 IVS SDK 팀에 보고하는 경우 스택 추적 품질이 좋을수록 문제를 쉽게 수정할 수 있습니다.

이 SDK 버전을 사용하려면 Gradle 빌드 파일에 다음을 입력합니다.

implementation "com.amazonaws:ivs-broadcast:$version:unstripped@aar"

다음 대신에 위의 줄을 사용합니다.

implementation "com.amazonaws:ivs-broadcast:$version@aar"

Firebase Crashlytics에 기호 업로드

Firebase Crashlytics에 Gradle 빌드 파일이 설정되어 있는지 확인합니다. Google의 지침을 따릅니다.

https://firebase.google.com/docs/crashlytics/ndk-reports

종속성으로 com.google.firebase:firebase-crashlytics-ndk를 포함해야 합니다.

릴리스할 앱을 빌드할 때 Firebase Crashlytics 플러그인을 통해 기호가 자동으로 업로드되어야 합니다. 수동으로 기호를 업로드하려면 다음 중 하나를 실행하세요.

gradle uploadCrashlyticsSymbolFileRelease
./gradlew uploadCrashlyticsSymbolFileRelease

(기호를 자동 및 수동으로 두 번 업로드해도 문제가 되지 않습니다.)

릴리스 .apk가 커지지 않도록 방지

릴리스 .apk 파일을 패키징하기 전에 Android Gradle 플러그인에서는 공유 라이브러리(IVS Broadcast SDK의 libbroadcastcore.so 라이브러리 포함)에서 디버그 정보를 자동으로 제거하려고 시도합니다. 그러나 가끔은 이 상황이 발생하지 않습니다. 따라서 .apk 파일이 커질 수 있으며, 디버그 기호를 제거할 수 없고 .so 파일을 그대로 패키징하고 있다는 Android Gradle 플러그인의 경고 메시지가 표시될 수 있습니다. 이 상황이 발생하면 다음과 같은 작업을 수행합니다.

  • Android NDK를 설치합니다. 최신 버전이 작동합니다.

  • 애플리케이션의 build.gradle 파일에 ndkVersion <your_installed_ndk_version_number>를 추가합니다. 애플리케이션 자체에 네이티브 코드가 없더라도 이 작업을 수행합니다.

자세한 내용은 이 문제 보고서를 참조하세요.

이벤트 리스너 생성

이벤트 리스너를 설정하면 상태 업데이트, 디바이스 변경 알림, 오류 및 세션 오디오 정보를 수신할 수 있습니다.

BroadcastSession.Listener broadcastListener = new BroadcastSession.Listener() { @Override public void onStateChanged(@NonNull BroadcastSession.State state) { Log.d(TAG, "State=" + state); } @Override public void onError(@NonNull BroadcastException exception) { Log.e(TAG, "Exception: " + exception); } };

권한 요청

앱에서 사용자의 카메라 및 마이크에 액세스할 수 있는 권한을 요청해야 합니다. (이는 Amazon IVS에만 국한되지 않으며 카메라와 마이크에 액세스해야 하는 모든 애플리케이션에 필요합니다.)

여기에서는 사용자가 부여된 권한이 이미 있는지 확인하고, 그렇지 않으면 권한을 요청합니다.

final String[] requiredPermissions = { Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO }; for (String permission : requiredPermissions) { if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { // If any permissions are missing we want to just request them all. ActivityCompat.requestPermissions(this, requiredPermissions, 0x100); break; } }

여기서는 다음과 같은 사용자 응답을 받습니다.

@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 0x100) { for (int result : grantResults) { if (result == PackageManager.PERMISSION_DENIED) { return; } } setupBroadcastSession(); } }

브로드캐스트 세션 생성

브로드 캐스트 인터페이스는 com.amazonaws.ivs.broadcast.BroadcastSession입니다. 이 인터페이스를 아래와 같이 사전 설정으로 초기화합니다. 초기화 중 오류(예: 코덱 구성 실패)가 발생하는 경우 BroadcastListener에서 오류 메시지가 표시되고 broadcastSession.isReadyfalse가 됩니다.

중요: Amazon IVS Broadcast SDK for Android에 대한 모든 직접 호출은 SDK가 인스턴스화된 스레드에서 수행해야 합니다. 다른 스레드에서 호출하면 SDK가 치명적인 오류를 발생시키고 브로드캐스트가 중지됩니다.

// Create a broadcast-session instance and sign up to receive broadcast // events and errors. Context ctx = getApplicationContext(); broadcastSession = new BroadcastSession(ctx, broadcastListener, Presets.Configuration.STANDARD_PORTRAIT, Presets.Devices.FRONT_CAMERA(ctx));

브로드캐스트 세션 생성(고급 버전) 섹션도 참조하세요.

미리 보기를 위한 ImagePreviewView 설정

활성 카메라 디바이스의 미리 보기를 표시하려면 보기 계층 구조에 디바이스의 미리 보기 ImagePreviewView를 추가합니다.

// awaitDeviceChanges will fire on the main thread after all pending devices // attachments have been completed broadcastSession.awaitDeviceChanges(() -> { for(Device device: session.listAttachedDevices()) { // Find the camera we attached earlier if(device.getDescriptor().type == Device.Descriptor.DeviceType.CAMERA) { LinearLayout previewHolder = findViewById(R.id.previewHolder); ImagePreviewView preview = ((ImageDevice)device).getPreviewView(); preview.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); previewHolder.addView(preview); } } });

브로드캐스트 시작

GetChannel 작업의 ingestEndpoint 응답 필드에서 수신하는 호스트 이름은 앞에 rtmps://가 붙고 뒤에 /app가 붙습니다. 전체 URL은 rtmps://{{ ingestEndpoint }}/app 형식이어야 합니다.

broadcastSession.start(IVS_RTMPS_URL, IVS_STREAMKEY);

Android Broadcast SDK는 RTMPS 수집만 지원하며 안전하지 않은 RTMP 수집은 지원하지 않습니다.

브로드캐스트 시작

broadcastSession.stop();

브로드캐스트 세션 해제

브로드캐스트 세션이 더 이상 사용되지 않는 경우 broadcastSession.release() 메서드를 호출하여 라이브러리에서 사용하는 리소스를 해제해야 합니다.

@Override protected void onDestroy() { super.onDestroy(); previewHolder.removeAllViews(); broadcastSession.release(); }