Réglage du son et de l'image — Android
Vous pouvez régler les paramètres audio et vidéo de publié et abonné flux :
- Publication d'audio ou de vidéo uniquement
- Publication dans une session vocale uniquement
- Sélection de la caméra utilisée par un éditeur
- Mise en miroir de l'affichage local d'une vidéo d'un éditeur
- Détecter le changement de caméra de l'éditeur
- Réglage de la résolution et de la fréquence d'images d'une vidéo
- Activation de la torche de l'appareil photo (lampe de poche)
- Réglage du zoom de l'appareil photo
- Utilisation d'un capteur vidéo personnalisé
- Utilisation d'un pilote audio personnalisé
- Application de transformations audio et vidéo aux flux publiés
- Réglage de la qualité audio
- Configuration du mode de sortie audio pour une session vocale
- Réduction de la bande passante audio avec Opus DTX
- Réglage du volume audio pour un abonné
- Abonnement audio ou vidéo uniquement
- Détecter si un flux contient de l'audio ou de la vidéo
- Définition des préférences de l'éditeur en matière de dégradation de la qualité vidéo
Publication d'audio ou de vidéo uniquement
Vous pouvez activer ou désactiver le son et la vidéo en appelant la fonction setPublishAudio() et setPublishVideo() méthodes de l'objet Publisher (en leur transmettant une valeur booléenne). Par exemple, le code suivant désactive le son :
mPublisher.setPublishAudio(false);
Publication dans une session vocale uniquement
Pour mettre en place un voix seulement appeler la session videoTrack() de l'objet Publisher.Builder, en passant par la méthode false, lorsque vous instanciation de chaque objet Publisher dans la session. Par exemple, le code suivant crée un éditeur pour une session vocale uniquement :
mPublisher = new Publisher.Builder(context)
.name("Bob's video")
.videoTrack(false)
.build();
Sélection de la caméra utilisée par un éditeur
Vous pouvez passer d'une caméra à l'autre pour publier un flux en appelant la fonction cycleCamera() de l'objet Publisher :
mPublisher.cycleCamera();
Si vous utilisez un capteur vidéo personnalisé, utilisez la fonction BaseVideoCapturer.CaptureSwitch pour définir le comportement de l'interface Publisher.cycleCamera() méthode.
Mise en miroir de l'affichage local d'une vidéo d'un éditeur
Vous pouvez régler la mirrorInLocalRender de l'objet CaptureSettings renvoyé par l'appel à la fonction getCaptureSettings() de la méthode capturer d'un objet PublisherKit. Définissez cette propriété à true pour que la vidéo rendue localement par l'éditeur soit reflétée ou pour false pour ne pas l'avoir en miroir. Il est possible que vous souhaitiez mettre en miroir une vidéo lorsque vous utilisez une caméra frontale.
Vous pouvez également régler la mirrorInLocalRender propriété de l'objet CaptureSettings lors de la création d'un capteur vidéo personnalisé.
Ce paramètre n'affecte que la vidéo rendue dans l'application client de l'éditeur. Il n'a aucun effet sur la vidéo dans les clients abonnés.
Le capteur intégré d'un éditeur dispose de la vidéo rendue localement en miroir lorsqu'il utilise une caméra frontale, mais pas lorsqu'il utilise une caméra arrière.
Détecter le changement de caméra de l'éditeur
Lorsque l'appareil photo utilisé par l'éditeur change, la fonction changedCamera(Publisher publisher, int newCameraId)) de l'objet Publisher.CameraListener est appelée.
@Override
public void changedCamera(publisher, newCameraId) {
//The publisher's camera changed.
}
Réglage de la résolution et de la fréquence d'images d'une vidéo
Vous pouvez définir la résolution et la fréquence d'images d'un flux d'un éditeur en appelant la fonction resolution() et frameRate() méthodes de l'objet Publisher.Builder lorsque vous instanciation de l'objet Publisher:
mPublisher = new Publisher.Builder(context)
.name("Bob's video")
.resolution(CameraCaptureResolution.HIGH)
.frameRate(CameraCaptureFrameRate.FPS_30)
.build();
Veuillez noter que dans les sessions qui utilisent OpenTok Media Router (sessions avec le mode média Dans les sessions dont le mode média est défini sur routé, l'abaissement de la fréquence d'images réduit proportionnellement la bande passante utilisée par le flux. Toutefois, dans les sessions dont le mode média est défini sur relayé, la réduction de la fréquence d'images ne réduit pas la bande passante du flux.
Remarque : Voir le Guide du développeur 1080p pour les considérations relatives à l'utilisation de la résolution 1080p.
Activation de la torche de l'appareil photo (lampe de poche)
Appeler le Publisher.setCameraTorch() pour activer ou désactiver la lampe torche de l'appareil photo lors de la capture vidéo :
Publisher publisher = new Publisher.Builder(MainActivity.this).build();
// ...
publisher.setCameraTorch(true);
La valeur par défaut est false (la lampe de poche n'est pas utilisée).
Notez que toutes les caméras de l'appareil ne disposent pas d'une lampe torche. Si la caméra active ne prend pas en charge la fonctionnalité d'éclairage de la caméra (par exemple, la caméra frontale ne la prend généralement pas en charge), l'appel à cette méthode n'a aucun effet.
Réglage du zoom de l'appareil photo
Appeler le Publisher.setCameraZoomFactor() pour définir le taux (facteur) de zoom de l'appareil photo :
Publisher publisher = new Publisher.Builder(MainActivity.this).build();
// ...
publisher.setCameraZoomFactor(0.7);
La valeur du rapport/facteur est comprise entre 0,5 et le facteur de zoom maximal. Les valeurs comprises entre 0,5 et 1,0 représentent un ultra grand angle (zoom arrière), et les valeurs comprises entre 1,0 et le facteur de zoom maximal représentent un zoom avant. Le facteur de zoom réel appliqué est limité à la plage prise en charge par la configuration de la caméra active. Si la caméra ne prend pas en charge l'ultra grand angle, les facteurs de zoom définis en dessous de 1,0 ne seront pas pris en compte et aucun zoom ne sera appliqué. Pour les valeurs supérieures au facteur de zoom maximal pris en charge par la caméra, le facteur de zoom sera fixé à la valeur maximale prise en charge.
Utilisation d'un capteur vidéo personnalisé
Les classes Publisher implémentent un module de capture vidéo standard qui utilise directement la vidéo provenant de la caméra de l'appareil. Vous pouvez utiliser les classes PublisherKit pour implémenter un module de capture vidéo personnalisé.
Le SDK Android d'OpenTok comprend une classe `BaseVideoCapturer`. Redéfinissez cette classe pour créer un capteur vidéo personnalisé. Appelez la méthode capturer() de l'objet Publisher.Builder lorsque vous utilisez la méthode instanciation de l'objet Publisher:
// Use a custom video capturer.
// CustomVideoCapturer extends BaseVideoCapturer:
mCapturer = new CustomVideoCapturer();
mPublisher = new Publisher.Builder(context)
.name("Bob's video")
.capturer(mCapturer)
.build();
Sinon, si vous utilisez la classe PublisherKit pour définir une implémentation personnalisée de l'éditeur, vous pouvez définir le capturer propriété d'une classe qui hérite de la classe PublisherKit :
// Use a custom video capturer.
// CustomVideoCapturer extends BaseVideoCapturer:
mCapturer = new CustomVideoCapturer();
mPublisher.capturer = mCapturer;
Les getCaptureSettings() La méthode de la classe `BaseVideoCapturer` renvoie les paramètres du capteur vidéo, notamment la fréquence d'images, la largeur, la hauteur, le délai vidéo et le format vidéo du capteur. Votre objet capteur vidéo peut redéfinir cette méthode pour définir les paramètres personnalisés de votre capteur vidéo, comme illustré ci-dessous :
@Override
public CaptureSettings getCaptureSettings() {
// Set the preferred capturing size
configureCaptureSize(640, 480);
CaptureSettings settings = new CaptureSettings();
settings.fps = mCaptureFPS;
settings.width = mCaptureWidth;
settings.height = mCaptureHeight;
settings.format = NV21;
settings.expectedDelay = 0;
return settings;
}
Appeler le startCapture() méthode de l'objet « capteur vidéo » permettant de lancer la capture vidéo à partir du capteur vidéo personnalisé.
La classe `BaseVideoCapturer` comprend également un provideByteArrayFrame(byte[] data, int format, int width, int height, int rotation, boolean mirrorX) et provideIntArrayFrame(int[] data, int format, int width, int height, int rotation, boolean mirrorX). Vous appelez ces méthodes pour fournir une image vidéo sous la forme soit d'un tableau d'octets, soit d'un tableau d'entiers.
À titre d'exemple, consultez la classe `OpenTokVideoCapturer` dans l'application d'exemple `OpenTokHelloWorld`.
Utilisez un logiciel de capture vidéo personnalisé pour diffuser un flux de partage d'écran. Pour plus d'informations, consultez Partage d'écran.
Vous pouvez également utiliser un rendu vidéo personnalisé pour les vidéos.
Utilisation d'un pilote audio personnalisé
Par défaut, le SDK Android d'OpenTok utilise le microphone de l'appareil pour capturer le son à transmettre vers un flux publié. Il utilise également les haut-parleurs (ou le casque) pour lire le son provenant d'un flux auquel l'utilisateur est abonné. Créez une classe qui étend l'interface `BaseAudioDevice`, définie dans le SDK Android d'OpenTok :
public class CustomAudioDevice extends BaseAudioDevice
Appelez ensuite le AudioDeviceManager.setAudioDevice() méthode permettant de configurer l'application pour qu'elle utilise une instance de la classe de périphérique audio afin de capturer et de restituer des échantillons audio :
AudioDeviceManager.setAudioDevice(customAudioDevice);
La classe `BaseAudioDevice` dispose d'un getAudioBus() méthode qui renvoie un objet AudioBus, défini dans le SDK Android d'OpenTok. L'objet AudioBus dispose d'un readRenderData() méthode permettant de lire des échantillons audio à partir de flux audio auxquels on est abonné. Et elle dispose d'un a writeCaputureData() méthode permettant d'intégrer des extraits audio au flux audio de l'éditeur.
Pour des exemples, consultez les exemples « Basic-Audio-Driver » et « Advanced-Audio-Driver » dans le vonage-video-android-sdk-samples (référentiel sur GitHub).
Application de transformations audio et vidéo aux flux publiés
Vous pouvez utiliser les transformateurs prêts à l'emploi de la bibliothèque Vonage Media Processor ou créer votre propre transformateur audio ou vidéo personnalisé à appliquer à une vidéo publiée. Voir ce sujet.
Réglage de la qualité audio
Pour affiner la qualité audio d'un flux d'éditeur, les approches suivantes peuvent être utilisées :
Vous réglez le débit binaire audio pour un flux d'éditeur en appelant la fonction audioBitrate() de la méthode PublisherKit.Builder que vous utilisez pour instanciation d'un éditeur.
Le débit souhaité pour l'audio publié, en bits par seconde. Les valeurs prises en charge sont comprises entre 6 000 et 510 000 (les valeurs non valides sont ignorées). (Les valeurs non valides sont ignorées.) Définissez cette valeur pour permettre un son de haute qualité (ou pour réduire l'utilisation de la bande passante avec un son de qualité inférieure). Si vous ne définissez pas cette option, OpenTok attribue automatiquement un débit audio au flux.
Les paramètres suivants sont recommandés :
- 8 000 - 12 000 pour la parole en bande étroite (NB)
- 16 000 - 20 000 pour la parole à large bande (WB)
- 28 000 - 40 000 pour la parole en bande complète (FB)
- 48 000 - 64 000 pour la musique à bande complète (FB)
Configuration du mode de sortie audio pour une session vocale
Par défaut, le SDK OpenTok pour Android utilise le haut-parleur de l'appareil (plutôt que celui du casque) pour la lecture audio. Cette option est préférable pour les applications qui intègrent à la fois de la vidéo et de l'audio. Cependant, dans un session vocale uniquementil est préférable que l'audio soit lu par le haut-parleur de l'oreillette. Vous pouvez demander à l'application de le faire en effectuant l'appel suivant :
AudioDeviceManager.getAudioDevice().setOutputMode(
OutputMode.Handset);
Réduction de la bande passante audio avec Opus DTX
Opus DTX (transmission discontinue) est un codec audio permettant de réduire la consommation de bande passante lorsqu'un participant ne parle pas. Cela peut s'avérer utile lors de sessions de grande envergure comptant de nombreux participants audio. Pour activer Opus DTX, il suffit d'appeler la fonction enableOpusDtx() de la méthode PublisherKit.Builder que vous utilisez pour instanciation d'un éditeur. Pour plus d'informations, voir Article de la base de connaissances de Vonage Video API.
Réglage du volume audio pour un abonné
Vous pouvez régler individuellement le volume audio pour chaque abonné en appelant la fonction Subscriber.setAudioVolume() méthode.
Abonnement audio ou vidéo uniquement
Par défaut, un objet « Subscriber » est initialisé pour s'abonner aux flux audio et vidéo, s'ils sont disponibles.
Vous pouvez activer ou désactiver le son en appelant la fonction setSubscribeToAudio() de l'objet Abonné :
mSubscriber.setSubscribeToAudio(false); // audio off
mSubscriber.setSubscribeToAudio(true); // audio on
Vous pouvez activer ou désactiver la vidéo en appelant la fonction setSubscribeToVideo() de l'objet Abonné :
mSubscriber.setSubscribeToVideo(false); // video off
mSubscriber.setSubscribeToVideo(true); // video on
Notez toutefois que vous ne pouvez vous abonner à l'audio ou à la vidéo que si le client qui publie le flux inclut l'audio ou la vidéo. Par exemple, en appelant subscribeToVideo(false) n'aura aucun effet si le client qui publie le flux ne publie que de l'audio.
Détecter si un flux contient de l'audio ou de la vidéo
Vous pouvez consulter le hasAudio() et hasVideo() méthodes d'un objet Stream permettant de vérifier s'il contient du contenu audio ou vidéo
if (!mStream.hasAudio()) {
// You may want to adjust the user interface
}
if (!mStream.hasVideo()) {
// You may want to adjust the user interface
}
Par exemple, lorsque vous s'abonner à un flux, vous souhaiterez peut-être adapter l'interface utilisateur selon que le flux comporte du son ou de la vidéo. Par exemple, vous souhaiterez peut-être indiquer à l'utilisateur si un flux comporte du son ou non ; ou vous ne souhaiterez peut-être pas afficher la vue d'un abonné si le flux ne comporte pas de vidéo.
Définition des préférences de l'éditeur en matière de dégradation de la qualité vidéo
Lorsque la bande passante ou l'unité centrale sont limitées, le moteur vidéo peut réduire la fréquence d'images et/ou la résolution de la vidéo de l'éditeur pour s'adapter à ces limitations.
La « préférence de dégradation » est un paramètre de configuration qui permet d'ajuster ce comportement.
Les développeurs sont chargés de définir et d'appliquer les préférences de dégradation en fonction de leur cas d'utilisation et de leurs exigences.
Il s'agit d'une préférence, ce qui signifie que le moteur vidéo essaiera de suivre la préférence sélectionnée, mais il n'y a aucune garantie quant au résultat.
Cette préférence peut se comporter différemment lors de l'utilisation de vidéo évolutiveoù le moteur vidéo peut décider de supprimer des couches au lieu de dégrader la résolution.
Indice de contenu et la préférence de dégradation ont des objectifs différents mais liés : L'indication de contenu décrit le type de contenu transmis, tandis que la préférence de dégradation contrôle la stratégie d'encodage. Lorsque vous définissez une indication de contenu, le moteur vidéo détermine automatiquement la préférence de dégradation appropriée (par exemple, "texte" sélectionne automatiquement le maintien de la résolution). Une préférence de dégradation explicitement définie remplacera cette sélection automatique.
Vous pouvez définir cette valeur à l'aide de l'une des options suivantes DegradationPreference valeurs :
Non défini
mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceNotSet);
Valeur par défaut. Le moteur vidéo déterminera le niveau de dégradation optimal.
Conserver la fréquence d'images et la résolution
mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceMaintainFrameRateAndResolution);
Le moteur vidéo s'efforcera de maintenir une fréquence d'images constante sans réduire la résolution.
Maintenir la fréquence d'images
mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceMaintainFrameRate);
Le moteur vidéo s'efforcera de maintenir une fréquence d'images constante, mais pourra réduire la résolution si nécessaire.
Conserver la résolution
mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceMaintainResolution);
Le moteur vidéo ne réduira pas la résolution, mais pourra réduire la fréquence d'images si nécessaire.
Équilibré
mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceBalanced);
Le moteur vidéo s'efforcera de trouver un juste équilibre entre la réduction de la résolution et celle de la fréquence d'images lorsque cela s'avérera nécessaire.