Problème de Décoder de la vidéo H264 sur RTP avec ffmpeg (libavcodec)

J'ai mis profile_idc, level_idc, extradata et extradata_size de AvCodecContext avec le profil de-niveau-id et sprop-paramètre de la SDP.

J'ai séparé le décodage de Codé Tranche, SPS, PPS et NAL_IDR_SLICE paquet :

Init:

u_int8_t start_sequence[]= {0, 0, 1};
int taille= recv(id_de_la_socket,(char*) rtpReceive,65535,0);

Codé Tranche :

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;

Résultat: ConsumedBytes >0 et GotPicture >0 (souvent)

SPS et PPS :

un code identique.
Résultat: ConsumedBytes >0 et GotPicture =0

C'est normal je pense

Quand je trouve un nouveau couple SPS/PPS, je l'ai mise à jour extradata et extrada_size avec les charges de ce paquet et leur taille.

NAL_IDR_SLICE :

Le dernier type d'unité est 28 =>idr Cadre sont fragmentés à cet effet que j'ai essayé deux méthode pour décoder

1) je préfixe le premier fragment (sans en-tête RTP) avec la séquence 0x000001 et de l'envoyer à avcodec_decode_video. Puis-je envoyer le reste des fragments de cette fonction.

2) j'ai préfixe le premier fragment (sans en-tête RTP) avec la séquence 0x000001 et concaténer le reste de fragments. J'envoie ce mémoire tampon de décodeur.

Dans les deux cas, je n'ai pas d'erreur (ConsumedBytes >0) mais je n'ai décelé aucun cadre (GotPicture = 0) ...

Quel est le problème ?

Commentaire de la part de l'ffmpeg liste de diffusion ?
Pourquoi 0x000001? C'est h264 pas MPEG4.
Lire ma réponse encore une fois, je lui ai expliqué certaines choses qui pourraient vous concerner.

OriginalL'auteur bben | 2010-08-16

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *