Seleccione sus preferencias de cookies

Usamos cookies esenciales y herramientas similares que son necesarias para proporcionar nuestro sitio y nuestros servicios. Usamos cookies de rendimiento para recopilar estadísticas anónimas para que podamos entender cómo los clientes usan nuestro sitio y hacer mejoras. Las cookies esenciales no se pueden desactivar, pero puede hacer clic en “Personalizar” o “Rechazar” para rechazar las cookies de rendimiento.

Si está de acuerdo, AWS y los terceros aprobados también utilizarán cookies para proporcionar características útiles del sitio, recordar sus preferencias y mostrar contenido relevante, incluida publicidad relevante. Para aceptar o rechazar todas las cookies no esenciales, haga clic en “Aceptar” o “Rechazar”. Para elegir opciones más detalladas, haga clic en “Personalizar”.

Casos de uso avanzados del SDK de transmisión para Android de IVS | Transmisión de baja latencia

Modo de enfoque
Casos de uso avanzados del SDK de transmisión para Android de IVS | Transmisión de baja latencia - Amazon IVS

Aquí presentamos algunos casos de uso avanzados. Comience con la configuración básica anterior y continúe aquí.

Creación de una configuración de transmisión

Aquí creamos una configuración personalizada con dos espacios en el mezclador que nos permiten vincular dos fuentes de video al mezclador. Uno (custom) está a pantalla completa y se presenta detrás del otro (camera), que es más pequeño y en la esquina inferior derecha. Tenga en cuenta que para el espacio custom no establecemos posición, tamaño ni modo de aspecto. Debido a que no establecemos estos parámetros, el espacio utilizará la configuración de video para el tamaño y la posición.

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

Crear la sesión de transmisión (versión avanzada)

Cree una BroadcastSession como lo hizo en el ejemplo básico, pero proporcione su configuración personalizada aquí. Proporcione también null para la matriz de dispositivos, ya que los agregaremos manualmente.

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

Iterar y adjuntar un dispositivo de cámara

Aquí iteramos a través de dispositivos de entrada que el SDK ha detectado. En Android 7 (Nougat), esto solo devolverá los dispositivos de micrófono predeterminados, ya que el SDK de transmisión de Amazon IVS no admite la selección de dispositivos no predeterminados en esta versión de Android.

Una vez que encontramos un dispositivo que queremos usar, llamamos a attachDevice para adjuntarlo. Se llama a una función de Lambda en el subproceso principal cuando se ha completado la conexión del dispositivo de entrada. En caso de error, recibirá un mensaje de error en el agente de escucha.

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

Cámaras de intercambio

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

Creación de una superficie de entrada

Para introducir los datos de sonido o imagen que genera la aplicación, utilice createImageInputSource o createAudioInputSource. Ambos métodos crean y adjuntan dispositivos virtuales que se pueden vincular al mezclador como cualquier otro dispositivo.

La SurfaceSource devuelta por createImageInputSource tiene un método getInputSurface, que le dará una Surface que puede usar con la API Camera2, OpenGL o Vulkan, o cualquier otra cosa que pueda escribir en una Surface (Superficie).

El AudioDevice devuelto por createAudioInputSource puede recibir datos PCM lineales generados por AudioRecorder u otros medios.

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

Desconectar un dispositivo

Si desea desconectar y no reemplazar un dispositivo, desconéctelo con Device o Device.Descriptor.

session.detachDevice(currentCamera);

Captura de audio de pantalla y sistema

El SDK de transmisión de Amazon IVS para Android incluye algunos ayudantes que simplifican la captura de la pantalla del dispositivo (Android 5 y posterior) y del audio del sistema (Android 10 y posterior). Si desea administrarlos de forma manual, puede crear una fuente de entrada de imagen personalizada y una fuente de entrada de audio personalizada.

Para crear una sesión de captura de audio de pantalla y sistema, primero debe crear una intención de solicitud de permiso:

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

Para utilizar esta característica, debe proporcionar una clase que amplíe com.amazonaws.ivs.broadcast.SystemCaptureService. No tiene que anular ninguno de sus métodos, pero la clase debe estar allí para evitar posibles colisiones entre servicios.

También debe agregar un par de elementos a su manifiesto de Android:

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

La clase que extiende SystemCaptureService debe denominarse en el elemento <service>. En Android 9 y versiones posteriores, el foregroundServiceType debe ser mediaProjection.

Una vez que la intención de permisos haya regresado, puede continuar con la creación de la sesión de captura de audio de la pantalla y el sistema. En Android 8 y versiones posteriores, debe proporcionar una notificación para que se muestre en el Panel de notificaciones de su usuario. El SDK de transmisión de Amazon IVS para Android proporciona el método de conveniencia createServiceNotificationBuilder. También puede proporcionar su propia notificación.

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

Para evaluar la conexión de su usuario antes de iniciar una transmisión, utilice la herramienta recommendedVideoSettings para ejecutar una breve prueba. A medida que se ejecuta la prueba, recibirá varias recomendaciones, ordenadas de la más recomendada a la menos recomendada. En esta versión del SDK, no es posible volver a configurar la BroadcastSession, por lo que tendrá que release() y luego crear una nueva con la configuración recomendada. Seguirá recibiendo BroadcastSessionTest.Results hasta que el Result.status sea SUCCESS o ERROR. Puede verificar el progreso con Result.progress.

Amazon IVS admite una velocidad de bits máxima de 8,5 Mbps (para canales cuyo type es STANDARD o ADVANCED), por lo que la maximumBitrate devuelta por este método nunca supera los 8,5 Mbps. Para tener en cuenta las pequeñas fluctuaciones en el rendimiento de la red, la initialBitrate recomendada que devuelve este método es ligeramente menor que la velocidad de bits verdadera medida en la prueba. (Por lo general, no es aconsejable utilizar el 100 % de la banda ancha disponible).

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

Uso de la reconexión automática

IVS es compatible con la reconexión automática a una transmisión si se detiene inesperadamente sin llamar a la API stop; por ejemplo, si se produce una pérdida temporal de la conectividad de la red. Para habilitar la reconexión automática, llame a setEnabled(true) en BroadcastConfiguration.autoReconnect.

Cuando la transmisión se detiene inesperadamente, el SDK intentar la reconexión hasta 5 veces, con una estrategia de espera lineal. Notifica a su aplicación sobre el estado de reintento con el método BroadcastSession.Listener.onRetryStateChanged.

En segundo plano, la reconexión automática utiliza la funcionalidad stream-takeover de IVS al agregar un número de prioridad, comenzando por 1, al final de la clave de transmisión proporcionada. Mientras dure la instancia BroadcastSession, ese número se incrementa en 1 cada vez que se intenta una reconexión. Esto significa que si la conexión del dispositivo se pierde 4 veces durante una transmisión y cada pérdida requiere entre 1 y 4 intentos de reconexión, la prioridad de la última transmisión activa podría ser de entre 5 y 17. Es por esto que recomendamos que no use la toma de control de la transmisión de IVS desde otro dispositivo mientras esté habilitada la reconexión automática en el SDK del mismo canal. No hay garantía de qué prioridad del SDK se esté utilizando en ese momento y el SDK intentará reconectarse con una prioridad más alta si otro dispositivo toma el control.

Uso de micrófonos Bluetooth

Para transmitir mediante dispositivos de micrófono Bluetooth, debe iniciar una conexión SCO Bluetooth:

Bluetooth.startBluetoothSco(context); // Now bluetooth microphones can be used … // Must also stop bluetooth SCO Bluetooth.stopBluetoothSco(context);
PrivacidadTérminos del sitioPreferencias de cookies
© 2025, Amazon Web Services, Inc o sus afiliados. Todos los derechos reservados.