IVS-Broadcast-SDK: Leitfaden zum Mischpult | Streaming mit niedriger Latenz - Amazon IVS

IVS-Broadcast-SDK: Leitfaden zum Mischpult | Streaming mit niedriger Latenz

Der Mischer ist eine Audio- und Videoverarbeitungseinheit, die mehrere Eingangsquellen auf einen einzigen Ausgang kombiniert. Das ist ein leistungsstarkes Feature, mit der Sie mehrere Bildschirmelemente und Audiospuren definieren und verwalten können. Sie können Video und Audio aus mehreren Quellen wie Kameras, Mikrofonen, Bildschirmaufnahmen sowie von Ihrer App generiertes Audio und Video kombinieren. Sie können Übergänge verwenden, um diese Quellen frei in Ihrem zu Amazon IVS gestreamten Video verwenden, zum Stream hinzuzufügen und daraus zu entfernen.

Zum Verwenden des Mischers öffnen Sie:

BroadcastSession.getMixer() auf Android

IVSBroadcastSession.mixer auf iOS

Terminologie

IVS-Broadcast-Mischer-Terminologie.
Begriff Beschreibung

Einband

Um ein Eingabegerät mit einem Slot zu verknüpfen, muss das Gerät mit dem Mischer-Slot verbunden werden. Dies geschieht mit der Mixer.bind()-Methode. Ein Slot kann jeweils einen Image-Eingang und einen Audioeingang an ihn gebunden haben. Sie können ein Gerät aus dem Slot lösen, indem Sie Mixer.unbind() aufrufen.

Leinwand

Die in der BroadcastSession-Konfiguration Ihres Videos festgelegte Displayauflösung. Die Bildfläche ist gleich groß wie Ihre Videoeinstellungen und läuft mit der gleichen Bildrate wie in Ihrer Konfiguration angegeben.

Gerät

Eine Hardware- oder Softwarekomponente, die Audio- oder Image-Eingaben für die BroadcastSession produziert. Beispiele für Geräte sind Mikrofone, Kameras, Bluetooth-Headsets und virtuelle Geräte wie Bildschirmaufnahmen oder benutzerdefinierte Image-Eingänge. Mit Ausnahme von benutzerdefinierten Eingaben müssen Sie im Allgemeinen keinen Verweis auf das Geräteobjekt behalten, sondern es reicht eine Kopie des Gerätedeskriptors.

Gerätedeskriptor

Eine Struktur mit Informationen über ein Eingabegerät, z. B. Typ, Systemadresse, einen normal lesbaren „freundlichen“ Namen und die physische Position auf dem Mobilgerät. Mit diesen Informationen können Sie entscheiden, ob Sie das referenzierte Gerät verwenden und Amazon IVS darauf zugreifen lassen möchten.

Slot

Ein Container, der die Position eines visuellen Elements auf dem Bildschirm und die Eigenschaften einer Audiospur im Audiomix definiert. Ein Mischer kann mit null oder mehr Slots konfiguriert werden. Slots erhalten einen Zeichenfolgennamen, der zum Anbinden von Geräten und zum Ausführen von Übergängen verwendet werden kann. Das obige Image zeigt vier Slots:

  • Unten links mit Kameraeingang

  • Oben rechts mit Filmeingabe

  • Unten rechts mit dem Amazon IVS-Logo

  • Ein Vollbild-Hintergrundbild

Nach dem Konfigurieren einer Sitzung können Sie Slots mit deden Mischermethoden addSlot und removeSlot hinzufügen oder entfernen.

Übergang

Um einen Slot an eine neue Position zu verschieben oder einige seiner Eigenschaften zu ändern, verwenden Sie Mixer.transition(). Diese Methode verwendet:

  • Eine neue Slot-Struktur, die den nächsten Status für den Slot darstellt

  • Eine Dauer, die angibt, wie lange die Animation relativ zur Zeitlinie des Videos dauern soll. Wenn die Dauer auf 0 festgelegt ist, erfolgt der Übergang im nächsten Frame, das gemischt ist.

  • Eine optionale Rückmeldung, die Sie informiert, wann die Animation abgeschlossen ist. Diese Rückmeldung kann nützlich sein, um Animationen zu verketten.

Bildflächeneigenschaften

Die auf der BroadcastConfiguration beruhenden Bildflächen-Eigenschaften geben Sie beim Erstellen der BroadcastSession ein. Mehrere Eigenschaften in den Audio- und Video-Strukturen beeinflussen die Bildfläche:

Name Typ Beschreibung

Audio.channels

Ganzzahl

Anzahl der Ausgangskanäle des Audiomischers. Gültige Werte: 1 und 2. 1 bedeutet Mono-Audio-Kanal; 2 Stereo-Audio. Standard: 2

Audio.sampleRate

AudioSamplerate

Anzahl der Audiomuster pro Sekunde aus dem Audiomischer. Dieser Wert sollte mindestens doppelt so hoch sein wie die höchste Frequenz in Ihrem Audiosignal. Menschen können bis zu 20 kHz hören, daher genügen im Allgemeinen 44,1 oder 48 kHz. Standardwert: 48 kHz

Video.defaultAspectMode

AspectMode

Standardmodus für das Aspekt-Verhältnis für Slots. Zulässige Werte:

  • Fill - Behält das Seitenverhältnis des Images bei, füllt jedoch den Slot aus. Das Image wird bei Bedarf beschnitten.

  • Fit - Behält das Seitenverhältnis des Images bei, passt es jedoch an den Slot an. Der Slot kann bei Bedarf horizontale oder vertikale Randstreifen haben. Diese Randstreifen sind fillColor, wenn dieser Wert festgelegt wurde, andernfalls transparent (was schwarz bedeutet, wenn die Bildflächenfarbe hinter dem Image schwarz ist).

  • None - Behält das Seitenverhältnis des Images nicht bei. Das Image wird so skaliert, dass es den Abmessungen des Slots entspricht.

Video.size

Vec2

Größe der Video-Bildfläche.

Video.targetFramerate

Ganzzahl

Anzahl der Ziel-Frames pro Sekunde für die Bildfläche. Im Durchschnitt sollte dieser Wert erreicht werden, aber das System kann unter bestimmten Umständen Frames auslassen (z. B. bei hoher CPU-Last oder Netzwerküberlastung).

Slot-Eigenschaften

Slots haben mehrere konfigurierbare Eigenschaften, mit denen Sie Ihre Szenen anpassen und animieren können. Jeder Float- oder Vektor-Wert wird durch lineare Interpolation für Übergänge mit einer Dauer von mehr als 0 Sekunden animiert.

Name Typ Beschreibung

aspect

AspectMode

Aspekt-Ratio-Modus für jedes Image, das im Slot gerendert wird. Zulässige Werte:

  • Fill - Behält das Seitenverhältnis des Images bei, füllt jedoch den Slot aus. Das Image wird bei Bedarf beschnitten.

  • Fit - Behält das Seitenverhältnis des Images bei, passt es jedoch an den Slot an. Der Slot kann bei Bedarf horizontale oder vertikale Randstreifen haben. Diese Randstreifen sind fillColor, wenn dieser Wert festgelegt wurde, andernfalls transparent (was schwarz bedeutet, wenn die Bildflächenfarbe hinter dem Image schwarz ist).

  • None - Behält das Seitenverhältnis des Images nicht bei. Das Image wird so skaliert, dass es den Abmessungen des Slots entspricht.

Standard: wie die Bildfläche. aspect, wenn matchCanvasAspectMode true ist, sonst Fill. Ein Festlegen dieses Wertes setzt matchCanvasAspectMode außerdem auf false.

fillColor

Vec4

Füllfarbe für Aspect Fit, wenn die Seitenverhältnisse von Slot und Image nicht übereinstimmen. Das Format ist (rot, grün, blau, alpha). Gültiger Wert (für jeden Kanal): 0 - 1. Standard: 0.0.0.0

gain

Gleitkommazahl

Audio-Gain. Dies ist ein Multiplikator, daher erhöht jeder Wert über 1 den Gain; jeder Wert unter 1 verringert ihn. Zulässige Werte: 0 bis 2. Standard: 1

matchCanvasAspectMode

Boolesch

Wenn true, wird der Video.defaultAspectMode-Wert der Bildfläche genutzt. Dies ist auf false eingestellt, wenn Sie die aspect-Eigenschaften des Slots einstellen. Standard: true

matchCanvasSize

Boolesch

Wenn der Wert true ist, wird die Größe des Slots so eingestellt, dass sie der Größe der Bildfläche entspricht, und ihre Position ist auf (0, 0) eingestellt. Dies ist auf false eingestellt, wenn Sie die size-Eigenschaften des Slots einstellen. Standard: true

name

Zeichenfolge

Name des Slots. Dieser wird verwendet, um den Slot für Bindungen und Übergänge zu referenzieren. Standard: "default".

position

Vec2

Position des Slots (in Pixel) relativ zur linken oberen Ecke der Bildfläche. Der Ursprung des Slots ist ebenfalls oben links.

preferredAudioInput

Gerätetyp

Bevorzugter Audio-Eingangs-Gerätetyp. Wenn dieser Slot ungebunden ist und ein Audiogerät des angegebenen Typs an die Sitzung angeschlossen ist, wird das Gerät automatisch an diesen Slot angebunden. Zulässige Werte:

  • Mikrofon - Audio-Hardware wie Bordmikrofon, steckbare oder Bluetooth-Kopfhörer.

  • System-Audio - Vom Betriebssystem aufgenommenes Audio, normalerweise begleitet von einer Bildschirmaufnahme.

  • Benutzeraudio - Benutzerdefinierte Audioeingänge, die Sie erstellen.

  • Unbekannt - Es gibt kein bevorzugtes Gerät; der Slot wird immer manuell angebunden.

preferredVideoInput

Gerätetyp

Bevorzugtes Video-Eingabegerät. Wenn dieser Slot ungebunden ist und ein Videogerät des angegebenen Typs an die Sitzung angeschlossen ist, wird das Gerät automatisch an diesen Slot angebunden. Zulässige Werte:

  • Kamera - On-Board-Kamera-Geräte wie Front-, Rückseiten- oder Weitwinkelkamera.

  • Bildschirm - Bildschirmaufnahme vom Betriebssystem.

  • Benutzer-Image – Benutzerdefinierte Image- und Videoeingaben, die Sie erstellen.

  • Unbekannt - Es gibt kein bevorzugtes Gerät; der Slot wird immer manuell angebunden.

size

Vec2

Größe des Slots in Pixel. Ein Festlegen dieses Wertes setzt matchCanvasSize außerdem auf false. Standard: (0, 0); weil matchCanvasSize jedoch standardmäßig true ist, ist die gerenderte Slotgröße gleich der Bildflächengröße, nicht (0, 0).

transparency

Gleitkommazahl

Slot-Transparenz. Dies ist multiplikativ mit allen Alpha-Werten im Image. Die Deckkraft ist 1 = transparency. Gültige Werte: 0 - 1, wobei 0 vollständig undurchsichtig und 1 vollständig transparent ist. Standard: 0

zIndex

Gleitkommazahl

Relative Reihenfolge der Slots. Slots mit höherem zIndex-Wert werden über Slots mit niedrigerem zIndex-Wert gelegt.

Konfigurieren einer Broadcast-Sitzung zum Mischen

Konfigurieren einer Broadcast-Sitzung zum Mischen

Hier erstellen wir eine Szene, die der am Anfang dieses Handbuchs ähnelt, mit drei Bildschirmelementen:

  • Slot unten links für eine Kamera.

  • Slot unten rechts für eine Logo-Überlagerung.

  • Slot oben rechts für einen Film.

Beachten Sie, dass der Ursprung für die Bildfläche die obere linke Ecke ist und dies für alle Slots gilt. Wenn Sie also einen Slot an (0, 0) positionieren, wird er in die obere linke Ecke gesetzt, wobei der gesamte Slot sichtbar ist.

iOS

let config = IVSBroadcastConfiguration() try config.video.setSize(CGSize(width: 1280, height: 720)) try config.video.setTargetFramerate(60) config.video.enableTransparency = true // Bottom Left var cameraSlot = IVSMixerSlotConfiguration() cameraSlot.size = CGSize(width: 320, height: 180) cameraSlot.position = CGPoint(x: 20, y: 1280 - 200) cameraSlot.preferredVideoInput = .camera cameraSlot.preferredAudioInput = .microphone cameraSlot.matchCanvasAspectMode = false cameraSlot.zIndex = 2 try cameraSlot.setName("camera") // Top Right var streamSlot = IVSMixerSlotConfiguration() streamSlot.size = CGSize(width: 640, height: 320) streamSlot.position = CGPoint(x: 1280 - 660, y: 20) streamSlot.preferredVideoInput = .userImage streamSlot.preferredAudioInput = .userAudio streamSlot.matchCanvasAspectMode = false streamSlot.zIndex = 1 try streamSlot.setName("stream") // Bottom Right var logoSlot = IVSMixerSlotConfiguration() logoSlot.size = CGSize(width: 320, height: 180) logoSlot.position = CGPoint(x: 1280 - 340, y: 720 - 200) logoSlot.preferredVideoInput = .userImage logoSlot.preferredAudioInput = .unknown logoSlot.matchCanvasAspectMode = false logoSlot.zIndex = 3 try logoSlot.setTransparency(0.7) try logoSlot.setName("logo") config.mixer.slots = [ cameraSlot, streamSlot, logoSlot ]

Android

// Bottom Left val cameraSlot = BroadcastConfiguration.Mixer.Slot.with { s -> s.setSize(320, 180) s.position = BroadcastConfiguration.Vec2(20, 1280 - 200) s.preferredVideoInput = Device.Descriptor.DeviceType.CAMERA s.preferredAudioInput = Device.Descriptor.DeviceType.MICROPHONE s.matchCanvasAspectMode = false s.zIndex = 2 s.name = "camera" s } // Top Right val streamSlot = BroadcastConfiguration.Mixer.Slot.with { s -> s.setSize(640, 320) s.position = BroadcastConfiguration.Vec2(1280 - 660, 20) s.preferredVideoInput = Device.Descriptor.DeviceType.USER_IMAGE s.preferredAudioInput = Device.Descriptor.DeviceType.USER_AUDIO s.matchCanvasAspectMode = false s.zIndex = 1 s.name = "stream" s } // Bottom Right val logoSlot = BroadcastConfiguration.Mixer.Slot.with { s -> s.setSize(320, 180) s.position = BroadcastConfiguration.Vec2(1280 - 340, 720 - 200) s.preferredVideoInput = Device.Descriptor.DeviceType.USER_IMAGE s.preferredAudioInput = Device.Descriptor.DeviceType.UNKNOWN s.matchCanvasAspectMode = false s.zIndex = 3 s.name = "logo" s.transparency = 0.7 s } val config = BroadcastConfiguration.with { c -> c.mixer.slots = listOf(cameraSlot, streamSlot, logoSlot) c.video.targetFramerate = 60 c.video.setSize(1280, 720) c }

Hinzufügen von Slots

Sobald Sie eine BroadcastSession mit Ihrer Konfiguration erstellen, können Sie Slots zum Mischer hinzufügen und daraus entfernen. Hier fügen wir dem Mischer einen großen Hintergrund-Slot für ein Image hinzu.

iOS

// Background. We will use most of the defaults for this slot. var backgroundSlot = IVSMixerSlotConfiguration() backgroundSlot.preferredVideoInput = .userImage backgroundSlot.preferredAudioInput = .unknown backgroundSlot.matchCanvasAspectMode = false try backgroundSlot.setName("background") session.mixer.addSlot(backgroundSlot)

Android

// Background. We will use most of the defaults for this slot. val backgroundSlot = BroadcastConfiguration.Mixer.Slot.with { s -> s.preferredVideoInput = Device.Descriptor.DeviceType.USER_IMAGE s.preferredAudioInput = Device.Descriptor.DeviceType.UNKNOWN s.matchCanvasAspectMode = false s.name = "background" s } session.mixer.addSlot(backgroundSlot)

Entfernen von Slots

Um einen Slot zu entfernen, rufen Sie BroadcastSession.Mixer.removeSlot mit dem Namen des Slots auf, den Sie entfernen möchten. Alle an diesen Slot angebundenen Geräte werden automatisch gelöst, daher müssen Sie sie an andere Slots anbinden, wenn Sie sie weiterhin verwenden möchten.

Animationen mit Übergängen

Die Mischer-Übergangsmethode ersetzt die Konfiguration eines Slots durch eine neue Konfiguration. Dieser Ersatz kann zeitlich animiert werden, indem eine Dauer von mehr als 0 Sekunden festgelegt wird.

Welche Eigenschaften können animiert werden?

Nicht alle Eigenschaften in der Slot-Struktur können animiert werden. Alle Eigenschaften, die auf Float-Typen basieren, können animiert werden; andere Eigenschaften werden entweder am Anfang oder am Ende der Animation wirksam.

Name Kann animiert werden? Auswirkungspunkt

aspect

Nein

Ende

fillColor

Ja

Interpoliert

gain

Ja

Interpoliert

matchCanvasAspectMode

Nein

Starten

matchCanvasSize

Nein

Starten

name

Hinweis: Sie können den Namen des Slots nicht ändern.

Nein

N/A

position

Ja

Interpoliert

preferredAudioInput

Nein

Ende

preferredVideoInput

Nein

Ende

size

Ja

Interpoliert

transparency

Ja

Interpoliert

zIndex

Hinweis: zIndex verschiebt 2D-Ebenen durch den 3D-Raum, so dass der Übergang stattfindet, wenn sich die beiden Ebenen irgendwann in der Mitte der Animation kreuzen. Dies könnte berechnet werden, hängt aber des zIndex-Start- und -Endwertes ab. Kombinieren Sie dies für einen reibungsloseren Übergang mit transparency.

Ja

Unbekannt

Einfache Beispiele:

Im Folgenden finden Sie Beispiele für eine Übernahme der Kamera im Vollbildmodus unter Verwendung der Konfiguration oben in Konfigurieren einer Broadcast-Sitzung zum Mischen. Dies wird 0,5 Sekunden lang animiert.

iOS

// Bottom Left var bigCameraSlot = cameraSlot bigCameraSlot.size = CGSize(width: 1280, height: 720) bigCameraSlot.position = CGPoint(x: 0, y: 0) session.mixer.transition("camera", bigCameraSlot, 0.5) { println("animation completed!") }

Android

// Bottom Left val bigCameraSlot = cameraSlot.changing { s -> s.setSize(1280, 720) s.position = BroadcastConfiguration.Vec2(0, 0) s } session.mixer.transition("camera", bigCameraSlot, 0.5) { print("animation completed!") }

Spiegelung der Übertragung

Um ein angeschlossenes Bildgerät in der Übertragung in diese Richtung zu spiegeln ... Verwenden Sie einen negativen Wert für ...

Horizontal

Slot-Breite

Vertikal

Slot-Höhe

Sowohl horizontal als auch vertikal

Die Slot-Breite und -Höhe

Die Position muss um denselben Wert angepasst werden, damit der Slot beim Spiegeln in die richtige Position gebracht wird.

Im Folgenden finden Sie Beispiele für die horizontale und vertikale Spiegelung der Übertragung.

iOS

Horizontale Spiegelung:

var cameraSlot = IVSMixerSlotConfiguration cameraSlot.size = CGSize(width: -320, height: 720) // Add 320 to position x since our width is -320 cameraSlot.position = CGPoint(x: 320, y: 0)

Vertikale Spiegelung:

var cameraSlot = IVSMixerSlotConfiguration cameraSlot.size = CGSize(width: 320, height: -720) // Add 720 to position y since our height is -720 cameraSlot.position = CGPoint(x: 0, y: 720)

Android

Horizontale Spiegelung:

cameraSlot = BroadcastConfiguration.Mixer.Slot.with { it.size = BroadcastConfiguration.Vec2(-320f, 180f) // Add 320f to position x since our width is -320f it.position = BroadcastConfiguration.Vec2(320f, 0f) return@with it }

Vertikale Spiegelung:

cameraSlot = BroadcastConfiguration.Mixer.Slot.with { it.size = BroadcastConfiguration.Vec2(320f, -180f) // Add 180f to position y since our height is -180f it.position = BroadcastConfiguration.Vec2(0f, 180f) return@with it }

Hinweis: Diese Spiegelung unterscheidet sich von der setMirrored Methode auf ImagePreviewView (Android) und IVSImagePreviewView (iOS). Diese Methode wirkt sich nur auf die lokale Vorschauansicht auf dem Gerät aus und hat keine Auswirkungen auf die Übertragung.