2010-11-02 6 views
3

J'essaie d'analyser différentes trames mpeg4 à partir d'un flux rtp provenant d'une caméra d'axe, et d'alimenter les paquets en bibliothèque ffmpeg en utilisant la fonction avcodec_decode_video. voici les étapes que je fais 1. le flux de rtsp est initialisé 2. le flux de rtp commence à couler dans 3. Le premier paquet que je commence commence par 000001b0 ... et les données de configuration suivent et après que la trame commence par 000001b6. la deuxième charge utile de rtp sera différente, jusqu'à ce que j'obtienne un paquet de rtp où le bit de marqueur est placé. après que je reçois à nouveau paquet commençant par 000001b6 et se poursuit autour de 5-10 paquets rtp .. ce modèle repeastAnalyse des trames MPEG4 à partir des paquets rtp

ce que je fais est si je perçois 000001b0/b6 - i accumulera tous les paquets à venir après que et alimentez le buffer plus grand à la fonction avcodec_decode_video de libavcodec, après avoir initialisé correctement le contexte du décodeur.

Mais je reçois une image merdique ici, avec la partie la plus haute, une barre horizontale - une image limpide et le reste est merdique. Je ne sais pas pourquoi il se comporte comme ça. S'il vous plaît aidez-moi

Les données que je reçois dans le paquet rtp est dynamique-96.

point à noter: quand je passe les iframes et p frames qui est absorbé dans le protocole propreitary d'un autre fabricant le ffmpeg est capable d'analyser et de donner de très bons pcitures.

Toute aide est appréciée

Répondre

9

Essayez de jouer avec vos paramètres de flux MPEG4 sur la caméra AXIS IP. Faites attention sur la vidéo & image/partie avancée où vous devez définir ceci:

  1. Type d'objet vidéo: SIMPLE
  2. [x] ISMA conforme
  3. GOV Structure: IP

Aussi, essayez pour changer le paramètre "Priorité" ou "Optimiser le flux vidéo pour" (vous devez avoir la fréquence d'image, la qualité d'image, la bande passante, aucune).

Si rien de tout cela fonctionne, alors lisez la suite ...

J'espère que vous comprenez comment le flux MPEG4 est transmis sur RTP. En bref (si vous ne savez pas comment):

  1. "cadre de configuration" (séquence d'objets Visual Start) commence par un entier 000001B0 (hex). Il contient les données nécessaires pour qu'une vidéo soit décodée. Vous devez l'envoyer au décodeur uniquement la première fois que vous essayez de décoder un flux, et il est utilisé pour décoder tous les VOP qui le suivent. Notez que AXIS envoie ce paquet dans SDP (réponse à DESCRIBE dans RTSP) par exemple: a=fmtp:96 profile-level-id=245; config=000001B0F5000001B5891300000100000001200086C40FA28A021E0A21. Donc, si le flux ne change jamais, et vous obtenez ceci dans SDP, vous n'avez pas besoin de passer VOS au décodeur ... mais si vous le faites, il n'y a pas de mal. Le plan objet vidéo (I-VOP, P-VOP, B-VOP) commence par un entier 000001B6. Si vous définissez GOV length sur 10 et que la structure du flux est "IP", vous obtiendrez 1 I-Frame (I-VOP) et 9 P-VOP-s, mais tous auront le code de départ 000001B6. L'astuce pour les différencier est de vérifier les deux BITS suivants dans l'octet FIFTH.Consultez le tableau pour déterminer le type de VOP que vous obtenez:

    VOP_CODING_TYPE (binary) Coding method 
             00 intra-coded (I) 
             01 predictive-coded (P) 
             10 bidirectionally-predictive-coded (B) 
             11 sprite (S) 
    

Maintenant, pour décoder la vidéo, vous devez avoir envoyé au décodeur VOS, immédiatement suivi d'un I-VOP. Mais d'abord, votre façon d'extraire ces images du flux RTP est gênante ... Si I-VOP a une taille de 10000B et que votre MTU réseau est de 1400B, vous ne pouvez pas l'envoyer tel quel et ne pas encombrer le réseau. Ainsi, la caméra AXIS sépare les I-VOP et tous les autres cadres BIG en FRAGMENTS qu'elle envoie via RTP en tant que paquets RTP dont la taille ne dépasse pas MTU. L'idée principale est ce (par exemple):

  1. de Split 10000B dans MTU taille des fragments (pour 1400B MTU que vous obtenez à peu près 8x [1400B] et 1x [200B] fragments)
  2. Envoyer chacun avec RTP MARKER bit à 0
  3. Envoyer dernier fragment avec RTP BIT MARKER mis à 1 pour marquer le dernier fragment

maintenant, lorsque vous recevez, vous obtenez un peu l'idée, mais vous devez rétablir le cadre de 10Ko d'origine pour pour décodeur pour le décoder. Comme vous le faites, vous ne décodez que les premiers octets MTU d'une image beaucoup plus grande, et tous les autres fragments que vous envoyez au décodeur sont ignorés. Voilà pourquoi vous pouvez obtenir l'image merdique ...

Pour restaurer image d'origine:

  1. Recevez le paquet avec le code de démarrage 000001B6 ou 000001B0 et RTP MARKER bit à 0. Si le MARKER est réglé 1, c'est tout le cadre, et vous pouvez le décoder comme il est! Si c'est 0, plus de pièces suivent ...
  2. Placez le premier fragment tous les fragments qui suivent dans un tampon, jusqu'à ce que vous obteniez un avec MARKER BIT mis à 1. Lorsque vous obtenez le dernier fragment, placez-le dans un tampon .
  3. Votre tampon contient maintenant une trame entière que vous pouvez envoyer au décodeur!

Là, j'espère que j'ai aidé ... :)

Questions connexes