Implémentation de RtspServer et optimisation de la transmission vidéo haute définition, haute résolution et haut débit basée sur Live555

Implémentation de RtspServer et optimisation de la transmission vidéo haute définition, haute résolution et haut débit basée sur Live555

Récemment, j'ai réalisé quelques projets de serveur RTSP pour PC et plates-formes embarquées. La plupart des exigences sont des fonctions simples mais complètes, et les performances sont encore plus fortes. Après un examen approfondi, le développement est essentiellement basé sur Live555. Après avoir optimisé Live555 lui-même et optimisé la transmission des données vidéo au sein du programme, non seulement les exigences ont été satisfaites, mais les performances ont également dépassé les attentes, atteignant 1080p avec un débit de code élevé de 10 Mbps . streaming de vidéo HD aux résolutions ci-dessus . Voici quelques points d’optimisation à partager :

Pourquoi développer sur la base de Live555

En fait, j'ai déjà développé un programme de serveur RTSP et j'ai écrit un article pour le présenter " Conception et implémentation d'un serveur Rtsp et introduction à RTSP2.0 ". Cependant, le but du développement à cette époque n'était pas seulement de réaliser une diffusion en direct RTSP. , mais aussi pour le simplifier. Le code est conçu pour faciliter la personnalisation, il n'implémente donc pas entièrement tous les détails d'interaction dans le protocole RTSP. L'étendre complètement sur cette base peut retarder l'avancement du projet. Sur la base de considérations liées au projet, j'ai choisi Live555, un projet open source RTSP que je connais bien et que je trouve excellent, comme base pour développer le programme RTSP Server.

Live555 est une solution multimédia de streaming multiplateforme qui utilise C++ comme langage de développement. Elle implémente l'intégralité de la structure RTSP, y compris le serveur-client, et prend en charge H.264, H.265, MPEG, AAC et d'autres encodages vidéo et audio. Un projet open source très connu. En tant que serveur RTSP, le code source contient uniquement des sources vidéo pour les fichiers locaux, mais il est hautement évolutif et peut développer des programmes de service adaptés aux besoins de votre propre projet sur la base de certaines classes de base fournies par Live555.

Architecture Live555 et flux de données RTSP

Module de base de Live555

Le processus d'interaction entre le serveur RTSP et le client

Module multimédia de streaming Live555 et flux de traitement du serveur

Le module de streaming multimédia de Live555 est essentiellement divisé en deux parties : Source et Sink. Bien entendu, ils ont également une classe de base commune Medium. Pour le serveur, Source est la source de données et Sink est la sortie des données. Les données vidéo sont transmises à MediaSink via MediaSource et finalement transmises au client via le réseau RTPInterface. Voici les modules et relations d'héritage utilisés par le serveur :

Insérer la description de l'image ici

Comme le montre la figure ci-dessus, en complétant vos propres ServerMediaSubsession et MediaSource, vous pouvez transmettre les données codées H.264 qui doivent être diffusées à live555 pour obtenir une diffusion en direct RTSP.

Points d'optimisation pour la transmission de données vidéo à haut débit

Pour les images vidéo haute définition et à haut débit, les données vidéo de chaque image seront relativement volumineuses, et cette valeur dépassera souvent la taille de traitement de la mémoire interne par défaut du live555, car l'optimisation du live555 se concentre principalement sur l'extension de la mémoire. taille du tampon et éviter la copie des données de la mémoire. Les points suivants sont des points d'optimisation efficaces résumés sur la base du développement et des tests réels :

  1. La taille du tampon d'analyse de trame étendue, c'est-à-dire BANK_SIZE, a une valeur par défaut de 150 Ko et est définie sur au moins 300 Ko en fonction de la taille de la trame de données H264 transmise. Sinon, s'il dépasse la taille, il risque d'être abandonné par Live555.
  2. Augmentez la taille de OutPacketBuffer::maxSize, également pour prendre en charge des données de trame surdimensionnées, sinon une perte de données pourrait se produire.
  3. Dans RTPInterface, augmentez la taille du tampon d'envoi du socket, c'est-à-dire la valeur du paramètre de la fonction IncreaseSendBufferTo
  4. Pour MultiFramedRTPSink::sendPacketIfNecessary,vous pouvez appeler directement sendNext pour essayer de former un message RTP pour envoyer un paquet de données. L'avantage de cette modification est que les données lues seront envoyées dès que possible, mais cela prendra également plus de temps. temps de fil.
  5. Lorsqu'une application transfère des données de son propre thread vers Live555, elle doit minimiser les copies de mémoire, de préférence via un pool de mémoire, pour éviter que la copie de mémoire ne bloque la boucle d'événements Live555.

Après les modifications ci-dessus et l'optimisation du code interne de l'application, dans les applications réelles, une diffusion en direct fluide de vidéos HD haute résolution supérieure à 1080p avec un débit binaire élevé de 10 Mbps a été obtenue.


Veuillez contacter QQ pour coopérer. (Veuillez indiquer l'auteur et la source lors de la réimpression~)


Je suppose que tu aimes

Origine blog.csdn.net/haibindev/article/details/84101693
conseillé
Classement