begin process at 2012 05 28 19:51:27
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Compression, Split & Cryptage

 > 

Décodage de vidéo H264 sur RTP avec ffmpeg (libavcodec)


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Décodage de vidéo H264 sur RTP avec ffmpeg (libavcodec)

lundi 16 août 2010 à 13:16:25 | Décodage de vidéo H264 sur RTP avec ffmpeg (libavcodec)

bbenator

J'ai un peu avancé sur la question mais le décodage global ne fonctionne pas.

Tout d'abord, j'ai récupéré quelques données du SDP que j'avais oublié (profile-level-id et sprop-parameter-set) afin d'alimenter les champs profile_idc, level_idc, extradata et extradata_size de ma structure AvCodecContext.

Ensuite j'ai séparé le décodage des paquets dits Coded Slice, SPS, PPS et NAL_IDR_SLICE.

Pour faire simple, les paquets Coded Slice allégés du header RTP sont directement passés au décodeur (avcodec_decode_video) avec le préfixe 0x000001. La fonction me renvoie bien la taille du paquet ConsumedBytes (indique que tous les bytes ont été utilisés pour le décodage) et le paramètre GotPicture indiquant que la frame est bien décodée devient supérieur à zéro à la suite du décodage.


Code C/C++ :
     uint8_t start_sequence[]= {0, 0, 1};
       int size= recv(id_de_la_socket,(char*) rtpReceive,65535,0);


       char *z = new char[size-16+sizeof(start_sequence)];
	memcpy(z,&start_sequence,sizeof(start_sequence));
	memcpy(z+sizeof(start_sequence),rtpReceive+16,size-16);
	ConsumedBytes = avcodec_decode_video(codecContext,pFrame,&GotPicture,(uint8_t*)z,size-16+sizeof(start_sequence));
	delete z;



Les paquets SPS et PPS subissent les mêmes instructions. Cependant, le &GotPicture reste à zéro ce qui est normal.

A chaque fois qu'un nouveau couple SPS/PPS est trouvé, j'actualise les champs extradata et extradata_size de mon AvCodecContext. Cela devrait normalement me permettre de décoder ma prochaine Idr frame ...


Mes iDR Frame sont fragmentés selon le type FU-A. J'ai donc tenté deux méthodes pour les décoder :
1) à chaque fragment ayant le start_bit à 1, je lui préfixe la séquence 0x000001 et l'envoie à avcodec_decode_video. J'envoie le reste des fragments FU-A jusqu'au paquet ayant le end_bit =1.

2) je préfixe la séquence 0x000001 au premier paquet FU-A et lui concatène ensuite tous les autres fragments arrivant. Une fois de dernier fragment arrivé, j'envoie cette chaîne au décodeur.


Dans les deux cas la fonction ne me renvoie pas d'erreurs (ConsumedBytes >0) cependant elle ne détecte aucune frame (GotPicture reste à zéro).


Avez-vous des idées ? Qu'est-ce que je règle mal ? Quelle autre méthode puis-je employer ?

Merci d'avance

mardi 17 août 2010 à 19:07:29 | Re : Décodage de vidéo H264 sur RTP avec ffmpeg (libavcodec)

slist

Bonjour,

Je suis sur le même problème que toi.
Comment est-ce que tu construits extradata et extradata_size ?

Steph
mardi 17 août 2010 à 19:08:50 | Re : Décodage de vidéo H264 sur RTP avec ffmpeg (libavcodec)

slist

Et sinon, j'ai 12 et pas 16 comme taille d'en tete RTP.
mercredi 18 août 2010 à 11:05:10 | Re : Décodage de vidéo H264 sur RTP avec ffmpeg (libavcodec)

bbenator

RTP header according to RFC 3550
Code ActionScript :
       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |V=2|P|X|  CC   |M|     PT      |       sequence number         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                           timestamp                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |           synchronization source (SSRC) identifier            |
      +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
      |            contributing source (CSRC) identifiers             |
      |                             ....                              |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


V+P+X+CC =1 byte
M+PT = 1byte
sequence number= 2 bytes
timestamp= 4bytes
SSRC=4 bytes
CSRC = 4 bytes

=> 16bytes

Le CSRC n'est pas toujours présent en RTP, si tu ne l'a pas, c'est normal que la taille de ton header RTP soit 12bytes.


J'ai fais mon propre parser de SDP. Pour remplir les extradata et extradata size à partir du SDP j'utilise un bout de code issu de ffmpeg : lien.

Ensuite je les actualise lorsque je reçois un nouveau couple de nal 7 et 8 (PPS et SPS).

En gros soit bufPPS (resp bufSPS) le payload PPS (resp SPS) allégé du header RTP et du premier byte (F|NRI|type ).

extradata_size= taille(bufPPS) + taille (bufSPS) + 2* taille (startcode)
extradata = startcode + bufSPS + startcode + bufPPS


J'ai trouvé cette méthode sur plusieurs projet mais elle ne fonctionne pas vraiment pour le mien puisque lors du décodage de mes idr frame, j'obtiens l'erreur "sps_id out of range" générée par la fonction ff_h264_decode_seq_parameter_set(H264Context *h).

Voilà, et toi quelle est ta méthode ?
mercredi 18 août 2010 à 13:37:26 | Re : Décodage de vidéo H264 sur RTP avec ffmpeg (libavcodec)

bbenator

Pour les extradatas, ma méthode est expliquée sur ce site : [ Lien ]
vendredi 20 août 2010 à 11:52:40 | Re : Décodage de vidéo H264 sur RTP avec ffmpeg (libavcodec)

bbenator

Je viens de résoudre une première erreur : ffmpeg stocke le SPS et PPS du SDP dans le format avcC et je lui passais dans le format Nal-Unit.

Ainsi, mon extradata devient :

01 42 00 1e ff e1 00 12 67 42 00 1e e2 90 16 02 4d 81 27 05 01 05 e1 e2 44 54 01 00 06 68 ce 3c 80 00 00

Celui-ci est décodé lors de l'affectation du codec (avcodec_open(codecContext, codec) appelle ff_h264_decode_init qui appelle ff_h264_decode_extradata) et aucune erreur n'est retournée.

Par la suite, lorsque je décode mes paquets arrivant, j'obtiens l'erreur suivante à chaque fois que avcodec_decode_video est appelée :

[h264 @ 00334fe0]AVC: nal size nombre

le nombre étant très grand (8 chiffres).

De plus, lorsque que je veux décoder des NAL_IDR_SLICE (nal de type 5), j'ai en plus l'erreur suivante:

[h264 @ 00334fe0]sps_id out of range


Voilà, si vous avez une idée pour résoudre cela, n'hésitez pas.
samedi 21 août 2010 à 11:08:45 | Re : Décodage de vidéo H264 sur RTP avec ffmpeg (libavcodec)

slist

Salut,

Moi j'essaye de décoder le flux h264 d'une caméra IP.

D'après le projet suivant, il n'y a aucune trame h264 !
http://sourceforge.net/projects/h264bitstream/

Et pourtant, vlc arrive bien à lire le flux de la caméra.

Voilà le contenu du SDP vidéo pour la caméra :

a=fmtp:96 packetization-mode=1; profile-level-id=420029;
sprop-parameter-sets=Z0IAKeNQFAe2AtwEBAaQeJEV,aM48gA==
lundi 23 août 2010 à 11:51:14 | Re : Décodage de vidéo H264 sur RTP avec ffmpeg (libavcodec)

bbenator

Ce projet est un 'lecteur de NALU'. Pour pouvoir le faire fonctionner, il faut que tu reconstitues les NALUs en mettant 0x000001 ou 0x00000001 devant chacune d'elles.

Cependant ce projet n'est pas un décodeur H264 : il donne juste les données utiles au fur et à mesure de la lecture, non ?
lundi 23 août 2010 à 18:41:22 | Re : Décodage de vidéo H264 sur RTP avec ffmpeg (libavcodec)

slist

Mon projet est open source, tu peux le trouver ici :
http://slist.lilotux.net/linux/qipcam/

Le but, c'est d'afficher et d'enregistrer le flux video de ma camera IP Axis M1031-W en H264.
C'est en QT, il faut donc faire :

qmake
make
./qIpCam
mardi 24 août 2010 à 09:37:33 | Re : Décodage de vidéo H264 sur RTP avec ffmpeg (libavcodec)

bbenator

je n'utilise pas QT mais je peux déjà te dire quelques trucs :



  • le profile IDC et level IDC doivent être stockés en base 10 (là ils sont en base 16) ainsi ton profile_idc= 66 et level_idc=41 (j'ai les mêmes valeurs)


  • Pour le décodage du sprop_parameter, je te conseille d'aller voir la fonction sdp_parse_fmtp_config_h264. Cela te donnera une idée pour décoder cette partie du sdp. Ensuite, je construis une nal avcC (voir le site que je t'ai joins pour construire les extradatas): j'utilise la fonction ff_isom_write_avcc(ByteIOContext *pb, const uint8_t *data, int len)



1 2

Cette discussion est classée dans : start, size, sequence, décodage, extradata


Répondre à ce message

Sujets en rapport avec ce message

Liste Chainé en C++... [ par NitRic ] Bonjour, j'aimerais si possible un petit exemple ou bien un site qui parle des Liste Chainé en C++, pour la créée c'est ok mais c avec le fonctionneme Pb avec DRAWTEXTW [ par BULBY ] Bonjour, J'essaye de faire un tout petit programme qui affiche une chaine de caractère en japonais (unicode). Avec la fonction TextOutW, pas de problè Palindrome et espaces [ par TheRecliner ] Bonjour,je dois faire petit programme qui détécte si un phrase est un plaindrome ou non....j'ai bien résussi à faire cette détection mais uniquement p Operation sur les dossier [ par Cesar4 ] Salut j'aimerais savoir comment cree un dossier le renomer et le suprimerMerci @+ C'est quoi float !!!? [ par ATH|500| ] Je voudrais savoir à quoi sert la commande:floatExemple: float j; lancer un programme :: erreur !!! [ par FLOPPY ] je voudrais savoir que me renvoie ShellExecute(NULL, NULL,"progalancer.exe", NULL, NULL, SW_HIDE)en cas d'erreurmerci d'avance !:D merci de m'aider borland 5.01 [ par hell ] Bonjour à vous tous, j'ai le logiciel de borland 5.01 pour faire de la programmation en c++ . Je voudrais savoir pourquoi lorsque je clique sur run lo C++ [ par ticul ] Votre texte ICIVotre texte ICI Bonne Année [ par coockiesch ] Juste le temps d'un message, Laisser de coté tous les problèmes, Laisser de coté ces fichues machines...BONNE ANNEE A TOUTES ET A TOUS<img src=/imgs2/ ms-dos, base de registre et c++ [ par retaks666 ] jiamerai conaitre els commandes pour acceder a la base de registres windows.. koment lire, créer, modifeir des valeurs et comment inclure des commmadn


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales