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/...

OriginalL'auteur chatoooo | 2012-02-12