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
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 |
Leinwand |
Die in der |
Gerät |
Eine Hardware- oder Softwarekomponente, die Audio- oder Image-Eingaben für die |
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:
Nach dem Konfigurieren einer Sitzung können Sie Slots mit deden Mischermethoden |
Übergang |
Um einen Slot an eine neue Position zu verschieben oder einige seiner Eigenschaften zu ändern, verwenden Sie
|
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 |
---|---|---|
|
Ganzzahl |
Anzahl der Ausgangskanäle des Audiomischers. Gültige Werte: 1 und 2. 1 bedeutet Mono-Audio-Kanal; 2 Stereo-Audio. Standard: 2 |
|
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 |
|
AspectMode |
Standardmodus für das Aspekt-Verhältnis für Slots. Zulässige Werte:
|
|
Vec2 |
Größe der Video-Bildfläche. |
|
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 |
---|---|---|
|
AspectMode |
Aspekt-Ratio-Modus für jedes Image, das im Slot gerendert wird. Zulässige Werte:
Standard: wie die Bildfläche. |
|
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 |
|
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 |
|
Boolesch |
Wenn true, wird der |
|
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 |
|
Zeichenfolge |
Name des Slots. Dieser wird verwendet, um den Slot für Bindungen und Übergänge zu referenzieren. Standard: |
|
Vec2 |
Position des Slots (in Pixel) relativ zur linken oberen Ecke der Bildfläche. Der Ursprung des Slots ist ebenfalls oben links. |
|
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:
|
|
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:
|
|
Vec2 |
Größe des Slots in Pixel. Ein Festlegen dieses Wertes setzt |
|
Gleitkommazahl |
Slot-Transparenz. Dies ist multiplikativ mit allen Alpha-Werten im Image. Die Deckkraft ist 1 = |
|
Gleitkommazahl |
Relative Reihenfolge der Slots. Slots mit höherem |
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 |
---|---|---|
|
Nein |
Ende |
|
Ja |
Interpoliert |
|
Ja |
Interpoliert |
|
Nein |
Starten |
|
Nein |
Starten |
Hinweis: Sie können den Namen des Slots nicht ändern. |
Nein |
N/A |
|
Ja |
Interpoliert |
|
Nein |
Ende |
|
Nein |
Ende |
|
Ja |
Interpoliert |
|
Ja |
Interpoliert |
Hinweis: |
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.