H.264 sur RTP - Identifier les trames SPS et PPS
J'ai cru H. 264 Flux à partir d'une Caméra IP emballés dans des RTP images. Je veux obtenir raw H. 264 de données dans un fichier afin que je puisse le convertir avec ffmpeg
.
Donc quand je veux écrire les données dans mes brutes H. 264 fichier que j'ai découvert il doit ressembler à ceci:
00 00 01 [SPS]
00 00 01 [PPS]
00 00 01 [NALByte]
[PAYLOAD RTP Frame 1] //Payload always without the first 2 Bytes -> NAL
[PAYLOAD RTP Frame 2]
[... until PAYLOAD Frame with Mark Bit received] //From here its a new Video Frame
00 00 01 [NAL BYTE]
[PAYLOAD RTP Frame 1]
....
Donc, je reçois le SPS
et la PPS
de la Session Description Protocol
de mon précédent RTSP
de la communication. En outre, l'appareil envoie le SPS
et la PPS
dans deux messages avant de commencer avec le flux vidéo elle-même.
Donc je capture les messages dans l'ordre:
1. Preceding RTSP Communication here ( including SDP with SPS and PPS )
2. RTP Frame with Payload: 67 42 80 28 DA 01 40 16 C4 //This is the SPS
3. RTP Frame with Payload: 68 CE 3C 80 //This is the PPS
4. RTP Frame with Payload: ... //Video Data
Puis il y a des Images avec une Charge utile et à un certain moment, RTP Cadre avec la Marker Bit = 1
. Cela signifie, si j'ai bien compris) que j'ai une vision complète de l'image vidéo. D'après ce que j'écris le Préfixe de la Séquence ( 00 00 01
) et le NAL
à partir de la charge utile et aller à nouveau sur la même procédure.
Maintenant, mon appareil photo m'envoie après chaque 8 des Images Vidéo à la SPS
et la PPS
de nouveau. ( Encore une fois en deux RTP Images, comme on le voit dans l'exemple ci-dessus ). Je sais que, en particulier le PPS
pouvez modifier le streaming mais ce n'est pas le problème.
Mes questions maintenant:
1. Dois-je écrire le SPS/PPS tous les 8 Image de la Vidéo?
Si mon SPS
et mon PPS
ne pas changer, il suffit de les avoir écrit au tout début de mon fichier et rien de plus?
2. Comment distinguer entre SPS/PPS et normal RTP Cadres?
Dans mon Code C++ qui analyse les données transmises j'ai besoin de faire une différence entre les RTP Images avec la normale de la Charge utile d'un de ceux portant la SPS/PPS
. Comment les distinguer? Bon, SPS/PPS
cadres sont généralement plus petites, mais ce n'est pas un enregistrement d'appel à compter. Parce que si je les ignore j'ai besoin de savoir quelles données je peux jeter, ou si j'ai besoin de l'écrire j'ai besoin de mettre la 00 00 01
Préfixe devant eux. ? Ou est-ce une règle fixe qui ils se produisent tous les 8 Image de la Vidéo?
source d'informationauteur Toby
Vous devez vous connecter pour publier un commentaire.
Que je me souvienne, nal_unit_type est inférieure à 5 bits du 1er octet d'un bloc.
Vous devriez écrire SPS et SPA au départ de ruisseau, et seulement quand elles changent dans le milieu du cours d'eau.
SPS et PPS images sont emballés dans un STAP NALE de l'unité (généralement STAP-A) avec NAL type 24 (STAP) ou 25 (PACT-B) le STAP format est décrit dans RFC-3984 section 5.7.1
Ne comptez pas sur le marqueur bits, utiliser un bit de départ et de fin de bits NALE en-tête.
Pour fragmenté images vidéo, vous devez régénérer NALE de l'unité à l'aide de 3 NALE de l'unité de bits du premier fragment (F, NRI) combiné avec 5 NALE type de bits du premier octet de la charge utile (uniquement pour les paquets avec un bit de départ est fixé à 1) vérifier RFC-3984 la section 5.8:
EDIT: plus d'explications sur l'NALE de l'unité de construction pour la fragmentation des unités:
c'est deux premiers octets d'un FU-UNE charge utile (juste après l'en-tête rtp):
pour construire la dernière unité vous devez prendre "Type" de "FU-Tête" et "F" et "NRI" à partir de "FU" indicateur de
ici est une simple mise en œuvre