Introducción al SDK de transmisión para Android de IVS | Transmisión de baja latencia - Amazon IVS

Introducción al SDK de transmisión para Android de IVS | Transmisión de baja latencia

En este documento, se explican los pasos para comenzar a usar el SDK de transmisión para Android para la transmisión de baja latencia de Amazon IVS.

Instalación de la biblioteca

A fin de agregar la biblioteca de transmisión de Android de Amazon IVS a su entorno de desarrollo de Android, agregue la biblioteca al archivo build.gradle del módulo, como se muestra a continuación (para la versión más reciente del SDK de transmisión de Amazon IVS):

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

Alternativamente, para instalar el SDK de forma manual, descargue la última versión desde esta ubicación:

Uso del SDK con símbolos de depuración

También publicamos una versión del SDK de transmisión para Android que incluye símbolos de depuración. Puede usar esta versión para mejorar la calidad de los informes de depuración (seguimientos de pila) en Firebase Crashlytics si se produce algún fallo en el SDK de transmisión de IVS, es decir, libbroadcastcore.so. Cuando notifica estos bloqueos al equipo del SDK de IVS, los rastreos de pila de mayor calidad facilitan la solución de los problemas.

Para usar esta versión del SDK, coloque lo siguiente en los archivos de compilación de Gradle:

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

Use la línea anterior en lugar de esta:

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

Carga de símbolos en Firebase Crashlytics

Asegúrese de que los archivos de compilación de Gradle estén configurados para Firebase Crashlytics. Siga las instrucciones de Google aquí:

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

Asegúrese de incluir com.google.firebase:firebase-crashlytics-ndk como dependencia.

Al crear la aplicación para su lanzamiento, el complemento de Firebase Crashlytics debería cargar los símbolos automáticamente. Para cargar los símbolos manualmente, ejecute cualquiera de los comandos siguientes:

gradle uploadCrashlyticsSymbolFileRelease
./gradlew uploadCrashlyticsSymbolFileRelease

(No pasará nada si los símbolos se cargan dos veces, automática y manualmente).

Cómo evitar que el archivo .apk de la versión aumente de tamaño

Antes de empaquetar el archivo .apk de la versión, el complemento de Gradle para Android intenta eliminar automáticamente la información de depuración de las bibliotecas compartidas (incluida la biblioteca libbroadcastcore.so del SDK de transmisión de IVS). Sin embargo, a veces esto no sucede. Como resultado, el archivo .apk podría aumentar de tamaño y podría recibir un mensaje de advertencia del complemento de Gradle para Android indicándole que no puede eliminar los símbolos de depuración y que está empaquetando los archivos .so tal como están. Si esto sucede, haga lo siguiente:

  • Instale un NDK de Android. Cualquier versión reciente funcionará.

  • Agregue ndkVersion <your_installed_ndk_version_number> al archivo build.gradle de la aplicación. Haga esto incluso si la propia aplicación no contiene código nativo.

Para obtener más información, consulte este informe de problemas.

Crear el agente de escucha de eventos

La configuración de un agente de escucha de eventos le permite recibir actualizaciones de estado, notificaciones de cambio de dispositivo, errores e información de audio de sesión.

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

Solicitar permisos

La aplicación debe solicitar permiso para acceder a la cámara y al micrófono del usuario. (Esto no es específico de Amazon IVS; es necesario para cualquier aplicación que necesite acceso a cámaras y micrófonos).

Aquí, verificamos si el usuario ya ha concedido permisos y, de no ser así, preguntamos por ellos:

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

Aquí, obtenemos la respuesta del usuario:

@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(); } }

Crear la sesión de transmisión

La interfaz de transmisión es com.amazonaws.ivs.broadcast.BroadcastSession. Inicialícela con un ajuste preestablecido, como se muestra a continuación. Si hay algún error durante la inicialización (como un error al configurar un códec), su BroadcastListener recibirá un mensaje de error y broadcastSession.isReady será false.

Importante: Todas las llamadas al SDK de transmisión de Amazon IVS para Android deben hacerse en el subproceso en el que se crea una instancia del SDK. Una llamada desde un subproceso diferente hará que el SDK arroje un error fatal y deje de transmitir.

// 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));

Consulte también Crear la sesión de transmisión (versión avanzada).

Configurar ImagePreviewView para la previsualización

Si desea mostrar una vista previa de un dispositivo de cámara activo, agregue la previsualización ImagePreviewView para el dispositivo a su jerarquía de vista.

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

Inicio de una transmisión

El nombre de host que recibe en el campo de respuesta ingestEndpoint de la operación GetChannel necesita tener rtmps:// como prefijo y /app como sufijo. La URL completa debe tener este formato: rtmps://{{ ingestEndpoint }}/app

broadcastSession.start(IVS_RTMPS_URL, IVS_STREAMKEY);

El SDK de transmisión de Android solo admite la ingesta de RTMPS (no la ingesta no segura de RTMP).

Detención de una transmisión

broadcastSession.stop();

Lanzamiento de la sesión de transmisión

Se debe llamar al método broadcastSession.release() cuando la sesión de transmisión ya no se usa, a fin de liberar los recursos que utiliza la biblioteca.

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