

# IVS Android Broadcast SDK 시작하기 \$1 저지연 스트리밍
<a name="broadcast-android-getting-started"></a>

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

## 라이브러리 설치
<a name="broadcast-android-install"></a>

Android 개발 환경에 Amazon IVS Android 브로드캐스트 라이브러리를 추가하려면 여기에 표시된 대로 모듈의 `build.gradle` 파일에 라이브러리를 추가합니다(최신 버전의 Amazon IVS broadcast SDK의 경우).

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

또는 SDK를 수동으로 설치하려면 다음 위치에서 최신 버전을 다운로드하세요.
+ [https://search.maven.org/artifact/com.amazonaws/ivs-broadcast](https://search.maven.org/artifact/com.amazonaws/ivs-broadcast)

## 디버그 기호와 함께 SDK 사용
<a name="broadcast-android-using-debug-symbols-ll"></a>

디버그 기호가 포함된 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에 기호 업로드
<a name="android-debug-symbols-ll-firebase-crashlytics"></a>

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

[https://firebase.google.com/docs/crashlytics/ndk-reports](https://firebase.google.com/docs/crashlytics/ndk-reports)

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

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

```
gradle uploadCrashlyticsSymbolFileRelease
```

```
./gradlew uploadCrashlyticsSymbolFileRelease
```

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

### 릴리스 .apk가 커지지 않도록 방지
<a name="android-debug-symbols-ll-sizing-apk"></a>

릴리스 `.apk` 파일을 패키징하기 전에 Android Gradle 플러그인에서는 공유 라이브러리(IVS Broadcast SDK의 `libbroadcastcore.so` 라이브러리 포함)에서 디버그 정보를 자동으로 제거하려고 시도합니다. 그러나 가끔은 이 상황이 발생하지 않습니다. 따라서 `.apk` 파일이 커질 수 있으며, 디버그 기호를 제거할 수 없고 `.so` 파일을 그대로 패키징하고 있다는 Android Gradle 플러그인의 경고 메시지가 표시될 수 있습니다. 이 상황이 발생하면 다음과 같은 작업을 수행합니다.
+ Android NDK를 설치합니다. 최신 버전이 작동합니다.
+ 애플리케이션의 `build.gradle` 파일에 `ndkVersion <your_installed_ndk_version_number>`를 추가합니다. 애플리케이션 자체에 네이티브 코드가 없더라도 이 작업을 수행합니다.

자세한 내용은 이 [문제 보고서](https://issuetracker.google.com/issues/353554169)를 참조하세요.

## 이벤트 리스너 생성
<a name="broadcast-android-create-event-listener"></a>

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

```
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);
    }
};
```

## 권한 요청
<a name="broadcast-android-permissions"></a>

앱에서 사용자의 카메라 및 마이크에 액세스할 수 있는 권한을 요청해야 합니다. (이는 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();
    }
}
```

## 브로드캐스트 세션 생성
<a name="broadcast-android-create-session"></a>

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

**중요:** 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));
```

[브로드캐스트 세션 생성(고급 버전)](broadcast-android-use-cases.md#broadcast-android-create-session-advanced) 섹션도 참조하세요.

## 미리 보기를 위한 ImagePreviewView 설정
<a name="broadcast-android-set-imagepreviewview"></a>

활성 카메라 디바이스의 미리 보기를 표시하려면 보기 계층 구조에 디바이스의 미리 보기 `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);
        }
    }
});
```

## 브로드캐스트 시작
<a name="broadcast-android-start"></a>

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

```
broadcastSession.start(IVS_RTMPS_URL, IVS_STREAMKEY);
```

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

## 브로드캐스트 시작
<a name="broadcast-android-stop"></a>

```
broadcastSession.stop();
```

## 브로드캐스트 세션 해제
<a name="broadcast-android-release-session"></a>

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

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