Guida introduttiva all'SDK di trasmissione IVS per Android | Streaming a bassa latenza
Questo documento illustra i passaggi necessari per iniziare a utilizzare l'SDK di trasmissione per lo streaming a bassa latenza di Amazon IVS per Android.
Installare la libreria
Per aggiungere la libreria di trasmissione di Amazon IVS per Android al proprio ambiente di sviluppo Android, aggiungere la libreria al file build.gradle
come mostrato di seguito (per l'ultima versione dell'SDK di trasmissione di Amazon IVS):
repositories { mavenCentral() } dependencies { implementation 'com.amazonaws:ivs-broadcast:1.27.0' }
In alternativa, per installare manualmente l'SDK, scaricare la versione più recente da questo percorso:
Utilizzo dell'SDK con i simboli di debug
Pubblichiamo anche una versione dell'SDK di trasmissione per Android che include i simboli di debug. È possibile utilizzare questa versione per migliorare la qualità dei report di debug (tracce dello stack) in Firebase Crashlytics se si verificano arresti anomali nell'SDK di trasmissione IVS, ad esempio libbroadcastcore.so
. Quando segnali questi arresti anomali al team dell'SDK di IVS, le tracce dello stack di qualità superiore facilitano la risoluzione dei problemi.
Per utilizzare questa versione dell'SDK, inserisci quanto segue nei tuoi file di build di Gradle:
implementation "com.amazonaws:ivs-broadcast:$version:unstripped@aar"
Utilizza la riga precedente invece di questa:
implementation "com.amazonaws:ivs-broadcast:$version@aar"
Caricamento dei simboli in Firebase Crashlytics
Assicurati che i tuoi file di build Gradle siano configurati per Firebase Crashlytics. Segui le istruzioni di Google qui:
https://firebase.google.com/docs/crashlytics/ndk-reports
Assicurati di includere com.google.firebase:firebase-crashlytics-ndk
come dipendenza.
Quando crei l'app per il rilascio, il plug-in Firebase Crashlytics dovrebbe caricare i simboli automaticamente. Per caricare i simboli manualmente, esegui uno dei comandi seguenti:
gradle uploadCrashlyticsSymbolFileRelease
./gradlew uploadCrashlyticsSymbolFileRelease
Non è un problema se i simboli vengono caricati due volte, automaticamente e manualmente.
Impedire che .apk Release diventi più grande
Prima di impacchettare il file .apk
di rilascio, il plug-in Android Gradle tenta automaticamente di rimuovere le informazioni di debug dalle librerie condivise (inclusa la libreria libbroadcastcore.so
dell'SDK di trasmissione IVS). Tuttavia, a volte ciò non accade. Di conseguenza, il file .apk
potrebbe diventare più grande e si potrebbe ricevere un messaggio di avviso dal plug-in Android Gradle che indica che non è in grado di rimuovere i simboli di debug e sta impacchettando i file .so
così come sono. In tal caso, segui questa procedura:
-
Installa un NDK per Android. Va bene qualsiasi versione recente.
-
Aggiungi
ndkVersion <your_installed_ndk_version_number>
al filebuild.gradle
dell'applicazione. Fallo anche se l'applicazione non contiene codice nativo.
Per ulteriori informazioni, consulta questo report sul problema
Creare il listener di eventi
La configurazione di un listener di eventi consente di ricevere aggiornamenti di stato, notifiche di modifica del dispositivo, errori e informazioni sull'audio della sessione.
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); } };
Richiedere autorizzazioni
L'app deve richiedere l'autorizzazione per accedere alla fotocamera e al microfono dell'utente. (Questo non riguarda solo Amazon IVS, ma qualsiasi applicazione che abbia bisogno di accedere alle fotocamere e ai microfoni.)
Qui, controlliamo se l'utente ha già concesso le autorizzazioni e, in caso contrario, le chiediamo:
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; } }
Qui, otteniamo la risposta dell'utente:
@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(); } }
Creare la sessione di trasmissione
L'interfaccia di trasmissione è com.amazonaws.ivs.broadcast.BroadcastSession
. Inizializzarla con un preset, come mostrato di seguito. Se si verificano errori durante l'inizializzazione (ad esempio un errore nella configurazione di un codec), BroadcastListener
mostrerà un messaggio di errore e broadcastSession.isReady
sarà false
.
Importante: tutte le chiamate all'SDK di trasmissione Amazon IVS per Android devono essere eseguite sul thread su cui viene istanziato l'SDK. L'esecuzione di una chiamata da un thread diverso causerà un errore irreversibile dell'SDK e interromperà la trasmissione.
// 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));
Consultare anche Creare la sessione di trasmissione (versione avanzata).
Impostare ImagePreviewView per l'anteprima
Se si desidera visualizzare un'anteprima per un dispositivo fotocamera attivo, aggiungere un'anteprima ImagePreviewView
per il dispositivo dalla gerarchia delle visualizzazioni.
// 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); } } });
Avviare una trasmissione
Al nome host che si riceve nel campo di risposta ingestEndpoint
dell'operazione GetChannel
è necessario anteporre rtmps://
e posporre /app
. L'URL completo deve essere in questo formato: rtmps://{{ ingestEndpoint }}/app
broadcastSession.start(IVS_RTMPS_URL, IVS_STREAMKEY);
L'SDK di trasmissione Android supporta solo l'acquisizione RTMPS (non l'acquisizione RTMP non sicura).
Interrompere una trasmissione
broadcastSession.stop();
Rilasciare una sessione di trasmissione
Quando il lettore non è più in uso deve essere invocato il metodo broadcastSession.release()
, per liberare le risorse utilizzate dalla libreria.
@Override protected void onDestroy() { super.onDestroy(); previewHolder.removeAllViews(); broadcastSession.release(); }