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"); } }); }
Obtener la configuración de transmisión recomendada
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);