en utilisant FFmpeg, comment décoder le H264 paquets
Je suis nouveau sur FFmpeg de la difficulté à décoder le H264 paquets qui peuvent être obtenus dans un tableau de u_int8_t.
Après de nombreuses enquêtes, je pense qu'il devrait être en mesure de simplement mettre le tableau dans un AVPacket comme ci-dessous
AVPacket *avpkt = (AVPacket *)malloc(sizeof(AVPacket) * 1);
av_init_packet(avpkt);
avpkt->data = ct; //ct is the array
avpkt->length =....
et décoder par avcodec_decode_video2(). Une partie du code est comme
...
codec = avcodec_find_decoder(CODEC_ID_H264);
gVideoCodecCtx = avcodec_alloc_context();
gFrame = avcodec_alloc_frame();
avcodec_decode_video2(gVideoCodecCtx, gFrame, &frameFinished, packet);
...
Je suppose que j'ai mis toutes les propriétés requises correctement, mais cette fonction retourne -1 🙁
Je viens de trouver le -1 est à venir à partir de
ret = avctx->codec->decode(avctx, image, got_picture_ptr, avpkt);
dans le avcodec_decode_video2();
En fait, ce que je me demande si je peut décoder le H264 paquets (sans en-tête RTP) par avcodec_decode_video2().
Merci pour l'aide à l'avance.
///////////ajouté
OK, je suis encore à essayer de trouver une solution. Ce que je fais maintenant, c'est le ci-dessous
** le flux H264 dans ce flux RTP est codée par FU-UN
- recevoir un paquet RTP
- de regarder si le deuxième octet de l'en-tête RTP est > 0, ce qui signifie qu'il est le premier paquet (et peut-être sera suivie)
- voir si le prochain paquet RTP a > 0, lors de sa deuxième octet aussi, alors cela signifie que l'image précédente a été une totale NALE du ou si c'est < 0, le paquet doit être jointe au paquet précédent.
- supprimer tous les RTP-tête des paquets de sorte qu'elle a seulement, comme FU indicateur | FU-tête | NAL
- essayer de jouer avec avcodec_decode_video2()
mais c'est seulement de retour -1..... suis-je censé supprimer FU indicateur et en-tête de trop??
toute suggestion sera très apprécié
merci d'avance.
OriginalL'auteur Jun | 2012-02-16
Vous devez vous connecter pour publier un commentaire.
Vous pouvez avoir besoin pour pré-traiter la RTP payload(s) (ré-assembler fragmenté NALUs, split agrégées NALUs) avant de passer NALE unités pour le décodeur si vous utilisez packetization modes autres que la seule unité NAL mode. La NALE des types d'unité (STAP, PAIM, FU) a permis dans le flux dépend de la packetization mode. Lire RFC 6184 pour plus d'info sur packetization modes.
Deuxièmement, alors que je ne suis pas familier avec FFMPEG, il pourrait être plus d'un général H. 264 décodage problème: vous devez toujours initialiser le décodeur avec le H. 264 séquence (SPS) et l'image des jeux de paramètres (PPS) avant d'être en mesure de décoder les autres images. Avez-vous fait?
Si ffmpeg ne fonctionne pas à la couche RTP vous devrez vous d'écrire ce code vous-même avant de passer à FFMPEG (c'est pas méchant) ou utiliser une autre 3ème partie de la bibliothèque. Live555 (www.live555.com) serait un Open Source LGPL bibliothèque qui gère les RTP, y compris H. 264 charge spécifique packetization, entre autres choses.
Je crois que la Seule NALE de l'unité en mode paquet est également une partie de la RFC6184 , reportez-vous à la section 5.6 de la RFC. Je ne suis pas sûr de savoir pourquoi vous dites qu'il ne nécessite pas l'en-tête RTP. Veuillez me corriger si je me trompe.
Merci, c'est vrai, je n'avais pas exprimé très bien. Mise à jour de réponse.
OriginalL'auteur Ralf
Je ne pense pas que vous serez en mesure de décoder le H264 paquets sans RTP-tête comme tout à fait un peu de vidéo en flux de l'information est intégrée dans le PRT des en-têtes. En même temps, je suppose qu'il est possible que tous les flux vidéo des renseignements peuvent être dupliqué dans le RTP paquets vidéo. Donc, il dépend de la façon dont le flux est généré.
Vibgyor
OriginalL'auteur Mukesh
C'est mon code de travail
OriginalL'auteur SourabhKus