Cas d’utilisation avancés du kit SDK de diffusion Android d’IVS | Diffusion à faible latence
Nous présentons ici quelques cas d’utilisation avancés. Commencez par la configuration de base ci-dessus et continuez ici.
Créer une configuration de diffusion
Ici, nous créons une configuration personnalisée avec deux emplacements de mélangeur qui nous permettent de lier deux sources vidéo au mélangeur. L’un (custom
) est en plein écran et disposé derrière l’autre (camera
), qui est plus petit et dans le coin inférieur droit. Notez que pour l’emplacement custom
, nous ne définissons pas la position, la taille ou le mode d’aspect. Étant donné que nous ne définissons pas ces paramètres, l’emplacement utilisera les paramètres vidéo pour la taille et la position.
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 $; });
Créer la session de diffusion (version avancée)
Créez une BroadcastSession
comme vous l’avez fait dans l’exemple de base, mais fournissez votre configuration personnalisée ici. Indiquez également null
pour le tableau de périphériques, car nous allons les ajouter manuellement.
// 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
Itérer et attacher une caméra
Ici, nous itérons à travers les périphériques d’entrée que le kit SDK a détectés. Sur Android 7 (Nougat), cela ne renvoie que les microphones par défaut, car le kit SDK de diffusion Amazon IVS ne prend pas en charge la sélection de périphériques non par défaut sur cette version d’Android.
Une fois que nous avons trouvé un périphérique que nous voulons utiliser, nous appelons attachDevice
pour l’attacher. Une fonction lambda est appelée sur le thread principal une fois le périphérique d’entrée attaché. En cas d’échec, vous recevrez une erreur dans l’Écouteur.
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; } }
Échanger des caméras
// 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; } }
Créer une surface d’entrée
Pour entrer des données audio ou image générées par votre appli, utilisez createImageInputSource
ou createAudioInputSource
. Ces deux méthodes créent et attachent des périphériques virtuels qui peuvent être liés au mélangeur comme n’importe quel autre périphérique.
La SurfaceSource
renvoyée par createImageInputSource
est dotée d’une méthode getInputSurface
, qui vous donnera une Surface
que vous pouvez utiliser avec l’API Camera2, OpenGL ou Vulkan, ou tout autre élément pouvant écrire sur une Surface.
Le AudioDevice
renvoyé par createAudioInputSource
peut recevoir des données PCM linéaires générées par AudioRecorder ou par d’autres moyens.
SurfaceSource source = session.createImageInputSource(); Surface surface = source.getInputSurface(); session.getMixer().bind(source, “custom”);
Détacher un périphérique
Si vous souhaitez détacher un périphérique et ne pas le remplacer, détachez-le avec Device
ou Device.Descriptor
.
session.detachDevice(currentCamera);
Capture de l’écran et de l’audio du système
Le kit SDK for Android de diffusion Amazon IVS inclut quelques aides qui simplifient la capture de l’écran de l’appareil (Android 5 et version ultérieure) et de l’audio du système (Android 10 et version ultérieure). Si vous souhaitez les gérer manuellement, vous pouvez créer une source d’entrée d’image personnalisée et une source d’entrée audio personnalisée.
Pour créer une session de capture de l’écran et de l’audio du système, vous devez d’abord créer une intention de demande d’autorisation :
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); } }
Pour utiliser cette fonction, vous devez fournir une classe qui étend com.amazonaws.ivs.broadcast.SystemCaptureService
. Vous n’avez pas à remplacer ses méthodes, mais la classe doit être là pour éviter toute collision potentielle entre les services.
Vous devez également ajouter quelques éléments à votre manifeste Android :
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <application ...> <service android:name=".ExampleSystemCaptureService" android:foregroundServiceType="mediaProjection" android:isolatedProcess="false" /> </application> ...
Votre classe qui étend SystemCaptureService
doit être nommée dans l’élément <service>
. Sur Android 9 et versions ultérieures, le foregroundServiceType
doit être mediaProjection
.
Une fois que l’intention d’autorisations a été renvoyée, vous pouvez procéder à la création de la session de capture de l’écran et de l’audio du système. Sur Android 8 et versions ultérieures, vous devez fournir une notification à afficher dans le Panneau de notification de votre utilisateur. Le kit SDK for Android de diffusion Amazon IVS fournit la méthode de convenance createServiceNotificationBuilder
. Vous pouvez également fournir votre propre notification.
@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"); } }); }
Obtenir les paramètres de diffusion recommandés
Pour évaluer la connexion de votre utilisateur avant de démarrer une diffusion, utilisez la recommendedVideoSettings
méthode pour exécuter un bref test. Au fur et à mesure que le test s’exécute, vous recevrez plusieurs recommandations, classées de la plus recommandée à la moins recommandée. Dans cette version du kit SDK, il n’est pas possible de reconfigurer la BroadcastSession
actuelle, vous devrez donc utiliser la commande release()
, puis en créer une nouvelle avec les paramètres recommandés. Vous continuerez à recevoir BroadcastSessionTest.Results
jusqu’à ce que le Result.status
soit SUCCESS
ou ERROR
. Vous pouvez vérifier la progression avec Result.progress
.
Amazon IVS prend en charge un débit binaire maximal de 8,5 Mbit/s (pour les canaux dont le type
est STANDARD
ou ADVANCED
), de sorte que le maximumBitrate
renvoyé par cette méthode ne dépasse jamais 8,5 Mbit/s. Pour tenir compte des petites fluctuations des performances du réseau, le initialBitrate
recommandé renvoyé par cette méthode est légèrement inférieur au débit binaire réel mesuré au cours du test. (Il est généralement déconseillé d’utiliser 100 % de la bande passante disponible.)
void runBroadcastTest() { this.test = session.recommendedVideoSettings(RTMPS_ENDPOINT, RTMPS_STREAMKEY, result -> { if (result.status == BroadcastSessionTest.Status.SUCCESS) { this.recommendation = result.recommendations[0]; } }); }
Utilisation de la reconnexion automatique
IVS prend en charge la reconnexion automatique à une diffusion si celle-ci s’arrête de manière inattendue sans appeler l’API stop
; par exemple, une perte temporaire de connectivité réseau. Pour activer la reconnexion automatique, appelez setEnabled(true)
sur BroadcastConfiguration.autoReconnect
.
Lorsque quelque chose provoque l’arrêt inattendu du flux, le kit SDK réessaie jusqu’à cinq fois, en suivant une stratégie de backoff linéaire. Il informe votre application de l’état de la tentative de reconnexion via la méthode BroadcastSession.Listener.onRetryStateChanged
.
La reconnexion automatique utilise pour cela la fonctionnalité de reprise de flux de l’IVS en ajoutant un numéro de priorité, commençant par 1, à la fin de la clé de flux fournie. Pendant la durée de l’instance BroadcastSession
, ce numéro est incrémenté de 1 à chaque tentative de reconnexion. Cela signifie que si la connexion de l’appareil est perdue quatre fois au cours d’une diffusion, et que chaque perte nécessite de 1 à 4 tentatives, la priorité du dernier flux remonté peut être comprise entre 5 et 17. Pour cette raison, nous vous recommandons de ne pas utiliser la reprise de flux IVS à partir d’un autre appareil lorsque la reconnexion automatique est activée dans le kit SDK pour le même canal. Il n’y a aucune garantie quant à la priorité utilisée par le kit SDK à ce moment-là, et le kit SDK essaiera de se reconnecter avec une priorité plus élevée si un autre appareil prend le relais.
Utilisation de microphones Bluetooth
Pour diffuser à l’aide de microphones Bluetooth, vous devez établir une connexion Bluetooth SCO :
Bluetooth.startBluetoothSco(context); // Now bluetooth microphones can be used … // Must also stop bluetooth SCO Bluetooth.stopBluetoothSco(context);