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