Fortgeschrittene Anwendungsfälle für das IVS-Android-Broadcast-SDK | Streaming mit niedriger Latenz
Hier stellen wir einige fortschrittliche Anwendungsfälle vor. Beginnen Sie mit dem obigen Basis-Setup und fahren Sie hier fort.
Broadcast-Konfiguration erstellen
Hier erstellen wir eine benutzerdefinierte Konfiguration mit zwei Mischersteckplätzen, die es uns erlauben, zwei Videoquellen an den Mischer zu binden. Eine (custom
) ist Vollbild und hinter der anderen angelegt (camera
), die kleiner und in der unteren rechten Ecke ist. Beachten Sie, dass wir für den custom
-Slot keine Position, Größe oder Seitenverhältnis festlegen. Da wir diese Parameter nicht einstellen, verwendet der Slot die Videoeinstellungen für Größe und 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 $; });
Erstellen der Broadcast-Sitzung (Advanced-Version)
Erstellen Sie eine BroadcastSession
wie im grundlegenden Beispiel, geben Sie jedoch hier Ihre benutzerdefinierte Konfiguration an. Geben Sie auch null
für das Gerätearray an, da wir diese manuell hinzufügen werden.
// 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
Iterieren und Anschließen eines Kamerageräts
Hier iterieren wir durch Eingabegeräte, die das SDK erkannt hat. Auf Android 7 (Nougat) gibt dies nur Standard-Mikrofongeräte zurück, da das Amazon-IVS-Broadcast-SDK die Auswahl nicht standardmäßiger Geräte auf dieser Android-Version nicht unterstützt.
Sobald wir ein Gerät gefunden haben, das wir verwenden möchten, rufen wir attachDevice
auf, um es anzuhängen. Eine Lambda-Funktion wird auf dem Hauptthread aufgerufen, wenn das Anhängen des Eingabegeräts abgeschlossen ist. Im Falle eines Fehlers erhalten Sie einen Fehler im Listener.
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; } }
Kameras austauschen
// 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; } }
Erstellen einer Eingabe-Oberfläche
Um Audio- oder Image-Daten einzugeben, die von Ihrer App generiert werden, verwenden Sie createImageInputSource
oder createAudioInputSource
. Beide Methoden erstellen und verbinden virtuelle Geräte, die wie jedes andere Gerät an den Mischer gebunden werden können.
Das von createImageInputSource
zurückgegebene SurfaceSource
hat eine getInputSurface
-Methode, die Ihnen eine Surface
gibt, die Sie mit der Camera2-API, OpenGL oder Vulkan oder allem anderen verwenden können, das auf ein Surface schreiben kann.
Das von createAudioInputSource
zurückgegebene AudioDevice
kann lineare PCM-Daten empfangen, die von AudioRecorder oder auf andere Weise generiert wurden.
SurfaceSource source = session.createImageInputSource(); Surface surface = source.getInputSurface(); session.getMixer().bind(source, “custom”);
Trennen eines Geräts
Wenn Sie ein Gerät trennen und nicht ersetzen möchten, trennen Sie es mit Device
oder Device.Descriptor
.
session.detachDevice(currentCamera);
Bildschirm- und System-Audioaufnahme
Das Amazon IVS Broadcast SDK for Android enthält einige Helfer, die die Erfassung des Bildschirms des Geräts (Android 5 und höher) und des Systemaudio (Android 10 und höher) vereinfachen. Wenn Sie diese manuell verwalten möchten, können Sie eine benutzerdefinierte Image-Eingabequelle und eine benutzerdefinierte Audioeingangsquelle erstellen.
Um eine Bildschirm- und System-Audioaufnahme-Sitzung zu erstellen, müssen Sie zunächst eine Berechtigungsanforderungsabsicht erstellen:
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); } }
Um dieses Feature zu verwenden, müssen Sie eine Klasse bereitstellen, die com.amazonaws.ivs.broadcast.SystemCaptureService
erweitert. Sie müssen keine ihrer Methoden außer Kraft setzen, aber die Klasse muss da sein, um mögliche Kollisionen zwischen Services zu vermeiden.
Sie müssen auch ein paar Elemente zu Ihrem Android-Manifest hinzufügen:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <application ...> <service android:name=".ExampleSystemCaptureService" android:foregroundServiceType="mediaProjection" android:isolatedProcess="false" /> </application> ...
Ihre Klasse, die SystemCaptureService
erweitert, muss im <service>
-Element benannt werden. Unter Android 9 und höher muss foregroundServiceType
eine mediaProjection
sein.
Sobald die Berechtigungsabsicht zurückgegeben wurde, können Sie mit der Erstellung des Bildschirms und der Audioaufnahmesitzung des Systems fortfahren. Unter Android 8 und höher müssen Sie eine Benachrichtigung bereitstellen, die im Benachrichtigungsbereich Ihres Benutzers angezeigt wird. Das Amazon IVS Broadcast SDK for Android bietet die bequeme Methode createServiceNotificationBuilder
. Alternativ können Sie Ihre eigene Benachrichtigung mitteilen.
@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"); } }); }
Empfohlene Broadcast-Einstellungen erhalten
Um die Verbindung Ihres Benutzers vor dem Starten einer Übertragung zu bewerten, verwenden Sie die recommendedVideoSettings
-Methode, um einen kurzen Test durchzuführen. Während der Test läuft, erhalten Sie mehrere Empfehlungen, die von den meisten bis am wenigsten empfohlen bestellt werden. In dieser Version des SDK ist es nicht möglich, die aktuelle BroadcastSession
neu zu konfigurieren, daher müssen Sie sie release()
und dann eine neue mit den empfohlenen Einstellungen erstellen. Sie erhalten weiterhin BroadcastSessionTest.Results
bis Result.status
SUCCESS
ist oder ERROR
. Sie können den Fortschritt mit Result.progress
überprüfen.
Amazon IVS unterstützt eine maximale Bitrate von 8,5 Mbit/s (für Kanäle, deren type
STANDARD
oder ADVANCED
ist), so dass die maximumBitrate
, die von dieser Methode zurückgegeben wird, nie 8,5 Mbps überschreitet. Um kleine Schwankungen der Netzwerkleistung zu berücksichtigen, ist die von dieser Methode empfohlene initialBitrate
etwas niedriger als die im Test gemessene tatsächliche Bitrate. (Die Verwendung von 100 % der verfügbaren Bandbreite ist in der Regel nicht ratsam.)
void runBroadcastTest() { this.test = session.recommendedVideoSettings(RTMPS_ENDPOINT, RTMPS_STREAMKEY, result -> { if (result.status == BroadcastSessionTest.Status.SUCCESS) { this.recommendation = result.recommendations[0]; } }); }
Verwenden der automatischen Wiederverbindung
IVS unterstützt die automatische Wiederverbindung mit einem Broadcast, falls der Broadcast unerwartet beendet wird, ohne die stop
-API aufzurufen, z. B. bei einem vorübergehenden Verlust der Netzwerkkonnektivität. Rufen Sie setEnabled(true)
für BroadcastConfiguration.autoReconnect
auf, um die automatische Wiederverbindung zu aktivieren.
Wenn der Stream aus irgendeinem Grund unerwartet beendet wird, versucht das SDK die Wiederverbindung bis zu fünf Mal. Dabei folgt es einer linearen Backoff-Strategie. Es benachrichtigt Ihre Anwendung mithilfe der Methode BroadcastSession.Listener.onRetryStateChanged
über den Status der erneuten Versuche.
Die automatische Wiederverbindung nutzt im Hintergrund die IVS-Funktion für die Stream-Übernahme, indem eine Prioritätsnummer, beginnend mit 1, an das Ende des bereitgestellten Stream-Schlüssels angehängt wird. Für die Dauer der BroadcastSession
-Instance wird diese Zahl bei jedem erneuten Verbindungsversuch um 1 erhöht. Das bedeutet Folgendes: Wenn die Verbindung des Geräts während eines Broadcasts viermal unterbrochen wird und für jede Unterbrechung 1–4 Wiederholungsversuche erforderlich sind, kann die Priorität des letzten Streamups zwischen 5 und 17 liegen. Aus diesem Grund empfehlen wir, die IVS-Stream-Übernahme von einem anderen Gerät nicht zu verwenden, solange die automatische Wiederverbindung im SDK für denselben Kanal aktiviert ist. Es gibt keine Garantie dafür, welche Priorität das SDK zu diesem Zeitpunkt verwendet, und das SDK versucht, die Verbindung mit einer höheren Priorität wiederherzustellen, wenn ein anderes Gerät den Stream übernimmt.
Verwenden von Bluetooth-Mikrofonen
Um mit Bluetooth-Mikrofongeräten zu senden, müssen Sie eine Bluetooth-SCO-Verbindung herstellen:
Bluetooth.startBluetoothSco(context); // Now bluetooth microphones can be used … // Must also stop bluetooth SCO Bluetooth.stopBluetoothSco(context);