Enregistrement de flux RTSP avec FFmpeg démultiplexeur
Je suis en train d'enregistrer des flux RTSP de l'Axe de la caméra avec FFmpeg démultiplexeur.
Je peux capturer de la vidéo à partir de fichiers et de les enregistrer dans un autre fichier, c'est OK. Mais la caméra envoie un étrange données, le FPS est de 100 et la caméra envoie tous les 4 image donc le résultat FPS est d'environ 25. Mais démultiplexeur ensemble des paquets dts/pts pour 90000 fps (par défaut?) et de nouveaux flux de fichier a 100fps. Résultat est une vidéo d'une heure avec seulement 100 images.
Voici mon code
#include <stdio.h>
#include <stdlib.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavformat/avio.h>
int main(int argc, char** argv) {
AVFormatContext* context = avformat_alloc_context();
int video_stream_index;
av_register_all();
avcodec_register_all();
avformat_network_init();
//open rtsp
if(avformat_open_input(&context, "rtsp://195.200.199.8/mpeg4/media.amp",NULL,NULL) != 0){
return EXIT_FAILURE;
}
if(avformat_find_stream_info(context,NULL) < 0){
return EXIT_FAILURE;
}
//search video stream
for(int i =0;i<context->nb_streams;i++){
if(context->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
video_stream_index = i;
}
AVPacket packet;
av_init_packet(&packet);
//open output file
AVOutputFormat* fmt = av_guess_format(NULL,"test2.avi",NULL);
AVFormatContext* oc = avformat_alloc_context();
oc->oformat = fmt;
avio_open2(&oc->pb, "test.avi", AVIO_FLAG_WRITE,NULL,NULL);
AVStream* stream=NULL;
int cnt = 0;
//start reading packets from stream and write them to file
av_read_play(context);//play RTSP
while(av_read_frame(context,&packet)>=0 && cnt <100){//read 100 frames
if(packet.stream_index == video_stream_index){//packet is video
if(stream == NULL){//create stream in file
stream = avformat_new_stream(oc,context->streams[video_stream_index]->codec->codec);
avcodec_copy_context(stream->codec,context->streams[video_stream_index]->codec);
stream->sample_aspect_ratio = context->streams[video_stream_index]->codec->sample_aspect_ratio;
avformat_write_header(oc,NULL);
}
packet.stream_index = stream->id;
av_write_frame(oc,&packet);
cnt++;
}
av_free_packet(&packet);
av_init_packet(&packet);
}
av_read_pause(context);
av_write_trailer(oc);
avio_close(oc->pb);
avformat_free_context(oc);
return (EXIT_SUCCESS);
}
Fichier résultat est ici: http://dl.dropbox.com/u/1243577/test.avi
Merci pour tous les conseils
Dans votre code, vous n', le premier de 100 images, est-ce destiné?
Quel est le format de la caméra ? Est-il h.264 ?
Voir aussi stackoverflow.com/questions/10715170/...
Quel est le format de la caméra ? Est-il h.264 ?
Voir aussi stackoverflow.com/questions/10715170/...
OriginalL'auteur chatoooo | 2012-02-12
Vous devez vous connecter pour publier un commentaire.
Voici comment je le fais. Ce que j'ai trouvé lors de la réception de H264, la fréquence d'images dans le flux de données n'est pas correcte. Il envoie 1/90000 base de temps. - Je me passer de l'initialisation du nouveau flux à partir des flux entrant et il suffit de copier certains paramètres. Les entrants r_frame_rate doit être exacte si max_analyze_frames fonctionne correctement.
j'ai eu la même erreur.. u ne reçois aucune solution alors s'il vous plaît nous aider à résoudre... merci d'avance
OriginalL'auteur Ryan Ayers
Je ne pense pas que vous êtes censé juste incrémenter le PTS valeur comme ça. Il peut travailler dans de rares occasions, la base de temps est juste, mais pour le cas général, ça ne marchera pas.
Vous devriez changer cela:
:
Ce qui n'est convertir le paquet PTS/DTS à partir des unités utilisées dans le flux d'entrée du codec pour les unités du flux de sortie.
Aussi, certains cours d'eau ont plusieurs tiques-frame par frame, donc si la vidéo fonctionne à double vitesse, vous pourriez avoir besoin pour ce droit au-dessous de la ligne ci-dessus:
OriginalL'auteur Ph0t0n
Mon expérience avec moderne H. 264 encodeur, je suis la recherche que la durée retourné par ffmpeg n'est qu'une "suggestion" et qu'il y a de "jitter" dans le PTS. La seule façon de déterminer avec précision le taux d'image ou la durée est de mesurer vous-même à l'aide de l'PTS valeurs.
Pour un H. 264 encodeur de course à 30fps, la durée est toujours signalé comme 3000/90000, tandis que mesuré la durée est généralement de +/- 1 mais périodiquement sauts dire 3000+25 un cadre et 3000-25 la prochaine. Je suis de lissage pour l'enregistrement par la constatation des images adjacentes à l'opposé de la déviation et en ajustant les PTS de la 2ème image, tout en préservant la durée totale.
Cette me donner un ruisseau avec une occasionnelle (calculé) durée de 30001 ou 2999, reflétant la dérive de l'horloge.
Lors de l'enregistrement d'un 29,97 i /s en flux, av_read_frame() retourne toujours une durée de 3 000, tandis que le nominal calculé la durée est 3003 (correct pour 29.97) avec la même gigue et de la dérive comme décrit ci-dessus.
Dans mon cas, je viens de construire une machine d'état pour nettoyer le moment. En espérant que cela aide quelqu'un.
OriginalL'auteur Steve Sisak
Récemment fait de même. J'avais FPS deux fois plus faible que la caméra envoyé. La raison en est dans AVstream->codec->ticks_per_frame champ, la valeur 2. Ma source a été progressive, et dans le cas de la vôtre, en interleaved - c'est peut-être une raison encore d'un facteur de 2, donnant 4x différents FPS.
90000 Hz est la valeur par défaut de temps de base pour les flux vidéo envoyé via RTSP. La base de temps est différente de FPS en résolution. Par exemple, un cadre avec horodatage 30000 sera montré à 1/3 de secondes, si la base de temps est de 90000 Hz. La base de temps doit être mis dans le AVstream de la structure au cours de la sortie, mais AVFormatContext doit avoir une réelle valeur de FPS.
OriginalL'auteur Tosha