Capture vidéo personnalisée
Vue d'ensemble
L'API Video de Vonage permet d'apporter des modifications au capteur vidéo afin de l'utiliser dans des applications Android et iOS.
Ce mode d'emploi aborde les points suivants :
- Apportez des modifications au capteur vidéo dans votre application Android Vonage Video.
- Apportez des modifications au capteur vidéo dans votre application iOS Vonage Video.
Android
Avant de commencer
Le code de cette section est disponible dans le projet Basic-Video-Capturer-Camera-2-Java du projet opentok-android-sdk-samples repo. Si vous ne l'avez pas encore fait, vous devrez cloner le repo dans un répertoire local. Sur la ligne de commande, exécutez :
Ouvrez le projet Basic-Video-Capturer-Camera-2-Java dans Android Studio pour le suivre.
Explorer le code
Dans cet exemple, l'application utilise un capteur vidéo personnalisé pour reproduire une image vidéo. Cela permet d'illustrer les principes de base de la mise en place d'un capteur vidéo personnalisé.
MirrorVideoCapturer est une classe personnalisée qui étend la classe BaseVideoCapturer (définie dans le SDK Android). La classe BaseVideoCapturer vous permet de définir un capteur vidéo personnalisé qui sera utilisé par un éditeur vidéo Vonage :
Les getCaptureSettings() fournit les paramètres utilisés par le capteur vidéo personnalisé :
Les BaseVideoCapturer.CaptureSetting (qui définit la propriété capturerSettings) est définie par le SDK Android. Dans cet exemple de code, le format du capteur vidéo est défini pour utiliser NV21 comme format de pixel, avec un nombre spécifique d'images par seconde, une hauteur spécifique et une largeur spécifique.
Les BaseVideoCapturer startCapture() est appelée lorsqu'un éditeur commence à capturer de la vidéo pour l'envoyer en tant que flux à la session. Cela se produit après que la méthode Session.publish(publisher) est appelée :
iOS
Avant de commencer
Le code de cette section se trouve dans le projet Basic Video Capturer du répertoire opentok-ios-sdk-samples, donc si vous ne l'avez pas encore fait, vous devrez cloner le répertoire dans un répertoire local - cela peut être fait en utilisant la ligne de commande :
Changez de répertoire pour accéder au projet Basic Video Capturer :
Installez ensuite la dépendance vidéo de Vonage :
Explorer le code
Ce projet vous montre comment apporter des modifications mineures au capteur vidéo utilisé par la classe OTPublisher. Ouvrez le projet dans Xcode pour le suivre.
Dans cet exemple, l'application utilise un capteur vidéo personnalisé pour publier des pixels aléatoires (bruit blanc). Il s'agit simplement d'illustrer les principes de base de la configuration d'un capteur vidéo personnalisé. (Pour un exemple plus pratique, voir les exemples Camera Video Capturer et Screen Video Capturer, décrits dans les sections suivantes).
Dans le ViewController principal, après avoir appelé [_session publish:_publisher error:&error] pour initier la publication d'un flux audio-vidéo, le videoCapture de l'objet OTPublisher est définie comme une instance de OTKBasicVideoCapturer :
OTKBasicVideoCapturer est une classe personnalisée qui met en œuvre le protocole OTVideoCapture (défini dans le SDK iOS de Vonage Video). Ce protocole vous permet de définir un capteur vidéo personnalisé qui sera utilisé par un éditeur Vonage Video.
Les [OTVideoCapture initCapture:] initialise les paramètres de capture à utiliser par le capteur vidéo personnalisé. Dans l'implémentation personnalisée de OTVideoCapture de cet exemple (OTKBasicVideoCapturer), la méthode initCapture définit les propriétés de l'élément format de l'instance OTVideoCapture :
La classe OTVideoFormat (qui définit cette classe de format ) est défini par le SDK iOS de Vonage Video. Dans cet exemple de code, le format du capteur vidéo est défini pour utiliser ARGB comme format de pixel, avec un nombre spécifique d'octets par ligne, une hauteur spécifique et une largeur spécifique.
Les [OTVideoCapture setVideoCaptureConsumer] définit un objet OTVideoCaptureConsumer (défini par le SDK Vonage Video iOS) que le consommateur vidéo utilise pour transmettre des images vidéo au flux de l'éditeur. Dans l'OTKBasicVideoCapturer, cette méthode définit une instance locale d'OTVideoCaptureConsumer en tant que consommateur :
Les [OTVideoCapture startCapture:] est appelée lorsqu'un éditeur commence à capturer la vidéo pour l'envoyer en tant que flux à la session Vonage Video. Cela se produit après que la méthode [Session publish: error:] est appelée. Dans l'OTKBasicVideoCapturer de cette méthode, l'élément [self produceFrame] est appelée sur une file d'attente en arrière-plan après un intervalle défini :
Les [self produceFrame] génère un objet OTVideoFrame (défini par le SDK Vonage Video iOS) qui représente une image vidéo. Dans ce cas, la trame contient des pixels aléatoires remplissant la hauteur et la largeur définies pour le format de l'échantillon vidéo :
La méthode transmet le cadre à la fonction [consumeFrame] de l'instance de l'OTVideoCaptureConsumer utilisée par ce capteur vidéo (décrit ci-dessus). L'éditeur envoie alors la trame de données au flux vidéo de la session.
Le code de cet exemple est également inclus dans le fichier Capteur vidéo de base du repo opentok-ios-sdk-samples. Pour l'utiliser, décommentez la ligne suivante :
Commentez ensuite la ligne de la partie 1 :
Ce projet vous montre comment utiliser un capteur vidéo personnalisé en utilisant la caméra de l'appareil comme source vidéo.
Cet exemple de code utilise le cadre Apple AVFoundation pour capturer une vidéo à partir d'une caméra et la publier dans une session connectée. La classe ViewController crée une session, instancie les abonnés et configure l'éditeur. La classe captureOutput crée une image, effectue une capture d'écran, marque l'image avec un horodatage et l'enregistre dans une instance du consommateur. L'éditeur accède au consommateur pour obtenir la trame vidéo.
Comme cet exemple doit accéder à la caméra de l'appareil, vous devez le tester sur un appareil iOS. Vous ne pouvez pas le tester dans le simulateur iOS.
Les [OTKBasicVideoCapturerCamera initWithPreset: andDesiredFrameRate:] est un initialisateur de la classe OTKBasicVideoCapturerCamera. Elle appelle la méthode sizeFromAVCapturePreset pour définir la résolution de l'image. La taille de l'image et la fréquence d'images sont également définies ici. Une file d'attente distincte est créée pour la capture des images, afin de ne pas affecter la file d'attente de l'interface utilisateur.
Les sizeFromAVCapturePreset identifie la valeur de la chaîne de caractères de la résolution de l'image dans le cadre iOS AVFoundation et renvoie une représentation CGSize.
La mise en œuvre de la [OTVideoCapture initCapture] utilise le cadre AVFoundation pour configurer la caméra afin de capturer des images. Dans la première partie de la méthode, une instance de AVCaptureVideoDataOutput est utilisée pour produire des images :
Les images capturées à l'aide de cette méthode sont accessibles à l'aide de la fonction [AVCaptureVideoDataOutputSampleBufferDelegate captureOutput:didOutputSampleBuffer:fromConnection:] méthode déléguée. L'objet AVCaptureDevice représente la caméra et ses propriétés. Il fournit des images capturées à un objet AVCaptureSession.
La deuxième partie de la initCapture appelle la méthode bestFrameRateForDevice afin d'obtenir le meilleur taux de rafraîchissement pour la capture d'images :
Les [self bestFrameRateForDevice] renvoie la meilleure fréquence d'images pour le dispositif de capture :
Le cadre AVFoundation exige une plage minimale et maximale de fréquences d'images pour optimiser la qualité d'une capture d'image. Cette plage est définie dans le champ bestFrameRate objet. Pour des raisons de simplicité, les taux de rafraîchissement minimum et maximum sont identiques, mais vous pouvez définir vos propres taux de rafraîchissement minimum et maximum pour obtenir une meilleure qualité d'image en fonction de la vitesse de votre réseau. Dans cette application, la fréquence d'images et la résolution sont fixes.
Cette méthode définit le consommateur de capture vidéo, conformément au protocole OTVideoCaptureConsumer.
Les [OTVideoCapture captureSettings] définit le format des pixels et la taille de l'image utilisée par le capteur vidéo, en définissant les propriétés de l'objet OTVideoFormat.
Les [OTVideoCapture currentDeviceOrientation] interroge l'orientation de l'image dans le cadre AVFoundation et renvoie son équivalent défini par l'enum OTVideoOrientation dans le SDK iOS de Vonage Video.
La mise en œuvre de la [OTVideoCapture startCapture] est appelée lorsque l'éditeur commence à capturer la vidéo à publier. Elle appelle la méthode [AVCaptureSession startRunning] de l'objet AVCaptureSession :
Les [AVCaptureVideoDataOutputSampleBufferDelegate captureOutput:didOutputSampleBuffer:fromConnection:] est appelée lorsqu'une nouvelle image vidéo est disponible à partir de la caméra.
Cette méthode permet d'effectuer les opérations suivantes :
Crée une instance OTVideoFrame pour définir la nouvelle image vidéo.
Enregistre un tampon d'image dans la mémoire en fonction de la taille de l'image.
Écrit les données d'image de deux plans dans une mémoire tampon. Comme l'image est une NV12, ses données sont réparties sur deux plans. Il y a un plan pour les données Y et un plan pour les données UV. Une boucle for est exécutée pour parcourir les deux plans et écrire leurs données dans une mémoire tampon.
Crée un horodatage pour marquer une image capturée. Chaque image est marquée d'un horodatage afin que l'éditeur et l'abonné puissent créer la même chronologie et référencer les images dans le même ordre.
Appelle le
[OTVideoCaptureConsumer consumeFrame:]en transmettant l'objet OTVideoFrame. L'éditeur envoie alors la trame dans le flux qu'il publie.
La mise en œuvre de la [AVCaptureVideoDataOutputSampleBufferDelegate captureOutput:didDropSampleBuffer:fromConnection] est appelée chaque fois qu'il y a un retard dans la réception des trames. Elle laisse tomber les trames pour que la publication dans la session se poursuive sans interruption :