Amazon Chime SDK Project Board
Hinweis: Wenn Sie mit dem SDK-Quellcode erstellen, enthält die
development
Änderungen, die möglicherweise nicht mit der öffentlich verfügbaren Chime-Medienbibliothek aufbauen oder nicht so stabil sind wie Öffentlichkeitsfreigaben.
Mit dem Amazon Chime SDK für iOS können iOS -Anwendungen kollaborative Audioanrufe, Videoanrufe und Bildschirmfreigabefunktionen hinzugefügt werden, indem Sie dieselben Infrastrukturdienste verwenden, die Meetings auf dem Amazon Chime -Service betreiben.
Dieser Amazon -Chime -SDK für iOS funktioniert, indem sie eine Verbindung zu Besprechung von Sitzungsressourcen herstellen, die Sie in Ihrem AWS -Konto erstellt haben. Das SDK verfügt über alles, was Sie benötigen, um benutzerdefinierte Anruf- und Zusammenarbeitserfahrungen in Ihrer iOS -Anwendung zu erstellen, einschließlich Methoden: Konfigurieren von Besprechungssitzungen, Listen und Auswählen von Audiogeräten, Switch -Videogeräte, Start- und Stopp -Bildschirmfreigabeansicht, Empfangen Sie Rückrufe, wenn Medienereignisse auftreten. Wenn sich Volumen ändert und Besprechungsfunktionen wie Audio -Stummschalt- und Videofliesenbindungen verwalten.
Wir haben auch ein Amazon Chime SDK Project Board, in dem Sie Community -Anfragen und deren Status finden.
Sehen Sie sich die folgenden Ressourcen an:
Und überprüfen Sie die folgenden Anleitungen:
Sie können Amazon Chime SDK in Ihr Projekt von SPM, Cocoapods oder Binärdateien durch GitHub -Release integrieren.
Zum Zweck des Einrichtens wird der Root -Ordner Ihres Projekts (in dem Sie Ihre .xcodeproj
-Datei finden) als root
bezeichnet.
Der Amazon Chime SDK ist über Cocoapods erhältlich. Wenn Sie Cocoapods nicht installiert haben, installieren Sie Cocoapods, indem Sie den Befehl ausführen:
$ gem install cocoapods
$ pod setup
Abhängig von Ihren Systemeinstellungen müssen Sie möglicherweise Sudo wie folgt für die Installation von Cocoapods verwenden:
$ sudo gem install cocoapods
$ pod setup
Führen Sie im Root -Verzeichnis (das Verzeichnis, in dem sich Ihre *.xCodeProj -Datei befindet) Folgendes aus, um eine Podfile in Ihrem Projekt zu erstellen:
$ pod init
Bearbeiten Sie die Podfile
, um AmazonChimeSDK
in Ihr Projekt einzubeziehen:
target 'YourTarget' do
pod 'AmazonChimeSDK'
...
end
Wenn Sie keine Video- und Inhaltsfreigabe -Funktionen oder Software -Video -Codec -Unterstützung benötigen, können Sie stattdessen AmazonChimeSDKNoVideoCodecs
verwenden, um die Größe zu verringern:
target 'YourTarget' do
pod 'AmazonChimeSDKNoVideoCodecs'
...
end
(Optional) Wenn Sie Hintergrund -Unschärfe- und Ersatzfunktionen verwenden möchten, fügen Sie hinzu:
target 'YourTarget' do
pod 'AmazonChimeSDKMachineLearning'
...
end
Führen Sie dann den folgenden Befehl aus, um Pods zu installieren:
$ pod install --repo-update
Öffnen Sie zum Öffnen Ihres Projekts die neu generierte *.xcworkspace
-Datei im Stammverzeichnis mit Xcode. Sie können dies tun, indem Sie den folgenden Befehl in Ihrem Projektordner ausgeben
$ xed .
Hinweis: Verwenden Sie *.xCodeProj nicht , um das Projekt zu eröffnen.
Wenn Sie Hintergrund -Unschärfe- und Ersatzfunktionen unter der Registerkarte " Build Settings
unter dem Linking
Other Linker Flags
-framework AmazonChimeSDKMachineLearning
verwenden.
Der Amazon Chime SDK ist über SPM erhältlich. Wenn Sie keine Video- und Inhaltsfreigabe -Funktionen oder Software -Video -Codec -Unterstützung benötigen, können Sie stattdessen keine Video -Codecs -SPM verwenden.
Öffnen Sie Ihr Projekt in Xcode
Gehen Sie zu Datei > Swift -Pakete > Paketabhängigkeit hinzufügen ...
Geben Sie im Feld Paket-Repository-URL "https://github.com/aws/amazon-chime-sdk-iosspm" ein. Um stattdessen kein Video-Codecs-Medienmodul zu verwenden, geben Sie "https://github.com/aws/amazon-chime-sdk-ios-no-video-codecs-spm" ein.
Geben Sie die neueste Version (z. B. 0.23.1
) ein und klicken Sie auf Weiter .
Wählen Sie Pakete für Ihr Projekt und klicken Sie auf Fertig stellen . AmazonChimeSDK
und AmazonChimeSDKMedia
sind erforderlich. Überprüfen Sie AmazonChimeSDKMachineLearning
, wenn Sie Hintergrundschwäche und Hintergrundersatz verwenden möchten.
AmazonChimeSDK
und AmazonChimeSDKMedia
aus der neuesten Veröffentlichung herunter.AmazonChimeSDKMachineLearning
-Binärdatei herunter. Andernfalls können Sie in den folgenden Anweisungen alle Verweise auf AmazonChimeSDKMachineLearning
ignorieren.AmazonChimeSDKMediaNoVideoCodecs
Binary anstelle von AmazonChimeSDKMedia
verwenden und alle Verweise auf AmazonChimeSDKMedia
als AmazonChimeSDKMediaNoVideoCodecs
in den folgenden Anweisungen behandeln.Hinweis: Wir unterstützen keine Misch- und Matching -Binärdateien aus verschiedenen Veröffentlichungen.
.framework
s oder .xcframework
s zu root
, was davon abhängt, welches Framework Ihr Projekt verwendet. Für XCode12.3 und später verwenden Sie bitte .xcframework
, wenn Sie Probleme kompilieren. .xcframework
ist nach Amazon Chime SDK iOS v0.15.0 erhältlich Öffnen Sie Ihre .xcodeproj
-Datei in Xcode und klicken Sie auf Ihr Build -Ziel.
Unter der Registerkarte Build Settings
,
Fügen Sie $(PROJECT_DIR)
dem Framework Search Path
.
Fügen Sie @executable_path/Frameworks
hinzu, um Runpath Search Paths
.
Fügen Sie im Abschnitt Linking
die folgenden zwei Flags in Other Linker Flags
hinzu:
-lc++
-ObjC
Suchen Sie unter der Registerkarte General
nach Frameworks, Libraries, and Embedded Content
. Klicken Sie auf +und Add Others
und fügen Sie dann Add Files
.
.framework
.framework
, geben Sie den .xcframework
von AmazonChimeSDK.framework
, AmazonChimeSDKMedia.framework
und AmazonChimeSDKMachineLearning.framework
an. .xcframework
stattdessen, das nach Amazon Chime SDK iOS v0.15.0 erhältlich ist..xcframework
verwenden, geben Sie den Standort von AmazonChimeSDK.xcframework
, AmazonChimeSDKMedia.xcframework
und AmazonChimeSDKMachineLearning.xcframework
an.AmazonChimeSDK.framework
AmazonChimeSDKMedia.framework
und Frameworks überprüfen Sie, ob Embed & Sign
unter der Embed
ausgewählt wird. Für AmazonChimeSDKMachineLearning.framework
select Do Not Embed
. Befolgen Sie diese Schritte, um die Demo -Anwendung auszuführen.
git clone [email protected]:aws/amazon-chime-sdk-ios.git
Ersetzen Sie für beide Ziele in /AmazonChimeSDKDemo/Podfile
AMAZON_CHIME_SDK_VERSION
durch eine bestimmte SDK -Version, z. B. 0.19.3
oder entfernen Sie sie, wenn Sie die neueste Version von Amazon Chime SDK verwenden.
Führen Sie unter /AmazonChimeSDKDemo
den folgenden Befehl aus, um Pods zu installieren:
$ pod install --repo-update
Laden Sie AmazonChimeSDKMedia
und AmazonChimeSDKMachineLearning
-Binärdateien aus der neuesten Veröffentlichung herunter.
AmazonChimeSDKMedia.xcframework
in amazon-chime-sdk-ios/AmazonChimeSDK
Ordner und AmazonChimeSDKMachineLearning.xcframework
zum amazon-chime-sdk-ios/AmazonChimeSDKDemo
Ordner unzip.
Stellen Sie die serverlose Demo von Amazon-Chime-SDK-JS bereit
AmazonChimeDemoSDKBroadcast.appex
ist eine Broadcast -Erweiterung für die von AmazonchimesDKDEMO verwendete Target -Sharing für Geräteebene. Stellen Sie sicher, dass Embed without Signing
unter der Embed
ausgewählt wird. Entfernen Sie es aus Frameworks, Libraries, and Embedded Content
wenn Sie dies nicht testen möchten. Für jedes Ziel unter der Registerkarte Signing & Capabilities
,
Signing
einen Abschnitt, verwenden Sie Ihr eigenes Apple Developer -Team und eine Bündel -Kennung.App Groups
Abschnitt, wählen Sie Ihre eigenen App -Gruppen aus, wenn Sie die Bildschirmaufnahme der Sharing -Gerätepegel testen möchten. Weitere Informationen finden Sie in den Inhalten Freigabe. Aktualisieren Sie die Server -URL und Region:
AppConfiguration.swift
.ViewControllerObjC.h
mit der Server -URL und der Region der serverlosen Demo. (Optional) broadcastBundleId
und appGroupId
in AppConfiguration.swift
und SampleHandler.swift
mit der Bildschirmaufnahme der Sendungs -Geräte -Level -Bildschirmaufnahme in der Sendeload -Erweiterungspaket -ID und der App -Gruppen -ID für die Sendungs -Upload -Erweiterung der App aktualisieren. Weitere Informationen finden Sie in den Inhalten Freigabe.
Öffnen Sie AmazonChimeSDKDemo.xcworkspace
-Datei in AmazonChimeSDKDemo/
Verwenden von Xcode, wählen Sie die AmazonChimeSDKDemoPods
aus der Dropdown -Liste der Scheme in der oberen Leiste der XCode -IDE, wählen Sie ein Build -Gerät und klicken Sie auf die Schaltfläche Ausführen.
Öffnen Sie AmazonChimeSDKDemo.xcworkspace
-Datei in AmazonChimeSDKDemo/
Verwenden von XCode, wählen Sie die AmazonChimeSDKDemo
aus der Dropdown -Liste der Schema in der oberen Leiste von Xcode IDE, wählen Sie ein Build -Gerät und klicken Sie auf die Schaltfläche Ausführen.
Entscheiden Sie sich auf dem Bildschirm mit dem Beitrittsbildschirm an der Besprechung ohne CallKit
oder beitreten Sie sie per CallKit
eingehender/ausgehender Anruf an. Da die Demo -App keine Push -Benachrichtigung hat, verzögert sie die Verbindung über eingehende Anrufe um 10 Sekunden, um den Benutzer genügend Zeit zu geben, um die App zu erhalten oder den Bildschirm zu sperren, um das Verhalten nachzuahmen.
Wenn Sie in diesem Projekt ein potenzielles Sicherheitsproblem entdecken, informieren Sie die AWS/Amazon Security über unsere Seite mit Anfälligkeitsberichten. Bitte erstellen Sie kein öffentliches Github -Problem.
Sie müssen mit der Besprechungssitzung beginnen, um Audio zu senden und zu empfangen.
meetingSession . audioVideo . start ( )
Die Standardkonfigurationen sind:
.outputOnly
oder .none
um zu vermeiden, dass Audio -Aufzeichnungsberechtigungen erforderlich sind). Sie können nicht-defaultische Optionen in AudioVideoConfiguration
angeben und dann die Besprechungssitzung starten.
var audioVideoConfig = AudioVideoConfiguration (
audioMode : . mono48k ,
audioDeviceCapabilities : . outputOnly ,
callKitEnabled : true ,
enableAudioRedundancy : false ,
reconnectTimeoutMs : 180 * 1000 )
meetingSession . audioVideo . start ( audioVideoConfiguration : audioVideoConfig )
HINWEIS: Um Ereignisse zu vermeiden, fügen Sie einen Beobachter hinzu, bevor die Sitzung beginnt. Sie können den Beobachter entfernen.
class MyAudioVideoObserver : AudioVideoObserver {
func audioSessionDidStartConnecting ( reconnecting : Bool ) {
if ( reconnecting ) {
// e.g. the network connection is dropped.
}
}
func audioSessionDidStart ( reconnecting : Bool ) {
// Meeting session starts.
// Can use realtime, devices APIs.
}
func audioSessionDidDrop ( ) { }
func audioSessionDidStopWithStatus ( sessionStatus : MeetingSessionStatus ) {
// See the "Stopping a session" section for details.
}
func audioSessionDidCancelReconnect ( ) { }
func connectionDidRecover ( ) { }
func connectionDidBecomePoor ( ) { }
func videoSessionDidStartConnecting ( ) { }
func videoSessionDidStartWithStatus ( sessionStatus : MeetingSessionStatus ) {
// Video session starts.
// Can use video APIs.
}
func videoSessionDidStopWithStatus ( sessionStatus : MeetingSessionStatus ) { }
meetingSession . audioVideo . addAudioVideoObserver ( observer : self )
}
Listen Sie die verfügbaren Audiogeräte für das Meeting auf.
// An list of MediaDevice objects
let audioDevices = meetingSession . audioVideo . listAudioDevices ( )
for device in audioDevices {
logger . info ( msg : " Device type: ( device . type ) , label: ( device . label ) " )
}
MediaDevice
-Objekt übergeben.Hinweis: Sie sollten dies nach Beginn der Sitzung aufrufen, oder es wird no-op sein. Sie sollten ChooseAudioDevice mit einem der von listaudioDevices zurückgegebenen Geräte () anrufen.
let audioDevices = audioVideo . listAudioDevices ( )
val device = /* An item from audioDevices */
meetingSession . audioVideo . chooseAudioDevice ( mediaDevice : device )
HINWEIS: SwitchCamera () ist no-op, wenn Sie benutzerdefinierte Kamera-Capture-Quelle verwenden. Weitere Informationen finden Sie im benutzerdefinierten Video.
Schalten Sie, um die Vorder- oder Rückkamera auf dem Gerät zu verwenden, falls verfügbar.
meetingSession . audioVideo . switchCamera ( )
Fügen Sie einen DeviceChangeObserver
hinzu, um einen Rückruf zu erhalten, wenn ein neues Audio -Gerät eine Verbindung herstellt oder wenn ein Audiogerät die Verbindung abnimmt. audioDeviceDidChange
enthält eine aktualisierte Geräteliste.
class MyDeviceChangeObserver : DeviceChangeObserver {
func audioDeviceDidChange ( freshAudioDeviceList : [ MediaDevice ] ) {
// A list of updated MediaDevice objects
for device in freshAudioDeviceList {
logger . info ( msg : " Device type: ( device . type ) , label: ( device . label ) " )
}
}
meetingSession . audioVideo . addDeviceChangeObserver ( observer : self )
}
let activeAudioDevice = meetingSession . audioVideo . getActiveAudioDevice ( )
Bei einem Treffen werden Mono/16KHz , Mono/48 kHz und Stereo/48 kHz unterstützt. Stereo/48KHz wird als Standard -Audio -Modus festgelegt, wenn Sie beim Starten der Audiositzung nicht explizit angegeben sind.
meetingSession . audioVideo . start ( ) // starts the audio video session with Stereo/48KHz audio, audio input and output devices enabled, callkit disabled, and audio redundancy enabled
meetingSession . audioVideo . start ( audioVideoConfiguration ) // starts the audio video session with the specified [AudioVideoConfiguration]
Hinweis: Bisher haben Sie Beobachter hinzugefügt, um Geräte- und Sitzungslebenszyklusereignisse zu empfangen. In den folgenden Anwendungsfällen verwenden Sie die Echtzeit-API-Methoden, um Volumenindikatoren zu senden und zu empfangen und den State zu steuern.
let muted = meetingSession . audioVideo . realtimeLocalMute ( ) // returns true if muted, false if failed
let unmuted = meetingSession . audioVideo . realtimeLocalUnmute // returns true if unmuted, false if failed
Sie können dies verwenden, um Echtzeit-Indikatoren-Benutzeroberflächen zu erstellen und sie für Änderungen durch das Array aktualisieren zu lassen.
Hinweis: Diese Rückrufe enthalten nur das Delta aus dem vorherigen Rückruf.
class MyRealtimeObserver : RealtimeObserver {
func volumeDidChange ( volumeUpdates : [ VolumeUpdate ] ) {
for currentVolumeUpdate in volumeUpdates {
// Muted, NotSpeaking, Low, Medium, High
logger . info ( msg : " ( currentVolumeUpdate . attendeeInfo . attendeeId ) 's volume changed: ( currentVolumeUpdate . volumeLevel ) " )
}
}
func signalStrengthDidChange ( signalUpdates : [ SignalUpdate ] ) {
for currentSignalUpdate in signalUpdates {
// None, Low, High
logger . info ( msg : " ( currentSignalUpdate . attendeeInfo . attendeeId ) 's signal strength changed: ( currentSignalUpdate . signalStrength ) " )
}
}
func attendeesDidJoin ( attendeeInfo : [ AttendeeInfo ] ) {
for currentAttendeeInfo in attendeeInfo {
logger . info ( msg : " ( currentAttendeeInfo . attendeeId ) joined the meeting " )
}
}
func attendeesDidLeave ( attendeeInfo : [ AttendeeInfo ] ) {
for currentAttendeeInfo in attendeeInfo {
logger . info ( msg : " ( currentAttendeeInfo . attendeeId ) left the meeting " )
}
}
func attendeesDidDrop ( attendeeInfo : [ AttendeeInfo ] ) {
for currentAttendeeInfo in attendeeInfo {
logger . info ( msg : " ( currentAttendeeInfo . attendeeId ) dropped from the meeting " )
}
}
func attendeesDidMute ( attendeeInfo : [ AttendeeInfo ] ) {
for currentAttendeeInfo in attendeeInfo {
logger . info ( msg : " ( currentAttendeeInfo . attendeeId ) muted " )
}
}
func attendeesDidUnmute ( attendeeInfo : [ AttendeeInfo ] ) {
for currentAttendeeInfo in attendeeInfo {
logger . info ( msg : " ( currentAttendeeInfo . attendeeId ) unmuted " )
}
}
meetingSession . audioVideo . addRealtimeObserver ( observer : self )
}
Sie können das activeSpeakerDidDetect
-Ereignis verwenden, um die Videofliesen des aktivsten Sprechers zu vergrößern oder zu betonen. Durch Einstellen der scoreCallbackIntervalMs
und der Implementierung activeSpeakerScoreDidChange
können Sie regelmäßig Punktzahlen der aktiven Lautsprecher erhalten.
class MyActiveSpeakerObserver : ActiveSpeakerObserver {
let activeSpeakerObserverId = UUID ( ) . uuidString
var observerId : String {
return activeSpeakerObserverId
}
func activeSpeakerDidDetect ( attendeeInfo : [ AttendeeInfo ] ) {
if !attendeeInfo . isEmpty {
logger . info ( msg : " ( attendeeInfo [ 0 ] . attendeeId ) is the most active speaker " )
}
}
var scoresCallbackIntervalMs : Int {
return 1000 // 1 second
}
func activeSpeakerScoreDidChange ( scores : [ AttendeeInfo : Double ] ) {
let scoresInString = scores . map { ( score ) -> String in
let ( key , value ) = score
return " ( key . attendeeId ) : ( value ) "
} . joined ( separator : " , " )
logger . info ( msg : " Scores of active speakers are: ( scoresInString ) " )
}
// Calculating the active speaker base on the SDK provided policy, you can provide any custom algorithm
meetingSession . audioVideo . addActiveSpeakerObserver ( policy : DefaultActiveSpeakerPolicy ( ) , observer : self )
}
Hinweis: Sie müssen das Video an
VideoRenderView
binden, um das Video anzuzeigen.Eine lokale Videofliese kann mit
isLocalTile
Eigenschaft identifiziert werden.Ein Content -Video -Fliese kann mit
isContent
-Eigenschaft identifiziert werden. Siehe Bildschirm und Inhaltsheigung.Eine Kachel wird mit einer neuen Kachel -ID erstellt, wenn derselbe entfernte Teilnehmer das Video neu startet.
Weitere Details zum Hinzufügen/Entfernen/Anzeigen von Videos finden Sie beim Erstellen einer Besprechungsanwendung auf iOS mit dem Amazon Chime SDK.
Sie können startRemoteVideo
anrufen, um Remote -Videos zu empfangen, da dies nicht standardmäßig passiert.
meetingSession . audioVideo . startRemoteVideo ( )
stopRemoteVideo
hört nicht mehr, Remote -Videos zu empfangen und onVideoTileRemoved
für vorhandene Remote -Videos auszulösen.
meetingSession . audioVideo . stopRemoteVideo ( )
class MyVideoTileObserver : VideoTileObserver {
func videoTileDidAdd ( tileState : VideoTileState ) {
// Ignore local video (see View local video), content video (see Screen and content share)
if tileState . isLocalTile || tileState . isContent {
return
}
let videoRenderView = /* a VideoRenderView object in your application to show the video */
meetingSession . audioVideo . bind ( videoView : videoRenderView , tileId : tileState . tileId )
}
func videoTileDidRemove ( tileState : VideoTileState ) {
// unbind video view to stop viewing the tile
meetingSession . audioVideo . unbindVideoView ( tileId : tileState . tileId )
}
meetingSession . audioVideo . addVideoTileObserver ( observer : self )
}
// Use internal camera capture for the local video
meetingSession . audioVideo . startLocalVideo ( )
// Use internal camera capture and set configuration for the video, e.g. simulcastEnabled, maxBitRateKbps
// If maxBitRateKbps is not set, it will be self adjusted depending on number of users and videos in the meeting
// This can be called multiple times to enable/disable simulcast and adjust video max bit rate on the fly
let localVideoConfig = LocalVideoConfiguration ( simulcastEnabled : true, maxBitRateKbps : 600 )
meetingSession . audioVideo . startLocalVideo ( config : localVideoConfig )
// You can switch camera to change the video input device
meetingSession . audioVideo . switchCamera ( )
// Or you can inject custom video source for local video, see custom video guide
meetingSession . audioVideo . stopLocalVideo ( )
Hinweis: Das lokale Video sollte gespiegelt werden. Setzen Sie Videorenderview.mirror = true
class MyVideoTileObserver : VideoTileObserver {
func videoTileDidAdd ( tileState : VideoTileState ) {
if tileState . isLocalTile {
let localVideoView = /* a VideoRenderView object in your application to show the video */
meetingSession . audioVideo . bind ( videoView : localVideoView , tileId : tileState . tileId )
}
}
}
func videoTileDidRemove ( tileState : VideoTileState ) {
// unbind video view to stop viewing the tile
meetingSession . audioVideo . unbindVideoView ( tileId : tileState . tileId )
}
meetingSession . audioVideo . addVideoTileObserver ( observer : self )
}
Für fortgeschrittene Video -Fliesen -Management finden Sie einen Blick auf die Video -Pagination.
HINWEIS: Wenn Sie oder andere Teilnehmer Inhalte (z. B. Bildschirmaufnahme oder ein anderes Videosource-Objekt) teilen, schließt sich der Inhaltsbesucher (Teilnehmer-ID-Inhalt) der Sitzung an und teilt Inhalte so, als ob ein regulärer Teilnehmer ein Video teilt.
Zum Beispiel ist Ihr Teilnehmer-ID "my-id". Wenn Sie
meetingSession.audioVideo.startContentShare
anrufen, wird der Inhaltsbeauftragte "My-ID#Inhalt" der Sitzung beitreten und Ihre Inhalte weitergeben.
class MyContentShareObserver : ContentShareObserver {
func contentShareDidStart ( ) {
logger . info ( msg : " Content Share has started " )
}
func contentShareDidStop ( status : ContentShareStatus ) {
logger . info ( msg : " Content Share has stopped " )
}
meetingSession . audioVideo . addContentShareObserver ( observer : self )
let contentShareSource = /* a ContentShareSource object, can use InAppScreenCaptureSource for screen share or any subclass with custom video source */
// ContentShareSource object is not managed by SDK, builders need to start, stop, release accordingly
meetingSession . audioVideo . startContentShare ( source : contentShareSource )
}
Sie können die Konfiguration für die Inhaltsfreigabe, z. B. MaxbitrateKbps, festlegen. Die tatsächliche Qualität kann im Laufe des Anrufs variieren, je nachdem, welches System und das Netzwerk bereitstellen können.
let contentShareConfig = LocalVideoConfiguration ( maxBitRateKbps : 200 )
meetingSession . audioVideo . startContentShare ( source : contentShareSource , config : contentShareConfig )
Weitere Informationen finden Sie in den Inhalten Freigabe.
meetingSession . audioVideo . stopContentShare ( )
Chime SDK ermöglicht zwei gleichzeitige Inhaltsanteile pro Meeting. Remote -Inhaltsanteile auslösen onVideoTileAdded
, während die lokale Aktien nicht der Fall sind. Um das Video zur Vorschau zu rendern, fügen Sie der VideoSource
in der ContentShareSource
einen VideoSink
hinzu.
class MyVideoTileObserver : VideoTileObserver {
func videoTileDidAdd ( tileState : VideoTileState ) {
if ( tileState . isContent ) {
// tileState.attendeeId is formatted as "attendee-id#content"
let attendeeId = tileState . attendeeId
// Get the attendee ID from "attendee-id#content"
let baseAttendeeId = DefaultModality ( attendeeId ) . base ( )
logger . info ( msg : " $baseAttendeeId is sharing screen " )
let screenVideoView = /* a VideoRenderView object in your application to show the video */
meetingSession . audioVideo . bindVideoView ( videoView : screenVideoView , tileId : tileState . tileId )
}
}
func videoTileDidRemove ( tileState : VideoTileState ) {
meetingSession . audioVideo . unbindVideoView ( tileId : tileState . tileId )
}
meetingSession . audioVideo . addVideoTileObserver ( observer : self )
}
Weitere verfügbare Metriken finden Sie ObservableMetric
Beobachtung und Überwachung von Audio-, Video- und Inhaltsfreigabequalität.
class MyMetricsObserver : MetricsObserver {
func metricsDidReceive ( metrics : [ AnyHashable : Any ] ) {
logger . info ( msg : " Media metrics have been received: ( metrics ) " )
}
meetingSession . audioVideo . addMetricsObserver ( observer : self )
}
Sie können nach Beginn der Besprechungssitzung Echtzeitnachrichten von mehreren Themen erhalten.
class MyDataMessageObserver : DataMessageObserver {
let dataMessageTopic = " chat "
// A throttled message is returned by backend from local sender
func dataMessageDidReceived ( dataMessage : DataMessage ) {
logger . info ( msg : " ( dataMessage . timestampMs ) ( dataMessage . text ( ) ) ( dataMessage . senderAttendeeId ) " )
}
// You can also subscribe to multiple topics.
meetingSession . audioVideo . addRealtimeDataMessageObserver ( topic : dataMessageTopic , observer : self )
}
Sie können Echtzeitnachrichten an ein beliebiges Thema senden, zu dem die abonnierten Beobachter benachrichtigt werden.
Hinweis: Das Thema muss alpha-numerisch sein und es kann Bindestrich und Unterstrich enthalten. Die Daten dürfen 2 KB nicht überschreiten und die Lebensdauer ist optional, aber positive Ganzzahl.
let dataMessageTopic = " chat "
let dataMessageLifetimeMs = 1000
do {
// Send "Hello Chime" to any subscribers who are listening to "chat" topic with 1 seconds of lifetime
try meetingSession
. audioVideo
. realtimeSendDataMessage ( topic : dataMessageTopic ,
data : " Hello Chime " ,
lifetimeMs : dataMessageLifetimeMs )
} catch let err as SendDataMessageError {
logger . error ( msg : " Failed to send message! ( err ) " )
} catch {
logger . error ( msg : " Unknown error ( error . localizedDescription ) " )
}
HINWEIS: Entfernen Sie alle Beobachter und Freigabe von Ressourcen, die Sie hinzugefügt haben, um Speicherlecks zu vermeiden.
class MyAudioVideoObserver : AudioVideoObserver {
func audioSessionDidStopWithStatus ( sessionStatus : MeetingSessionStatus ) {
// This is where meeting ended.
// You can do some clean up work here.
}
func videoSessionDidStopWithStatus ( sessionStatus : MeetingSessionStatus ) {
// This will be invoked as well.
}
meetingSession . audioVideo . addAudioVideoObserver ( observer : self )
meetingSession . audioVideo . stop ( )
}
Amazon Voice Focus reduziert den Hintergrundgeräusch im Meeting, um bessere Besprechungserfahrungen zu erzielen. Weitere Informationen finden Sie unter Amazon Voice Focus.
let enabled = audioVideo . realtimeSetVoiceFocusEnabled ( enabled : true ) // enabling Amazon Voice Focus successful
let disabled = audioVideo . realtimeSetVoiceFocusEnabled ( enabled : false ) // disabling Amazon Voice Focus successful
Mit benutzerdefinierten Videoquelle können Sie das Video steuern, z. B. das Anwenden eines Videofilters. Weitere Informationen finden Sie unter benutzerdefiniertes Video.
Ab Version 0.23.3 sendet der SDK redundante Audiodaten an unsere Server zum Erkennen von Paketverlust, um die Auswirkungen auf die Audioqualität zu verringern. Redundante Audiopakete werden nur für Pakete mit aktivem Audio, dh Spect oder Musik verschickt. Dies kann die von Audio konsumierte Bandbreite auf bis zu dreifache normaler Betrag erhöhen, abhängig von der Höhe des erkannten Paketverlusts. Das SDK hört automatisch auf, redundante Daten zu senden, wenn er 5 Minuten lang keinen Paketverlust erkannt hat.
Wenn Sie diese Funktion deaktivieren müssen, können Sie dies über die audiovideoconfiguration tun, bevor Sie die Sitzung starten.
meetingSession . audioVideo . start ( AudioVideoConfiguration ( enableAudioRedundancy : false ) )
Obwohl es eine Option gibt, um die Funktion zu deaktivieren, empfehlen wir, sie für eine verbesserte Audioqualität aktiviert zu halten. Ein möglicher Grund, dies zu deaktivieren, könnte sein, wenn Ihre Kunden sehr strenge Bandbreitenbeschränkungen haben.
Siehe allgemeine FAQ für Amazon Chime SDK.
Anwendungen können Protokolle von Chime SDK erhalten, indem sie beim Erstellen von Besprechungen Instanzen von Logger bestehen. Amazon Chime SDK verfügt über einige Standardimplementierungen von Logger, die Ihre Anwendung verwenden kann, z. B. Consolelogger, das sich in die Konsole anmeldet. ConsoleLogger
wird als Standard auf INFO
-Ebene eingestellt. Um alle Protokolle, einschließlich Medienprotokolle, zu erhalten, erstellen Sie Logger, indem Sie folgen:
logger = ConsoleLogger ( name : " logger " , level : . DEFAULT )
Sie und Ihre Endbenutzer sind für alle Inhalte (einschließlich aller Bilder) verantwortlich Ihrer Vereinbarung mit Amazon (einschließlich der Dokumentation, den AWS -Servicebedingungen oder der akzeptablen Nutzungsrichtlinie).
Copyright Amazon.com, Inc. oder seine verbundenen Unternehmen. Alle Rechte vorbehalten.