2013-12-11 3 views
0

Я довольно смущен тем, как сохранить видеопоток в файл mp4. Я использую ffmpeg. Позвольте мне объяснить проблему:Сохранение кадров с сетевой камеры (RTSP) в файл mp4

  1. Я подключиться к сетевой камере через RTSP (H.264 поток) с avformat_open_input(), avformat_find_stream_info(), av_read_play(), и я получаю кадры с av_read_frame().
  2. Каждый раз, когда я получаю кадр с av_read_frame(), я сохраняю соответствующий AVPacket в круговом буфере.
  3. В некоторых случаях в моем приложении выбран диапазон этого кругового буфера. Я нахожу ключевой кадр, используемый для начала.
  4. Как только у меня есть список AVPacket, начинающийся с ключевого кадра, я пишу заголовок, фреймы и хвост, как я описал ниже в коде.

Проблема заключается в том, что получаемое видео mp4 имеет артефакты, если я пытаюсь посмотреть его с помощью VLC, Windows Media Player или другого.

Я также понял, что точки этих пакетов не являются непрерывными, а dts - непрерывными. Я знаю о кадрах B, но это проблема в моем случае?

// Prepare the output 
AVFormatContext* oc = avformat_alloc_context(); 
oc->oformat = av_guess_format(NULL, "video.mp4", NULL); 

// Must write header, packets, and trailing 
avio_open2(&oc->pb, "video.mp4", AVIO_FLAG_WRITE, NULL, NULL); 

// Write header 
AVStream* stream = avformat_new_stream(oc, (AVCodec*) 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); 

// FOR EACH FRAME... 
... av_write_frame(oc, circular[k]); ... 

// Write trailer and close the file 
av_write_trailer(oc); 
avcodec_close(stream->codec); 
avio_close(oc->pb); 
avformat_free_context(oc); 

Спасибо большое,

+0

Вы можете посмотреть rtmpdump для справки (или даже просто использовать librtmp напрямую) - http://rtmpdump.mplayerhq.hu/ – benjymous

ответ

-1

Во-первых: при работе с камерой, то лучше работать через RTP через TCP (TCP в качестве транспортного протокола). Чтобы включить эту функцию:

AVDictionary *ifmtdict; 
av_dict_set(&ifmtdict, "rtsp_transport", "tcp", 0); 
... 
avformat_open_input (..., &ifmtdict); 

Второе: После пакеты начинают приходить, ждать первого ключевого кадра и начать запись в файл с этого момента.

+0

также я пишу много видеопотоков со многих IP-камер. все хорошо :) Извините за мой английский. – Eugene

 Смежные вопросы

  • Нет связанных вопросов^_^