고급 사용 사례 - Amazon Interactive Video Service

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

고급 사용 사례

여기서는 몇 가지 고급 사용 사례를 제공합니다. 위의 기본 설정으로 시작하고 여기에서 계속합니다.

브로드캐스트 구성 생성

여기서는 두 개의 비디오 소스를 믹서에 바인딩할 수 있도록 두 개의 믹서 슬롯이 있는 사용자 지정 구성을 생성합니다. 하나(custom)는 전체 화면이고 다른 슬롯(camera) 뒤에 배치되며, 다른 슬롯은 더 작고 오른쪽 맨 아래에 있습니다. custom 슬롯의 경우 위치, 크기 또는 가로 세로 비율 모드를 설정하지 않습니다. 이러한 파라미터를 설정하지 않으므로 슬롯에서는 크기 및 위치에 비디오 설정을 사용합니다.

BroadcastConfiguration config = BroadcastConfiguration.with($ -> { $.audio.setBitrate(128_000); $.video.setMaxBitrate(3_500_000); $.video.setMinBitrate(500_000); $.video.setInitialBitrate(1_500_000); $.video.setSize(1280, 720); $.mixer.slots = new BroadcastConfiguration.Mixer.Slot[] { BroadcastConfiguration.Mixer.Slot.with(slot -> { // Do not automatically bind to a source slot.setPreferredAudioInput( Device.Descriptor.DeviceType.UNKNOWN); // Bind to user image if unbound slot.setPreferredVideoInput( Device.Descriptor.DeviceType.USER_IMAGE); slot.setName("custom"); return slot; }), BroadcastConfiguration.Mixer.Slot.with(slot -> { slot.setzIndex(1); slot.setAspect(BroadcastConfiguration.AspectMode.FILL); slot.setSize(300, 300); slot.setPosition($.video.getSize().x - 350, $.video.getSize().y - 350); slot.setName("camera"); return slot; }) }; return $; });

브로드캐스트 세션 생성(고급 버전)

기본 예제에서 했던 것처럼 BroadcastSession을 생성하지만, 여기서는 사용자 지정 구성을 제공합니다. 또한 디바이스를 수동으로 추가할 것이므로 디바이스 배열에 null을 입력합니다.

// Create a broadcast-session instance and sign up to receive broadcast // events and errors. Context ctx = getApplicationContext(); broadcastSession = new BroadcastSession(ctx, broadcastListener, config, // The configuration we created above null); // We’ll manually attach devices after

카메라 디바이스 반복 및 연결

여기서는 SDK가 감지한 입력 디바이스를 반복합니다. Android 7(Nougat)에서는 이 경우 기본 마이크 디바이스만 반환됩니다. 이 Android 버전에서 Amazon IVS 브로드캐스트 SDK가 기본이 아닌 디바이스 선택을 지원하지 않기 때문입니다.

사용할 디바이스를 찾으면 attachDevice를 호출하여 연결합니다. 입력 디바이스 연결이 완료되면 기본 스레드에서 Lambda 함수가 호출됩니다. 실패할 경우 리스너에서 오류가 표시됩니다.

for(Device.Descriptor desc: BroadcastSession.listAvailableDevices(getApplicationContext())) { if(desc.type == Device.Descriptor.DeviceType.CAMERA && desc.position == Device.Descriptor.Position.FRONT) { session.attachDevice(desc, device -> { 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); // Bind the camera to the mixer slot we created above. session.getMixer().bind(device, "camera"); }); break; } }

카메라 전환

// This assumes you’ve kept a reference called "currentCamera" that points to // a front facing camera for(Device device: BroadcastSession.listAvailableDevices()) { if(device.type == Device.Descriptor.DeviceType.CAMERA && Device.position != currentCamera.position) { // Remove the preview view for the old device. // setImagePreviewTextureView is an example function // that handles your view hierarchy. setImagePreviewView(null); session.exchangeDevices(currentCamera, device, camera -> { // Set the preview view for the new device. setImagePreviewView(camera.getPreviewView()); currentCamera = camera; }); break; } }

입력 표면 생성

앱에서 생성하는 사운드 또는 이미지 데이터를 입력하려면 createImageInputSource 또는 createAudioInputSource를 사용합니다. 이 두 메서드 모두 가상 디바이스를 생성하고 연결하며, 해당 디바이스는 다른 디바이스처럼 믹서에 바인딩될 수 있습니다.

createImageInputSource에서 반환된 SurfaceSource에는 getInputSurface 메서드가 있으며, 이 메서드는 Camera2 API, OpenGL, Vulkan 또는 표면(Surface)에 쓸 수 있는 기타 항목과 함께 사용할 수 있는 Surface를 제공합니다.

AudioDevice반환자는 AudioRecorder 또는 다른 방법으로 생성된 선형 PCM 데이터를 createAudioInputSource 수신할 수 있습니다.

SurfaceSource source = session.createImageInputSource(); Surface surface = source.getInputSurface(); session.getMixer().bind(source, “custom”);

디바이스 분리

디바이스를 분리만 하고 교체하지 않으려는 경우 Device 또는 Device.Descriptor을(를) 사용하여 디바이스를 분리하세요.

session.detachDevice(currentCamera);

화면 및 시스템 오디오 캡처

Amazon IVS 브로드캐스트 SDK for Android에는 디바이스의 화면(Android 5 이상) 및 시스템 오디오(Android 10 이상) 캡처를 간소화하는 몇 가지 헬퍼가 포함되어 있습니다. 이러한 항목을 수동으로 관리하려는 경우 사용자 지정 이미지 입력 소스와 사용자 지정 오디오 입력 소스를 생성할 수 있습니다.

화면 및 시스템 오디오 캡처 세션을 생성하려면 먼저 권한 요청 의도를 생성해야 합니다.

public void startScreenCapture() { MediaProjectionManager manager = (MediaProjectionManager) getApplicationContext() .getSystemService(Context.MEDIA_PROJECTION_SERVICE); if(manager != null) { Intent intent = manager.createScreenCaptureIntent(); startActivityIfNeeded(intent, SCREEN_CAPTURE_REQUEST_ID); } }

이 기능을 사용하려면 com.amazonaws.ivs.broadcast.SystemCaptureService를 확장하는 클래스를 제공해야 합니다. 메서드를 재정의할 필요는 없지만 서비스 간의 잠재적인 충돌을 방지하기 위해 해당 클래스가 있어야 합니다.

또한 Android 매니페스트에 몇 가지 요소를 추가해야 합니다.

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <application ...> <service android:name=".ExampleSystemCaptureService" android:foregroundServiceType="mediaProjection" android:isolatedProcess="false" /> </application> ...

SystemCaptureService를 확장하는 클래스는 <service> 요소에 명명되어 있어야 합니다. Android 9 이상에서는 foregroundServiceTypemediaProjection이어야 합니다.

권한 의도가 반환되면 화면 및 시스템 오디오 캡처 세션 생성을 계속할 수 있습니다. Android 8 이상에서는 사용자의 알림 패널에 표시될 알림을 제공해야 합니다. Amazon IVS 브로드캐스트 SDK for Android에서는 간편한 메서드인 createServiceNotificationBuilder를 제공합니다. 또는 고유한 알림을 제공할 수도 있습니다.

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode != SCREEN_CAPTURE_REQUEST_ID || Activity.RESULT_OK != resultCode) { return; } Notification notification = null; if(Build.VERSION.SDK_INT >= 26) { Intent intent = new Intent(getApplicationContext(), NotificationActivity.class); notification = session .createServiceNotificationBuilder("example", "example channel", intent) .build(); } session.createSystemCaptureSources(data, ExampleSystemCaptureService.class, Notification, devices -> { // This step is optional if the mixer slots have been given preferred // input device types SCREEN and SYSTEM_AUDIO for (Device device : devices) { session.getMixer().bind(device, "game"); } }); }

브로드캐스트를 시작하기 전에 사용자 연결을 평가하려면 recommendedVideoSettings 메서드를 사용하여 간단한 테스트를 실행합니다. 테스트가 실행되면 가장 권장되는 것에서 가장 권장되지 않는 것 순서로 여러 권장 사항이 표시됩니다. 이 버전의 SDK에서는 현재 BroadcastSession을 다시 구성할 수 없으므로, 해당 세션을 release()한 다음 권장 설정으로 새 세션을 생성해야 합니다. Result.statusSUCCESS 또는 ERROR가 될 때까지 계속 BroadcastSessionTest.Results가 표시됩니다. Result.progress를 사용하여 진행률을 확인할 수 있습니다.

Amazon IVS에서는 최대 8.5Mbps의 비트 전송률(typeSTANDARD 또는 ADVANCED인 채널의 경우)을 지원하므로 이 메서드에서 반환되는 maximumBitrate는 8.5Mbps를 초과하지 않습니다. 네트워크 성능의 작은 변동을 고려하기 위해 이 메서드에서 반환되는 권장 initialBitrate는 테스트에서 측정된 실제 비트 전송률보다 약간 작습니다. (일반적으로 사용 가능한 대역폭의 100%를 사용하는 것은 바람직하지 않습니다.)

void runBroadcastTest() { this.test = session.recommendedVideoSettings(RTMPS_ENDPOINT, RTMPS_STREAMKEY, result -> { if (result.status == BroadcastSessionTest.Status.SUCCESS) { this.recommendation = result.recommendations[0]; } }); }

Bluetooth 마이크 사용

Bluetooth 마이크 장치를 사용하여 브로드캐스트하기 위해서는 Bluetooth SCO 연결을 시작해야 합니다.

Bluetooth.startBluetoothSco(context); // Now bluetooth microphones can be used … // Must also stop bluetooth SCO Bluetooth.stopBluetoothSco(context);